您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页超声波测距仪课程设计说明书 精品

超声波测距仪课程设计说明书 精品

来源:爱go旅游网


长 沙 学 院

《单片机原理及应用》

课程设计说明书

题系

(

目 )

超声波测距仪

电信系 电气一班 周鹏 2010042113 刘辉、王新辉 2013.6.10—6.21

专业(班级) 姓学指起

名 号

导止

教日

师 期

《单片机原理及应用》课程设计任务书21

系(部):电信系 专业:2010级电气工程 指导教师:王新辉、刘辉

课题名称 超声波测距仪设计 设计内容及要求 (1)课题内容:设计一个以 STC89C52单片机为核心控制的超声波测距仪。功能要求: 1.测量距离范围要求为0.10~5.00m;2.测量精度为1cm;3.用12864液晶屏显示相关信息,液晶屏的第一行显示“超声波测距仪”,第二行显示设计者姓名和学号,第三行显示测量的距离值。 (2)要求:完成该系统的硬件和软件的设计,用单片机开发板进行验证。最后就课程设计本身提交一篇课程设计说明书。 设计工作量 1、汇编或C51语言程序设计; 2、程序调试; 3、在单片机开发板上进行下载调试; 4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、调试过程,参考文献、设计总结等。 起止日期(或时间量) 设计内容(或预期目标) 课题介绍,答疑,收集材料,C51介绍 设计方案论证,练习编写C51程序 程序设计 程序调试、仿真 系统测试并编写设计说明书 年 月 日 年 月 日 备注 进度安排 第一天 第二天 第三天~第六天 第六天~第八天 第九天~第十天 教研室 意见 系(部)主管领导意见

长沙学院课程设计鉴定表

姓名 学号 专业 班级 指导教师 设计题目 指导教师意见: 评定等级: 教师签名: 日期: 答辩小组意见: 评定等级: 答辩小组长签名: 日期: 教研室意见: 教研室主任签名: 日期: 系(部)意见: 系主任签名: 日期: 说明

课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;

目 录

摘 要 ........................................................................................................................... 2 1、基本原理 ................................................................................................................. 3 2、方案论证 ................................................................................................................. 3 3、系统硬件设计 ......................................................................................................... 3 3.1 STC89C52外围电路设计 ................................................................................ 4 3.2 超声波测距模块电路设计 ........................................................................... 5 3.3 显示电路设计 ................................................................................................. 7 4、系统软件设计 ......................................................................................................... 7 4.1 系统软件设计说明 ......................................................................................... 7 4.2编程语言的选择 .............................................................................................. 8 4.3超声波测距仪的算法设计 .............................................................................. 8 4.4 超声波发生子程序和超声波接收中断程序设计 ......................................... 8 4.5 显示子程序设计 ............................................................................................. 9 4.6主程序流程图 .................................................................................................. 9 5、设计结果及分析 ..................................................................................................... 9 6、使用说明 ............................................................................................................... 11 7、课程设计体会 ....................................................................................................... 11 参考文献 ..................................................................................................................... 12 附录:程序清单 ......................................................................................................... 13

1

摘 要

由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到日常使用的要求。

超声波测距仪,可应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。 本设计的超声波测距仪利用超声波传输中距离与时间的关系,采用以STC89C52单片机为核心进行控制及数据处理,最终完成超声波测距仪的硬件电路和软件设计。该测距仪主要由超声波发射器电路、超声波接收器电路、单片机控制电路、系统电源电路及LCD12864显示电路构成。整个程序采用模块化设计,由主程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距器的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。

关键词:超声波;STC89C52;LCD12864;测距

2

1、基本原理

超声波传感器的工作原理是陶瓷的压电效应。超声波传感器在测量过程中,超声测距器是根据超声波遇到障碍物反射回来的特性进行测量的。超声波发射器向某一方向发射超声波,在发射同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即中断停止计时。 通过不断检测产生波发射后遇到障碍物所反射的回波,从而测出发射超声波和接收到回波的时间差△T,然后求出距离L。

基本的测距公式为:

S=(△T/2)*V

式中 S——被测距离;

△T——发射波和反射波之间的时间间隔; V——超声波在空气中的声速,常温下取为340m/s 。 声速确定后,只要测出超声波往返的时间,即可求得S 。

2、方案论证

