当前位置:首页 > (完整版)基于单片机的超声波测距仪的设计参考毕业论文
出的C程序已被广泛应用,故直接借用已有程序也能作到对温度的准确读取,所心本设计全部使用C语言编程,这样能使设计中所用到的公式能方便快捷的体现和实现,又缩短了论文的篇幅。
软件采用模块化设计方法,由主程序、超声波发生子程序、超声波接收中断子程序、温度测量子程序、距离计算子程序、显示子程序、键盘扫描处理程序等模块组成。
图6.1为主程序流程图。
系统上电后,首先系统初始化,不断扫描按键k1,若按键k1按下,则开始测量空气温度,然后将P1.0置位,使定时器T0开始定时,控制超声波传感器发出超声波,同时使定时器T1开始定时。CPU循环检测P3.3引脚,当P3.3为低电平时接收到回波,立即使T1停止工作,保存定时器的计数值。
然后根据温度和传输时间计算距离,温度补偿措施使测量精度有了明显提高,计算出距离后调用距离显示子程序,LED显示距离。
最后检测按键k2,若k2闭合,则调用温度显示子程序,LED显示温度(温度并非测量距离时用于补偿的温度,而是当前温度)5s后恢复显示本次测量距离;若按键k2没有闭合,则显示器恒定显示最新一次的测量结果;若要进行下一次测量,则先要按下k3重新开始,再按下按键k1才执行新一次测量。由于不需输入数据,键盘只设置了3个按键,用于开始测量距离并显示温度功能设置等。
6.2 子程序设计
6.2.1 超声波发送子程序及超声波接收中断子程序
超声波发生子程序的作用是通过P1.0端口发送左右超声波脉冲信号(频率约40kHz的方波),脉冲宽度为12μs左右,同时把计数器T1打开进行计时,定时器T1工作在方式0。
超声波测距仪主程序利用外中断1检测返回超声波信号,一旦接收到返回超声波信号(即引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T1停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T1溢出中断将外中断1关闭,并将测距成功标志字赋值0表示此次测距不成功。
T0中断服务程序如下: sbit send=P1^0;
void timer0(void)interrupt 1 { send=!send; TH0=0x1f; TL0=0xf4; }
超声波接收(外部中断1)程序: void int1(void)interrupt 2 { if(TH1!=0x00&&TH0!=0x00)
{ b=1; TR1=0;
TR0=0;
t=TH1*256+TL1;
t=t; TH0=0x1f; TL0=0xf4; TH1=0x00; TL1=0x00; } else { b=0; TR1=0; TR0=0;
TH0=0x1f; TL0=0xf4; TH1=0x00; TL1=0x00; } }
6.2.2 测温子程序
测温的主要器件是DS18B20,现场温度直接以“一线总线”的数字方式传输,DS18B20中有两个存测得的温度值的两个8位存贮器RAM,用11位存贮温度值,最高位(5位)为符号位。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,
再计算十进制值。图6.2为DS18B20的温度存储方式:
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
2 32 22 12 02 -12 -22 -32 -4 bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 S
图6.2 DS18B20的温度存储方式
S S S S 2 62 52 4负温度时S=1,正温度时S=0。因此我们只需要逐位读出它的温度就可以了。读出一个字节C代码如下:
uchar readbyte(void) 直接读一字节程序 { uchar i,k;
i=8; k=0; while(i--) {
tem_in=1; delay_us(1); tem_in=0; k=k>>1; tem_in=1; NOP;
共分享92篇相关文档