1、单片机原理及应用课程设计报告题目二十七:超声波测距系统设计学 生 姓 名专 业学 号同 组 同 学指 导 教 师学 院 二一六年七月2015-2016学年第二学期 成绩:一、设计要求1.搭建单片机的最小系统;(基本项)2.选用超声波模块,设计模块与单片机的接口;(基本项)3.采用LCD显示器显示测量结果;(基本项)4.编写相应的程序;(基本项)5.提高测量精度的方法。(创新项)二、设计题目介绍及分析使用MCS-51 系列单片机作为控制器,选用超声波模块,组建测距系统并显示结果。 三、设计方案论证发出超声波开启定时器收到回波信号根据THTL计算距离通过LCD显示定时器溢出中断或未回波发出警报通过
2、循环来时时的对目标进行测距。四、具体硬件设计说明蜂鸣器:通过PNP三极管驱动。接到P32引脚。按键:有键按下时IO口变为低电平。开始按键连接到P31,P32的按键控制中断。超声波模块:选用HC-SR04。提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。超声波TRIG连接到P10,ECHO连接到P11。LCD的E,RW,RS引脚分别接到单片机P27,P25,P26,P0口作为数据输出、 五、软件设计说明开始初始化等待按键按下发出超
3、声波计算距离收到脉冲显示是否开启定时器0关闭定时器取出TH0,TL0的值,并重新赋0发出超声波信号时开启定时器0,通过定时器计算回波信号持续时间进而计算出距离。/* 单片机课程设计* 题号: 27题,超声波测距* 组员:马铭阳,程岩,孔维士* 学号?30222204 130222206 130222207* 日期:2016年6月30日* 说明 KEY_START按下,程序执行,KEY1按下显示题号,持续10秒*/#include#include #includesbit Trig = P10; /超声波发送sbit Echo = P11; /超声波接收 sbit key_start=P31;
4、/开始按键sbit key1=P32; /中断按键sbit buzzer=P15; /蜂鸣器按键 unsigned char code TABLE = DISTANCE: ;unsigned char code ASCII = 0,1,2,3,4,5,6,7,8,9,.,-,C,M, ;unsigned char code CLASS = NO.27 ;static unsigned char DisNum = 0; /? unsigned int time=0;unsigned int i=0;unsigned int key_flag=0;long S=0;bit flag =0; /成功
5、标志位unsigned char disbuff4 = 0,0,0,0,;/* * * */延时函数void delayms(unsigned int ms) unsigned char i=100,j; for(;ms;ms-) while(-i) j=10; while(-j); /计算距离void Conut(void) time=TH0*256+TL0; TH0=0; TL0=0; S=(long)(time*0.17); if(S=700)|flag=1) flag=0; LcdWriteData( ASCII11); LcdWriteData( ASCII10); LcdWrite
6、Data(ASCII11); LcdWriteData( ASCII11); LcdWriteData( ASCII12); buzzer=0; delayms(50); buzzer=1; else disbuff3=S%10000/1000; disbuff2=S%1000/100; disbuff1=S%100/10;disbuff0=S%10/1; LcdWriteData( ASCIIdisbuff3); LcdWriteData( ASCIIdisbuff2); LcdWriteData( ASCIIdisbuff1); LcdWriteData( ASCII10); LcdWri
7、teData( ASCIIdisbuff0);LcdWriteData( ASCII12); LcdWriteData( ASCII13); /定时器0void zd0() interrupt 1 /触发时说明超出范围 flag=1; /成功标志位置1 void inter() interrupt 0 /外部中断 LcdWriteCom(0x01); LcdWriteCom(0x80);for (i=0;i7;i+) LcdWriteData(CLASSi); delayms(5); delayms(100);LcdWriteCom(0x80); for (i=0;i11;i+) LcdWri
8、teData(TABLEi); delayms(5); LcdWriteCom(0x80+0x46);/超声波发射 void StartModule() Trig=1; /发脉冲 _nop_(); /用NOP函数时间更精准 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0;
9、void key_board0(void) /按键扫描程序while(1) if(key_start=0)delayms(10);if(key_start=0)while(!key_start);key_flag=1;break;else if(key1=0)delayms(10);if(key1=0)while(!key1);key_flag=2;break;void key_board1(void) if(key_start=0)delayms(10);if(key_start=0)while(!key_start);key_flag=1;if(key1=0)delayms(10);if(
10、key1=0)while(!key1);key_flag=2;void main(void) P1 = 0xF0; /低位拉低 TMOD=0x01; TH0=0; TL0=0; ET0=1; /定时器0中断 IT0=1; /外部中断0 EX0=1; EA=1; LcdInit(); key_board0();/key_board1();/if(key_flag=1)/ LcdWriteCom(0x80); for (i=0;i0; c-) for (b=199;b0;b-) for(a=1;a0;a-); /* 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令
11、* 输 入 : com* 输 出 : 无*/#ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#else void LcdWriteCom(
12、uchar com) /写入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /选择写入命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;/Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com 4; /发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序L
13、cd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/写入数据LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_
14、Delay1ms(5); /保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/写入数据LCD1602_E = 0; /使能清零LCD1602_RS = 1; /选择写入数据LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = dat;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat 4; /写入低四位Lcd1602_
15、Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*/ #ifndefLCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指
16、针起点#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /将8位总线转为4位总线LcdWriteCom(0x28); /在四位线下的初始化LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#endif六、测试及调试硬件调试:焊接前用恒流源供电测量每个元件是否工作正常。此时电压不应过高,1V即可。焊接电路时每焊接一个器件后都用万用表测量一次通路,再用恒压源供电查看元件在焊接后的电路是否正常。整个电路焊接完成后给单片机供电用示波器测量竞争工作是否正常。软件调试:在硬件全部工作正常后应 进行软件调试。通过程序一起测量按键和蜂鸣器,有键按下时蜂鸣器发声。再测试LCD,用LCD学号,显示结果正常后,在将完整的程序烧入芯片。七、总结(设计最终情况说明,着重说明完成设计要求情况) 1.搭建了单片机的最小系统并且可以正常工作。2.完成了超声波模块的选用,设计模块与单片机的接口。3.LCD能够显示测量结果。距离单位在CM级。八、附录