超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。

超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器,用LCD12864显示测量距离。

测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。

超声波接收 LCD12864显示 STC89C52 超声波发射 图2.1 超声波测距器系统设计框图

扫描驱动 本设计通过按键扫描是否启动测距,然后控制单片机发出一个脉冲是超声波发生器产生超声波,等到反射的回波数据被超声波接收器接收后送给单片机处理,最后在LCD液晶屏上显示测距结果。

3、系统硬件设计

硬件电路的设计主要包括单片机系统及显示电路、超声波测距电路三部分。单片机采用STC89C52,采用12MHz高精度的晶振,以获得稳定时钟频率,减小测量误差。单片机用P1.0端口输出超声波换能器

3

所需的触发信号,利用外中断0口(P3.2)监测超声波接收电路输出的返回信号。显示电路采用LCD12864显示屏。

3.1 STC89C52外围电路设计

STC89C52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

单片机STC89C52作为主控芯片,控制整个电路的运行。单片机外围需要一个复位电路,复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。该设计在电源电压瞬间下降时可以使电容迅速放电,可令系统可靠复位。

图3.1 单片机复位电路

STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。这个反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。

外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。如果使用石英晶体,电容应该使用30pF。

还可以使用外部时钟。这种情况下,外部时钟脉冲接XTAL1端,即内部时钟发生器的输入端, XTAL2应悬空。

由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大低电平持续时间应符合产品技术条件的要求。

时钟电路的核心就是一个晶振,常用的晶振频率有6MHZ、12MHZ,51单片机最大的晶振频率为 20MHZ。由于单片机的机器周期为晶振周期的12分频,故一般选用12MHZ的晶振,此时恰好得到的机器周期为1us。

4

图3.2 时钟电路

图3.3单片机最小系统实物图

3.2 超声波测距模块电路设计

这一部分采用DYP-ME007超声波测距模块。

DYP-ME007超声波测距模块可提供 3cm--3.5m的非接触式距离感测功能,图1为DYP-ME007外观,包括超声波发射器、接收器与控制电路。其基本工作原理为给予此超声波测距模块一触发信号后发射超声波,当超声波投射到物体而反射回来时,模块输出一回响信号,以触发信号和回响信号间的时间差,来判定物体的距离。

图3.4 DYP-ME007超声波测距模块

5

DYP-ME007电气参数:

模块接线:

使用上只需要 5V 电源供应、0V 地 线连接、触发信号输入、与回响信号输出 等四支接脚。 注:

此模块不宜带电连接,若要带电连接, 则先让模块的 GND 端先连接,否则会 影响模块的正常工作。

图3.5 DYP-ME007模块接线图

模块时序图:

图3.6 超声波模块时序图

6

电气参数 DYP-ME007 超声波模块 工作电压 工作电流 工作频率 最远射程 最近射程 输入触发信号 输出回响信号 规格尺寸 DC 5V 15mA 40Hz 3.5m 3cm 10uS 的 TTL 脉冲 输出 TTL电平信号,与射程成比例 45*20*15mm 你只需要提供一个短期的 10uS 脉冲触发信号。该模块内部将发出 8 个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号是一个脉冲的宽度成正比的距离对象。可通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: uS/58=厘米或者 uS/148=英寸。建议测量周期为 60ms以上,以防止发射信号对回响信号的影响.

3.3 显示电路设计

本设计采用的是无字库的LCD12864液晶屏显示模块。

图3.7 12864硬件连接图

VCC和GND是最基本的电源,一般接5V即可,还有就是关于VEE以及VL(很多种屏称作V0,不过都一样了),一般接法如上图所示即可,当LCD与单片机接线以及电源供给完毕以后,需要调节可变电阻的阻值,可以说这个决定了液晶屏是否显示。只有阻值在特定的位置区域以内才会显示。最后就是关于BL+和BL-了,这个是液晶屏的背光,一般直接接在VCC和GND上,当然加小电阻限流同时可以使用DA或者普通的IO口来控制会更好。

4、系统软件设计

4.1 系统软件设计说明

进行测量控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个测量对象的实际需要设计应用程序。因此,软件设计在微机测量控制系统设计中占重要地位。对于本系统,软件设计更为重要。

