温度补偿超声波测距仪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
本文给出了系统总体框架、硬件电路、软件设计和程序流程图,并在硬件平台上实现了所设计的功能。

超声测距是一种非接触式的检测方式。

与其它方法相比,如电磁的或光学的方法,它不受光线、被测对象颜色等影响。

对于被测物处于黑暗、有灰尘烟雾、电磁干扰、有毒等恶劣的环境下有一定的适应能力。

而本文介绍的基于单片机STC90C516RD+的超声波测距系统的设计方案与软硬件实现。

采用温度传感器DS18B20 采集温度数据,液晶显示屏LCD1602C 显示温度数据及来回波的时间,当环境温度变化较大时,提取测得的温度,根据不同的温度对超声波测距系统的声速进行修正。

测距时接收到回波,点亮绿色发光二极管;当没有回波时,定时器溢出,点亮红色发光二极管。

关键词:红色发光二极管;超声波测距;温度补偿;温度传感器;电磁干扰
目录
摘要 (Ⅰ)
第1章绪论 (1)
1.1 概述 (1)
1.2 系统软硬件的调试 (1)
第2章系统设计原理 (2)
2.1 系统主要硬件结构 (2)
2.2 单片机主机系统介绍 (2)
2.2.1 单片机控制模块 (2)
2.2.2 温度数据采集模块 (2)
2.2.3 主件LCD1602C的结构 (3)
2.3 超声波测距的设备 (4)
2.3.1 超声波测距系统的硬件电路设计 (4)
2.3.2 超声波发射电路 (4)
2.3.3 超声波检测接收电路 (5)
第3章系统的软件设计 (6)
3.1 语言的选用 (6)
3.2 系统控制流程 (7)
3.3 程序设计流程图 (10)
3.4 超声波测距仪的算法设计 (12)
3.5 超声波发生子程序和接收中断程序 (12)
3.6 电路仿真 (12)
第4章安装调试 (13)
第5章电路特点和误差分析 (14)
结论 (15)
参考文献 (16)
附录 (17)
致谢 (24)
第1章绪论
1.1 概述
制作超声波测距系统,并外加温度补偿使测距更精确。

前期制作超声波发送与接收电路,经过调试正常可用后,编写相应的超声波程序,完成对于整个测距系统的控制。

设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离。

以数字的形式显示测量距离。

超声波测距的原理是利用超声波的发射和接收,根据超声波传播的时间来计算出传播距离。

实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。

此次设计采用反射波方式。

超声波测距仪硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分。

单片机采用AT89C51或其兼容系列。

采用11.0592MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。

单片机用P3.4端口输出低电平,通过硬件电路产生超声波换能器所需的40kHz的方波信号,利用外中断1口监测超声波接收电路输出的返回信号。

显示电路采用简单实用的LCD1602。

