大学本科生毕业设计(论文)
图 3-12 八段LED数码显示管原理和结构
单片机对LED管的显示可以分为静态和动态两种。静态显示的特点是各LED管能稳定地同时显示各自字形;动态显示是指各LED轮流地一遍一遍显示各自字符,人们由于视觉器官惰性,从而看到的是各LED似乎在同时显示不同字形。
为了减少硬件开销,提高系统可靠性并降低成本,单片机控制系统通常采用动态扫描显示。但是由于本系统所用的单片机引脚少,剩余引脚很多,而且也只需显示三位字符,所以,采用了静态的显示方式,且采用了软件译码,这样单片机引脚输出可直接接到LED显示管上。这样省去了外部复杂的译码电路。
22
大学本科生毕业设计(论文)
第4章 系统软件设计
4.1 系统程序的结构
本系统采用模块化设计,由主程序、发射子程序、接收子程序、定时子程序、显示子程序等模块组成。该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在数码显示器上显示出来。
(1)DS18B20温度传感器接口模块,分为初始化程序、写入命令以及读取子程序等部分;
(2)基于LED数码管的显示模块,分为数码管段选和位选。
(3)温度补偿与距离计算模块、分为超声波发送控制程序、接收处理程序、温度补偿子程序等;
(4)本次设计使用C语言编写程序,C语言相比汇编有许多的优势;编译器使用Keil进行程序编译,Keil功能强大使用方便。
主程序,分为系统初始化、按键处理以及各个子程序的调度管理等部分。如下图所示描述了各个模块的关系:
23
大学本科生毕业设计(论文)
开 始 初始化定时器模块,液晶模块,超声波模块
启动超声波 N 高电平计数 Y 开定时器 N 低电平计数 Y N 定时中断 Y N 关定时器 显示距离 Y液晶显示超出范围
结束 图 4-1 流程图
24
大学本科生毕业设计(论文)
4.2 系统主程序
主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式,置位总中断允许位EA并给显示端口PO和PZ清O。然后调用超声波发生子程序控制发射电路送出一组超声波脉冲,发射后等待1ms打开外部中断刀呵TO。当主程序检测到接收成功的标志位后,将计数器TO中的数与温度补偿后的声速按距离计算公式,即可得被测物体与测距器之间的距离。测出距离后结果将以十进制BCD码方式送往LED显示,然后再发超声波脉冲重复测量过程。等待1ms的原因是,超声波发射探头发射的超声波一般都会存在余波干扰,有部分声波会直接传到接收探头,经接收电路放大后,系统就会把它误认为是检测的回波信号,发射后等待1ms可以避免检测到余波信号,当然这也会导致测量盲区的存在。
本设计主程序的思想如下:
(1)温度为两位显示,距离为四位显示单位为mm;
(2)温度每隔900ms采样一次,DS18B20在12位精度下转换周期为750ms ,故900ms满足该速度要求;超声波每隔60ms发送一次。
(3)系统采用AT89S51的内时钟:12MHz;
(4)超声波发送一定时间后才开始启动检测,避免直达信号造成误判。所以系统最小测量约为1CM;
系统主程序如下: void main( void ) { TMOD=0x11;
TH0=0;
TL0=0; TH1=0xf8; TL1=0x30;
ET0=1; //允许T0中断 ET1=1; TR1=1; EA=1; while(1) {
while(!RX);
//当RX为零时等待
TR0=1; TR0=0;
//开启计数 //当RX为1计数并等待
//关闭计数
//允许T1中断 //开启定时器 //开启总中断 //2MS定时
//设T0为方式1,GATE=1;
while(RX);
Conut(); //计算}}
25
大学本科生毕业设计(论文)
4.3 40KHZ超声波发生及中断子程序
在系统中,AT89551对发射的控制就是对40kHz方波产生电路的控制。超声波发生子程序的作用是通过Pl.0端口发送一组超声波脉冲序列(频率约40kHz的方波),脉冲宽度为12群:左右,在程序中用定时器的自动重装载方式实现,脉冲发射同时把计数器T0打开进行计时,等待回波反射到接收探头。超声波发生子程序较简单,但要求程序运行时间准确,C语言程序如下:
void zd3() interrupt 3 块
{ TH1=0xf8;
TL1=0x30; Display(); timer++; if(timer>=400) {timer=0; TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
26
//T1中断用来扫描数码管和计800MS启动模
//800MS 启动一次模块