在单片机测量控制系统中,大体上可分为数据处理、过程控制两个基本类型。数据处理包括:数据的采集、数字滤波、标度变换等。过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便达到测量控制目的。

本软件设计主要是对距离进行测量、显示。因此,整个软件可分为按照硬件电路对单片机位定义;发射子程序;接收子程序;显示子程序;延时子程序等。

7

4.2编程语言的选择

本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。在单片机的应用系统程序设计时,常用的是汇编语言和C语言。汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高,而且执行速度快。但是不同的CPU,其汇编语言可能有所差异,即依赖于计算机硬件,程序可读性和可移植性比较差。

C语言是编译型程序设计语言,兼顾高级语言的特点,并具备汇编语言的功能。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构。C语言执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。基于C语言的众多优点本设计选择此语言来编程。

4.3超声波测距仪的算法设计

图3.2.1示意了超声波测距的原理,即超声波发生器T在某一时刻发出一个超声渡信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。

距离的计算公式为:

S=L/2=(V×△T)/2

其中,S 为被测物与测距仪的距离,L为声波的来回的路程,V为声速,△T为声波来回所用的时间。

图4.1 超声波测距原理图

在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。

4.4 超声波发生子程序和超声波接收中断程序设计

超声波发生子程序的作用是通过P2.6端口发送1个超声波启动信号,脉冲宽度为10μs左右,同时把计数器T0打开进行计时。超声波发生子程序较简单,但要求程序运行准确,所以采用C语言编程。 超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,此次测距不成功。

8

4.5 显示子程序设计

LCD12864液晶显示屏有其自身的控制编程方法,我们只需要按照其方法编程就能显示出我们想要的字符和图形。

本次使用的液晶是不带字库的,所以需要使用提取字模软件来提取显示所需的16*16点阵信息。

4.6主程序流程图

5、设计结果及分析

设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波

9

方法测量物体间的距离,以数字的形式显示测量距离。

超声波测距器的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。 超声波测距的算法设计原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。

硬件电路在使用的时候测距不太稳定,液晶屏显示有时候会不清晰。原因是液晶屏的两个背光脚没有接电阻就直接接在了电源和地上面。并且我连接所用的杜邦线也不太稳定。

图5.1 软件仿真结果

10

图5.2 硬件仿真结果

6、使用说明

它的硬件电路的设计主要包括单片机系统及显示电路、系统电源、超声波发射电路和超声波检测接收电路四部分。单片机采用STC89C52,采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用P2.6端口输出超声波换能器所需的触发信号,利用外中断0口监测超声波接收电路输出的返回信号。显示电路采用LCD12864液晶屏,实现测距,并且在液晶屏上显示距离。

使用时只需要按下启动键就可以开始测距,如果测距成功就会在液晶屏上显示相应的距离的数值,否则将不显示。

7、课程设计体会

做硬件的设计制作与焊接的时候,并没有遇到太多问题,只是用杜邦线的连接的地方出了些毛病,以致不能显示的很清晰,这一块儿主要是得耐心细致。需要注意各个输入、输出引脚,因为每个引脚都是不一样的,只有让各个引脚互相对应,才能得出准确的结果,任何一点小的误差都不可能得出正确的运行结果。

写程序倒是基本上没什么难度,逻辑思维强一点就好了。

回顾起此次单片机课程设计,我仍感慨颇多,的确,在这两个星期中,可以说得是苦多于甜,但是可以学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 很郁闷的就是帮别人修改了好些程序,结果都符合要求,但自己却是最后一个验收的,尽管我需要做实物,却也没这么难吧!但我还是坚持到了最后,虽然做出来的实物还是有些不尽如人意,却也能基本符合要求了,也算给了我一些安慰。

同时,特别感谢刘老师和王老师在这两个星期里陪伴着我们,帮我们解决一些疑难杂症。谨在此特别鸣谢。

11

参考文献

1、[8] 曾屹.单片机原理与应用[M].长沙:中南大学出版社,2009,1~335

2、[9] 郭天祥.新概念51单片机C语言教程.入门、提高、开发[EB/OL].http://www.Phei.com.cn

3、[8] Pual Scherz.发明者电子设计宝典[M].福建:福建地质印刷厂,2004,1~505

12

附录

程序清单:

#include #include #include #include

#define LCD_databus P1 #define uint unsigned int #define uchar unsigned char