1.2系统软硬件的调试
超声波测距仪的制作和调试都比较简单,其中超声波发射和接收采用Φ16的超声波换能器T/R40-16(T为发射,R为接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。

若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。

根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容的大小,以获得合适的接收灵敏度和抗干扰能力。

硬件电路制作完成后,使用外加电源调试,用示波器检测振荡电路输出端是否有一个40KHz的方波。

并可检查CX20106第7引脚在收到回波时是否产生低电平。

调试好后,便可将程序编译好下载到单片机试运行。

根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。

根据所设计的电路参数和程序,测距仪能测的范围为6~150cm,测距仪最大误差不超过1cm。

系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。

第2章系统设计原理
2.1 系统主要硬件结构
系统的硬件主要由单片机主机系统和超声波测距系统组成。

其中单片机主机系统用到了单片机、液晶显示LCD1602、独立键盘、温度传感器DS18B20、蜂鸣器、LED发光二极管等;超声波测距系统则包括产生40KHZ的振荡电路(使用集成芯片CD4011和74LS04组成),超声波发送探头,超声波接收探头及超声波接收芯片CX20106组成。

2.2单片机主机系统
2.2.1 单片机控制模块
控制模块是整个设计方案的核心,它控制了温度的采集、处理与显示、超声波发送接收电路的启动及温度补偿。

本文选用STC90C516RD+作为控制器件。

其最突出的优点是片内Flash 为16K,可方便地擦写100万次以上,价格低廉,而且其指令丰富,编译工具多,仿真环境好。

因此被广泛地应用于各种控制领域。

图2-1单片机控制模块图
2.2.2 温度数据采集模块
温度由DALLAS 公司生产的一线式数字温度传感器DS18B20 采集。

DS18B20 测温范围为-55°C~+125°C,测温分辨率可达0.0625°C,被测温度用符号扩展的16 位补码形式串行输出。

CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

DS18B20 内部有一个9 字节的高速存储器用于存储温度值。

其中前两个字节是测得的温度数据,第1 字节的内容是温度的低八位,第2 字节是温度的高八位,第3
和第4 字节是温度上限TH 与温度下限TL 的易失性拷贝,第5 字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新,第6、7、8 这三个字节用于内部计算,第9个字节是冗余检验字节,可用来保证通信的正确性。

当温度转换命令发出后,经转换所得的温度值以二字节补码形式存放在此存储器的第1 和第2 个字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后,其中高5 位是符号位,中间7 位是整数位,最低4 位是小数位。

DS18B20 最大的特点是单总线数据传输方式,因此对读写的数据位有着严格的时序要求。

时序包括:初始化时序、读时序、写时序。

每一次命令和数据的传输都是从单片机启动写时序开始,如果要求DS18B20 回送数据,在进行写命令后,单片机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

DS18B20 的时序及命令请参考文献。

温度数据采集模块中温度传感器DS18B20 的DQ端接P2.6。

图2-2传感器图
2.2.3 主件LCD1602C的结构
LCD1602C 是2 行×16 个字符的字符型LCD 显示器,它由32 个字符点阵块组成,每个字符点阵块由5×7 或5×10 个点阵组成,可以显示ASCII 码表中的所有可视的字符。

它内置了字符产生器ROM (Character Generator ROM,CGROM)、字符产生器RAM (Character Generator RAM, CGRAM)和显示数据RAM(Data Display RAM, DDRAM)。

CGROM 中内置了192个常用字符的字模,CGRAM 包含8 个字节的RAM,可存放用户自定义的字符,DDRAM 就是用来寄存待显示的字符代码。

DDRAM 地址与显示位置的对应关系以及LCM1602 的指令与读写时序可参考文献。

显示模块LCD1602C 的DB0~DB7 数据端口接AD0~AD7,数据命令选择端RS 接P2.0,读写选择端接P2.1,使能信号接P2.2,被光控制接P2.5,LCD1602C 上的VO、RST 接电源+5V,GND 接地。

AP2.2AP2.0
J5LCD1602
1
2345678910111213141516
A
AP2.1AD7AD5AD3VCC GND AD0AD4AD1AD2AD6R520K
VCC Q1GND
图2-3
图2-4LED 发光二极管
2.3 超声波测距的设备
2.3.1 超声波测距系统的硬件电路设计
本系统的特点是利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时,单片机选用STC90C516RD+,经济易用,便于编程。

硬件设计上为减轻处理器负担,不采用软件方法,而使用硬件电路产生40KHZ 的方波驱动超声波传感器。

2.3.2 超声波发射电路
发射电路主要由集成芯片与非门CD4011、反相器74LS04和超声波发射换能器T 构成,单片机P3.4端口输出的40kHz 的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。

输出端采两个反向器并联,用以提高驱动能力。

发射电路图如下:
J2
SIGNAL
12
EN_40KHZ ULTRA_OUT
INPUT_40KHZ
VCC
J1
POWER
12
J3
INPUT_40KHZ
12
图2-5超声波发射电路
压电式超声波换能器是利用压电晶体的谐振来工作的。

超声波换能器内部有两个压电晶片和一个换能板。

当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。

超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。

2.3.3超声波检测接收电路
接收电路图:
LS2RX
图2-6超声检测接收电路
超声波接收处理电路采用集成电路CX20106。

CX20106为红外接收专用集成电路,在此利用CX20106作为超声波传感器接收信号的放大检波装置,亦取得良好的效果。

CX20106采用8脚单列直插式塑料封装,内含前置放大、限幅放大、自动偏置、通带滤波、峰值检波、积分比
较及施密特整形输出等电路。

CX20106的总放大增益约为80 dB,以确保其7脚输出的控制脉冲序列信号幅值在正常范围内。

只要CX20106接收到与其中心频率相符的超声波信号时, 7脚就输出低电平。

7脚输出的脉冲下降沿接单片机INT1口。

第3章系统的软件设计
3.1 语言的选用
本设计中采用的处理器是AT89S52单片机,由此可采用面向MCS-51的程序设计语言,包括ASM51汇编语言和C51高级语言,这两种语言各有特点。

汇编语言更接近机器语言,常用来编制与系统硬件相关的程序,如访问I/O端口、中断处理程序、实时控制程序、实时通信程序等。

而数学运算程序则适合用C51高级语言编写,因为用高级语言编写运算程序可提高编程效率和应用程序的可靠性。

C语言是一种通用的计算机程序设计语言,在国际上十分流行,它即可用来编写计算机系统程序,也可以用来编写一般的应用程序。

以前计算机的系统软件主要是用汇编语言编写的,对于单片机应用系统来说更是如此。

由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用程序的周期长,而且调试和排错也比较困难。

C语言具有很好的可移植性和硬件控制能力,表达和运算能力也较强。

3.2 系统控制流程
超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。

我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),本文控制程序采用C语言编程。

主程序调用了5个主要的子程序,分别是LCD 显示程序、按键扫描及处理程序、温度采集程序、超声波发送子程序、报警程序。

LCD 显示程序,用于温度和距离等数据的实时显示;按键扫描及处理程序,实现按键识别、按键输入及相关处理;温度采集程序负责把DS18B20所采集的现场温度读入到指定的数组中;超声波发送子程序,在P3.4引脚发出一个低电平,使硬件电路产生40KHZ的方波,从而驱动超声波发射端;报警程序,对当前距离与设定的报警距离进行比较,若低于设定值,则蜂鸣器开始报警。

本次单片机温控系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。

系统软件的功能又可分为两大类:一是监控软件,它是整个控制
系统的核心,专门用来协调各执行模块和操作者的关系。

二是执行软件,它是用来完成各种实质性的功能如测量、显示等功能。

每一个执行软件也就是一个小的功能执行模块。

本文将各执行模块一一列出,各执行模块规划好后,就可以规划监控程序了。

两软件分为部分,主程序和中断服务程序,如下图。

主程序完成初始化工作、各路超声波发射和接收顺序的控制。

定时中断服务子程序完成超声波的轮流发射,外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出等工作。

3.3 程序设计流程图
本系统用计数程序采集信号脉冲,用定时器产生中断,对数码管刷新和缓冲区数据进行更新,辅以数码管进行显示。

主程序流程图如图3-1。

图3-1系统控制流程图
3.4 超声波测距仪的算法设计
主程序首先是对系统环境初始化,设置定时器T1工作模式为16位定时计数器模式。

置位总中断允许位EA并给显示端口使能端P1.5置位。

然后调用超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1 ms (这也就是超声波测距仪会有一个最小可测距离的原因)后,才打开外中断1接收返回的超声波信号。