sbit EN=P2^2; sbit RS=P2^0; sbit RW=P2^1; sbit CS2=P2^3; sbit CS1=P2^4;

sbit pulse=P2^6; sbit Echo=P3^2; sbit key=P2^7;

bit succeed_flag; uint s;

uchar ge,shi,bai,outcomeH,outcomeL ; //自定义变量

unsigned char code E[][16]={

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//\"0\" 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//\"1\" 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//\"2\" 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//\"3\" 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//\"4\" 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//\"5\" 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//\"6\" 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//\"7\" 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//\"8\" 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//\"9\"

//测量成功标志

//产生脉冲引脚 //回波引脚

//启动发射引脚

//LCD12864的8位数据口

13

0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//\"c\" 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//\"m\" };

uchar code HZ[][32]={

/*超 CB3AC */

0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00, 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,

/*声 CC9F9 */

0x04,0x14,0xD4,0x54,0x54,0x54,0x54,0xDF,0x54,0x54,0x54,0x54,0xD4,0x14,0x04,0x00, 0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,

/*波 CB2A8 */

0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00, 0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,

/*测 CB2E2 */

0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00, 0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,

/*距 CBEE0 */

0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x02,0x00, 0x20,0x3F,0x20,0x1F,0x11,0x11,0x00,0x7F,0x44,0x44,0x44,0x44,0x44,0x47,0x40,0x00,

/*仪 CD2C7 */

0x00,0x80,0x60,0xF8,0x07,0x00,0x1C,0xE0,0x01,0x06,0x00,0xE0,0x1E,0x00,0x00,0x00, 0x01,0x00,0x00,0xFF,0x00,0x80,0x40,0x20,0x13,0x0C,0x13,0x20,0x40,0x80,0x80,0x00,

/*周 CD6DC */

0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00, 0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,

/*鹏 CC5F4 */

0x00,0xFE,0x22,0xFE,0x00,0xFE,0x22,0xFE,0x00,0xFC,0x16,0x25,0x84,0xFC,0x00,0x00, 0x60,0x1F,0x22,0xBF,0x40,0x3F,0x82,0xFF,0x00,0x13,0x12,0x12,0x52,0x82,0x7E,0x00,

/*: CA3BA */

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

14

/*离 CC0EB */

0x04,0x04,0x04,0xF4,0x84,0xD4,0xA5,0xA6,0xA4,0xD4,0x84,0xF4,0x04,0x04,0x04,0x00, 0x00,0xFE,0x02,0x02,0x12,0x3A,0x16,0x13,0x12,0x1A,0x32,0x42,0x82,0x7E,0x00,0x00, };

void delay_10us(uint n) //延时n个10us {

uint i; for(i=n;i>0;i--) {

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); } }

void Read_busy() { }

void write_LCD_command(uchar value) //写命令函数 {

Read_busy(); RS=0;

RW=0; LCD_databus=value; EN=1; _nop_(); _nop_(); EN=0; }

void write_LCD_data(uchar value)//写数据函数 {

Read_busy();

15

//读“忙”函数--数据线的最高位D7为1则忙

P0=0x00; RS=0; RW=1; EN=1;

while(P0 & 0x80); EN=0;

//对LCD的每次读写都要读忙 //选择命令 //读操作

//EN由1----0锁存有效数据

RS=1; RW=0;

//选择数据

LCD_databus=value; EN=1; _nop_(); _nop_(); EN=0; }

void Set_page(uchar page) { }

void Set_line(uchar startline) //设置显示的起始行 { }

void Set_column(uchar column) //设置显示的列 { }

void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示 { }

void SelectScreen(uchar screen) //选择屏幕 {

//EN由1----0锁存有效数据

//设置“页”LCD12864共8页,一页是8行

//页的首地址为0xB8

page=0xb8|page;

write_LCD_command(page);

startline=0xC0|startline; //起始行地址为0xC0

write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示

column=column &0x3f; //列的最大值为64 column= 0x40|column; //列的首地址为0x40 write_LCD_command(column); //规定显示的列的位置

onoff=0x3e|onoff; //onoff:1---开显示;0---关显示 write_LCD_command(onoff);

switch(screen)

case 0: CS1=0;CS2=0;break; //全屏 case 1: CS1=0;CS2=1;break;//左半屏 case 2: CS1=1;CS2=0;break;//右半屏 default:break;