由于采用的是11.0592 MHz的晶振,计数器每计一个数时间约为1μs,当主程序检测到接收成功的标志位后,将计数器T1中的数(即超声波来回所用的时间)按公式计算,
即可得被测物体与测距仪之间的距离,设计测试时取20℃时的声速为344 m/s则有: d=(c×t)/2=172*T1/10000cm (其中,T1为计数器T1的计算值。


图3-2超声波测距仪
声速c与温度有关,如温度变化不大,则可认为声速是基本不变的。

若测距精度要求很高,则应通过温度补偿的方法加以校正。

声速确定后,只要测得超声波往返时间,即可求得距离。

在系统加入温度传感器来监测环境温度,可进行温度被偿。

这里用DS18B20测量环境温度,根据不同的环境温度确定一声速提高测距的稳定性。

为了增强系统的可靠性,可在软硬件上采用抗干扰措施。

不同温度下的超声波声速表:
图3-3超声波声速表
测出距离后结果将以十进制送往LCD1602显示一段时间,然后再发超声波脉冲重复测量过程。

为了有利于程序结构化和容易计算出距离,主程序采用C语言编写。

主要子程序及主程序:
void display(uint t_emp) //显示距离
{
uint q,b,s,g;
q=t_emp/1000;
b=(t_emp%1000)/100;
s=(t_emp%100)/10;
g=t_emp%10;
write_1602com(0x80+0x40+9);
write_1602dat(num[q]);
delay(5);
write_1602dat(num[b]);
delay(5);
write_1602dat(num[s]);
delay(5);
write_1602dat(num[g]);
delay(5);
write_1602dat(' ');
delay(5);
write_1602dat('C');
delay(5);
write_1602dat('M');
}
void write_temp(uchar add,uchar dat)//温度显示子函数,写温度数据,指定显示位置{
uchar gw,sw,xs;
sw=dat/100; //取得十位数字
gw=(dat%100)/10; //取得个位数字
xs=dat%10; //取得小数点后一位
write_1602com(0x80+0x40+add);
write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码write_1602dat('.');
write_1602dat(0x30+xs);
write_1602dat(0xdf); //显示温度的小圆圈符号
write_1602dat(0x43); //显示"C"符号
}
void ultrasound(void) //超声波子程序
{
ek=1;
S=0;
time=0;
beep=1;
lcd_init();
write_1602com(0x01);
delay(1);
write_1602com(0x80);
write_1602dat('D');
delay(1);
write_1602dat('i');
delay(1);
write_1602dat('s');
delay(1);
write_1602dat('t');
delay(1);
write_1602dat('a');
delay(1);
write_1602dat('n');
delay(1);
write_1602dat('c');
delay(1);
write_1602dat('e');
delay(1);
write_1602dat(':');
delay(1);
tx=1;
rx=1;
TMOD=0x10;
IT1=0;
while(1)
{
S=0;
distemp();
delay(500);
tran();
delay(10);
ek=0;
if(key3==0)
{
delay10ms();
if(key3==0)
{ break; }
}
ek=1;
}
}
void main() //主函数
{
count3=0;
lcd_init();
lcd=0;
logo();
while(1)
{ key(); }
}
3.5 超声波发生子程序和接收中断程序
超声波发生子程序的作用是通过P3.4端口产生低电平,使硬件电路发送1个超声波脉冲信号(频率约40kHz的方波),同时把计数器T1打开进行计时。

超声波测距仪主程序利用外中断1检测返回超声波信号,一旦接收到返回超声波信号(即INT1引脚出现低电平),立即进入中断程序。

进入中断后就立即关闭计时器T1停止计时,关闭总中断EA,提取定时器数值,同时根据温度传感器的数值对声速修正,然后计算数据输出到LCD1602,同时点亮绿色发光二极管表示测距成功。

如果当定时器溢出时还未检测到超声波返回信号,则定时器T1溢出中断将外中断1关闭,并点亮红色发光二极管表示此次测距不成功。

测距电路的Ultrasound Out端接单片机INT1端口,中断优先级最高。

部分源程序如下:
void tran(void) //超声波发送子程序
{
EX1=0;
ET1=0;
EA=0;
TH1=0;
TL1=0;
tx=0;
TR1=1;
nop;
tx=1;
nop;
EA=1;
EX1=1;
ET1=1;
}
void timer1(void) interrupt 3 //定时器1 计算时间及判断测距是否成功
{
EA=0;
TH1=0;
TL1=0;
ET1=0;
TR1=0;
ledr=1;
delay02s();
delay02s();
ledr=0;
}
void INT1_(void) interrupt 2 //外部中断1,用做判断回波电平
{
TR1=0;
EX1=0;
EA=0;
time=TH1*256+TL1;
display1(time);
temp=ReadTemperature();
if(temp>=0&&temp<100)
{
speed=0.01615;
}
else if(temp>=100&&temp<200)
{
speed=0.0169;
}
else if(temp>=200&&temp<300)
{
speed=0.0172;
} else if(temp>300)
{
speed=0.01745;
}
S=time*speed-2;
display(S);
alarm();
ledg=1;
delay(10);
ledg=0;
EA=1;
delay(10);
}
3.6 电路仿真
仿真部分运用Proteus仿真软件来实现,Proteus 软件是一款强大的单片机仿真软件,它除了具有和其他工具一样的原理编辑、印制电路板(PCB)自动或人工布线及电路仿真外,最大的特色是其电路仿真是交互的、可视化的。

对于单片机学习和开发帮助极大。

Proteus ISIS 是英国Lab center 公司开发的电路分析与实物仿真软件。

它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和数字集成电路,包括单片机。

通过Proteus可以绘制硬件原理图,并设置元件参数;为单片机及其程序以及外部接口电路的仿真提供可能,验证设计的可行性与合理性;还可以为连接实际的硬件电路做好准备;如有必要时,可以利用它来设计电路板。

超声波检测仿真电路图如下图3-4所示。

图3-4 超声波检测电路图
第4章安装调试
使用5V电源对系统供电,使用超声波模块发出超声并测量反射波,电路如图所示,在接收到回波的同时关计数器,并将运算结果显示在1602液晶屏上,经测试,能够达到测量要求测量精度0.1cm。

在调试过程中,发现超声波接受端子在加电任何情况下始终有微弱信号干扰,无法滤除,在二级放大端,此信号几乎与有用信号等大,不能分辨,经过反复检查,才发现:在电路布局上,由于把17KHz和40KHz的多谐振荡电路集成在一块4011芯片上,导致信号无法区分,影响了接收端,又由于地线过于集中于某一根主线上,数字电路和模拟电路相互影响,便造成了无法修复的错误,电路最终效果为:显示紊乱、误差太大。

第5章电路特点和误差分析
电路运用了纯硬件设计、而未采取单片机设计,旨在训练硬件设计能力,且成本低。

方案基本实现了短距离超声波测距的功能。

在误差方面:普遍出现正偏差。

主要原因为,在输出端比较器,为提高灵敏度,抬高了比较器的参考电压,使得接受计时延迟,测距变大,可以采用倍压检波电路取出反射回来的检测脉冲信号进行处理。

发射接收时间误差,实际声速获得上的误差,测试过程中的误差等误差现象。

温度补偿:超声波传播在空气中的传播速度并不是固定的,在不同的环境温度下,声波的传播速度会有所改变,其关系为v=331.5+0.6×t,其中v的单位为m/s,t为环境温度,单位为℃。

,为适应不同环境温度下测量的需要,我们要求多谐振荡电路的电阻R具有一定的调
节范围。

结论
基于STC89C52单片机为核心的超声波测距,通过超声波模块发射并接收超声波,经过单片机进行数据处理后,显示在1602液晶显示屏上,能够达到简单测距的目的,测量范围在3米左右,能够实现日常测量的要求,且方便易用,电压要求宽,在5V左右。

在编写程序时,是一个让人很费脑力的活动,要达到要求,还要不出现错误,就需要多次的实验,多次的总结,在不断的实验总,提高自己的编程能力,在此次编写程序时,我遇到的很多问题,但最后,通过了一周的时间我还是把它完成了,希望自己以后可以做得更好,也希望自己更熟练的完成它。