16

{

} }

void ClearScreen(uchar screen) //清屏函数 { }

void init_LCD() //LCD的初始化 { }

void Display_ASCII(uchar screen,uchar page,uchar column,uchar a[][16],uchar h)//字符显示 {

uchar i,j;

SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏 for(i=0;i<8;i++) //控制页数0-7,共8页 {

Set_page(i); Set_column(0);

for(j=0;j<64;j++) //控制列数0-63,共64列 { }

write_LCD_data(0x00); //写入0,地址指针自加1

}

ClearScreen(0); //清屏 SetOnOff(1); //开显示 SelectScreen(0); //选屏 Set_line(0); //开始行:0

uchar i;

SelectScreen(screen); Set_page(page); Set_column(column*8);

for(i=0;i<8;i++) //显示字符上半部分:8*8 {

write_LCD_data(*(a[h]+i)); }

Set_page(page+1); //显示字符下半部分:8*8 Set_column(column*8); for(i=0;i<8;i++) {

17

}

}

write_LCD_data(*(a[h]+i+8));

void Display_HZ(uchar screen,uchar page,uchar column,uchar a[][32],uchar h) //汉字显示 { } void disp() {

uchar i;

SelectScreen(screen);

Set_page(page); //写上半页:16*8 Set_column(column*16); //控制列

for(i=0;i<16;i++) //控制16列的数据输出 {

write_LCD_data(*(a[h]+i)); //汉字的上半部分 }

Set_page(page+1); //写下半页:16*8 Set_column(column*16); //控制列 for(i=0;i<16;i++) //控制16列的数据输出 {

write_LCD_data(*(a[h]+16+i)); //汉字的下半部分 }

Display_HZ(1,0,0,HZ,0); Display_HZ(1,0,1,HZ,1); Display_HZ(1,0,2,HZ,2); Display_HZ(1,0,3,HZ,3); Display_HZ(2,0,4,HZ,4);

Display_HZ(2,0,5,HZ,5);//第一行显示“超声波测距仪\"

Display_HZ(1,2,0,HZ,6); Display_HZ(1,2,1,HZ,7); Display_HZ(1,2,2,HZ,8);//周鹏:

Display_ASCII(1,2,6,E,2); Display_ASCII(1,2,7,E,0); Display_ASCII(2,2,0,E,1); Display_ASCII(2,2,1,E,0); Display_ASCII(2,2,2,E,0); Display_ASCII(2,2,3,E,4); Display_ASCII(2,2,4,E,2);

18

}

Display_ASCII(2,2,5,E,1); Display_ASCII(2,2,6,E,1);

Display_ASCII(2,2,7,E,3);//2010042113

Display_HZ(1,4,0,HZ,4); Display_HZ(1,4,1,HZ,9); Display_HZ(1,4,2,HZ,8);

Display_ASCII(2,4,4,E,10); Display_ASCII(2,4,5,E,11);//cm

//距离:

void csbfsq() //超声波发生器 { }

void distance() { }

void dingshiqi() {

if(key==0) { } TR0=1;

delay_10us(1); if(key==0) { }

pulse=1; delay_10us(1);

pulse=0; //产生一个10us的脉冲,在pluse引脚

//距离计算

uint t;

t=outcomeH*256+outcomeL; s=(172*t)/100; bai=s/100; s=s%100; shi=s/10; ge=s%10;

//中断及定时器0初始化

TMOD=0X01;

19

}

TH0=0; TL0=0; EA=1; ET0=1; EX0=1; IT0=1;

void main(void) { }

init_LCD(); disp(); dingshiqi(); csbfsq();

//主程序

while(Echo==0); if(succeed_flag==1) { }

distance();

Display_ASCII(2,4,0,E,bai); Display_ASCII(2,4,1,E,shi); Display_ASCII(2,4,2,E,ge);

void T_0() interrupt 1 //定时器0中断 { }

void INT_0() interrupt 0 //外部中断0,回波处理 {

TR0=0; ET0=0; TH0=0; TL0=0;

TR0=0; EX0=0; ET0=0; EA=0;

outcomeH=TH0; outcomeL=TL0; if(TH0<=0X72)

20

}

{ }

succeed_flag=1;

4、

21

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务