通过此次试验,也让我们意识到做试验是一个持之以恒的过程,有的时候很快能把电路焊接好,但调试起来却需要很多时间,也让我们认识到团队合作的重要性虽然做实验是个很痛苦很漫长的过程,但经历了辛苦过后看着我们共同完成的成品,那种喜悦感很难形容。

我们会继续学习下去,学习软件编程,学习电脑语言,从事我们自己,为社会,为学校做出贡献。

参考文献
[1] 胡萍.超声波测距仪的研制.计算机与现代化,2003.10
[2] 时德刚,刘哗.超声波测距的研究.计算机测量与控制,2002.10
[3] 华兵.MCS-51单片机原理应用.武汉:武汉华中科技大学出版社,2002 .5
[4] 李华.MCU-51系列单片机实用接口技术.北京:北京航空航天大学出版社,1993. 6
[5] 陈光东.单片机微型计算机原理与接口技术(第二版).武汉:华中理工大学出版社,1999.4
[6] 徐淑华,程退安,姚万生.单片机微型机原理及应用.哈尔滨:哈尔滨工业大学出版社,1999. 6.
[7] 苏长赞.红外线与超声波遥控.北京:人民邮电出版社,1993.7
[8] 张谦琳.超声波检测原理和方法.北京:中国科技大学出版社,1993.10
[9] 九州.放大电路实用设计手册.沈阳:辽宁科学技术出版社,2002.5
[10] 樊昌元,丁义元. 高精度测距雷达研究.电子测量与仪器学报,2000.10
[11] 苏伟,巩壁建.超声波测距误差分析.传感器技术,2004.
[12] 永学等.1-Wire总线数字温度传感器DS18B20及应用.电子产品世界,2003.12
[13] 胜全.D18B20数字温度计在微机温度采集系统中的序编制. 南京:南京大学出版社1998. 3
[14] 恒清,张靖.加强单片机系统抗干扰能力的方法.通化师范学院学报,2004 .10
[15] 晗晓,袁慧梅.单片机系统的印制板设计与抗干扰技术.电子工艺技术,2004 .6
[16] 丰,薛红宣.采用软件抗干扰设计提高微机系统的可靠性.电子产品世界,2004.1
[17] 占操,梁厚琴,曹燕.单片机系统中的软件抗干扰技术.电子技术,2003.3
[18] 华兵.MCS-51单片机原理应用.武汉:武汉华中科技大学出版社,2002 .5
[19] 继兴,刘霞.单片机系统软件抗干扰措施分析.电子测量技术,2003
[20] 田华等.可编程单总线数字式温度传感器DS18B2的原理与应用.电子质量,2004.7
[21] 杨姣秀,基于单片机的超声波测距仪的设计.湖南工业大学,2008
附录附录1超声波电路图
附录2 程序清单
#include<reg52.h>
#include<intrins.h>
#include"delay.h"
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;
uchar busy;
uchar check(void)
{
rs=0;
rw=1;
e=1;
_nop_();
_nop_();
_nop_();
_nop_();
busy=P0&0x80;
e=0;
return busy;
}
void wcom(uchar dat) {
while(check());
rs=0;
rw=0;
P0=dat;
_nop_();
e=0;
_nop_();
_nop_();
e=1;
_nop_();
_nop_();
_nop_();
_nop_();
e=0;
}
void wdate(uchar date) {
while(check());
rs=1;
rw=0;
P0=date;
_nop_();
e=0;
_nop_();
_nop_();
e=1;
_nop_();
_nop_();
_nop_();
_nop_();
e=0;
}
void lcdinit()
{
delay_500us(30);
wcom(0x38);
delay_500us(10);
wcom(0x38);
wcom(0x38);
while(check());
wcom(0x14);
while(check());
wcom(0x06);
while(check());
wcom(0x0c);
while(check());
}
void disone(uchar x,uchar y,uchar ddata)
{
y&=0x01;
x&=0x0f;
if(y) x|=0x40;
x|=0x80;
check();
wcom(x);
wdate(ddata);
}
void dischar(uchar x,uchar y,uchar code *ddata) {
uchar i;
i=0;
y&=0x01;
x&=0x0f;
while(ddata[i]>0x19)
{
if(x<=0xf)
{
disone(x,y,ddata[i]);
i++;
x++;
}
}
}
#include "delay.h"
void delay_500us(uint t)
{
uchar i,j;
for(i=t;i>0;i--)
for(j=240;j>0;j--);
}
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void delay_17us(uchar t) //17us延时+6us
{
while(t--);
}
#include<reg52.h>
#include "1602.h"
#include "chaoshengbo.h"
void main(void)
{
uint valA;
lcdinit();
TMOD=0x01;
EA=1;
TH0=0;
TL0=0;
ET0=1;
while(1)
{
rx=1;
start();
for(valA=7510;valA>0;valA--)
{
if(rx==1)
{
timercount();
temp_convert();
}
}
}
}#include<reg52.h>
#include<intrins.h>
#include "delay.h"
#include "1602.h"
#include "temperature.h"
uchar bai,shi,ge,fuhao,xiaoshu,temp,temph,templ;
uint c;
unsigned char code table2[]="Temperatur";//LCD1602显示格式
unsigned char code ASCII[13] = "0123456789.-M"; void wbyte(uchar dat)
{
uchar i,value;
for(i=0;i<8;i++)
{
dq=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
value=dat&0x01;
if(value==0)
{
dq=0;
delay_17us(5);
}
if(value==1)
{
dq=1;
delay_17us(5);
}
dq=1;
dat>>=1;
delay_500us(30);
}
}
uchar rbyte()
{
uchar i,dat;
for(i=0;i<8;i++)
{
dq=1;
_nop_();
_nop_();
dq=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
dq=1;
_nop_();
_nop_();
_nop_();_nop_();
dat>>=1;
if(dq)
dat|=0x80;
delay_17us(5);
}
dq=1;
return dat;
}
void dsinit()
{
uchar presence;
dq=1;
_nop_();
_nop_();
dq=0;
delay_500us(1);
dq=1;
delay_17us(1);
if(dq)
presence=dq;
delay_500us(1);
}
void temp_convert()
{
dsinit();
wbyte(0xcc);
wbyte(0x44);
delay_500us(2);
dsinit();
wbyte(0xcc);
wbyte(0xbe);
templ=rbyte();
temph=rbyte();
if((temph&0xf0)!=0xf0)
{
fuhao=0x2b;
c=((templ&0xf0)>>4|(temph&0x0f)<<4);
bai=c/100;
shi=c/10%10;
ge=c%10;
xiaoshu=(templ&0x0f)*0.0625*10;
disone(0,1,fuhao);
}
else
{
fuhao=0x2d;
temp=((templ&0xf0)>>4|(temph&0x0f)<<4);
temp=~temp;
if((temp&0x0f)==0x00)
{
temp=temp+1;
}
bai=c/100;
shi=c/10%10;
ge=c%10;
xiaoshu=((~(templ&0x0f)&0x0f)+1)*0.0625*10;
disone(0,1,fuhao);
}
dischar(0,1,table2);
disone(10,1,0x2b);
disone(11,1,ASCII[shi]);
disone(12,1,ASCII[ge]);
disone(13,1,ASCII[10]);
disone(14,1,ASCII[xiaoshu]);
disone(15,1,0xdf);
}
致谢
在这次课程设计的创作过程中,非常感谢李老师对我的帮助。

在设计过程中,李老师给予了悉心的指导,最重要的是给了我解决问题的思路和方法,并且在设计环境和器材方面给予了大力的帮助和支持,在此,我对李老师表示最真挚的感谢!同时感谢所有帮助过我的同学!
同时,也非常感我的同学们,他们帮助我更好的理解了论文中不懂的地方,特别是在转速计算公式的理解上,给了我的很大的帮助。

同时帮助我找到了源程序中存在的一些错误以及帮助我学会了Proteus软件的安装和使用。

真心感谢在这次课程设计中给了我帮助的老师和同学。

相关文档
最新文档