基于单片机的超声波测距系统设计实验报告-重_第1页
基于单片机的超声波测距系统设计实验报告-重_第2页
基于单片机的超声波测距系统设计实验报告-重_第3页
基于单片机的超声波测距系统设计实验报告-重_第4页
基于单片机的超声波测距系统设计实验报告-重_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档倾情为你奉上精选优质文档倾情为你奉上专心专注专业专心专注专业精选优质文档倾情为你奉上专心专注专业指导教师评定成绩: 审定成绩: 自 动 化 学 院计算机控制技术课程设计报告 设计题目:基于单片机的超声波测距系统设计单位(二级学院): 学 生 姓 名: 专 业: 班 级: 学 号: 指 导 教 师: 负 责 项 目: 设计时间:二一四 年 五 月自动化学院制目录TOC o 1-3 u 一、设计题目 定时器模块。TO定时器用于超声波测距的计时。T1定时器用于主程序扫 描时间的控制。(2)主程序源代码 void main()send_wave(); /测距离函数smg_display()

2、; /处理距离显示函数time_init(); /定时器初始化init_eepom(); /初始化eepom(读取set_d)while(1)if(flag_300ms = 1) /300ms执行一次flag_300ms = 0;clock_h_l(); /报警函数send_wave(); /测距离函数if(menu_1 = 0) /没有键按下时才给缓冲数组赋新值smg_display(); /处理距离显示函数if(zd_break_en = 1) /自动退出设置界面程序zd_break_value +; /每300ms加一次if(zd_break_value 100) /30秒后自动退出设置

3、界面menu_1 = 0; smg_i = 3;zd_break_en = 0;zd_break_value = 0; key(); /按键检测函数if(key_can P32* 超声波接收=P33 按键用的接口是P2口*待改进的地方:温度补偿,提高精度*当前的缺陷: 不能测出4m的距离*测量单位:米(m)*/#include #include #include #include #define uchar unsigned char #define uint unsigned int/数码管段选定义 设 0 1 2 3 4 5 6 7 8 9uchar code smg_duan=0 xc0

4、,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/数码管位选uchar dis_smg4 =0,1,2,3;sbit smg_we1 = P34; /数码管位选端口sbit smg_we2 = P35;sbit smg_we3 = P36;sbit smg_we4 = P37;sbit c_send = P31; /超声波发射sbit c_recive = P30; /超声波接收uchar flag_hc_value; /超声波中间变量sbit beep = P23; /蜂鸣器IO口定义uchar smg_i = 3; /显示数码管

5、的个数:3bit flag_300ms ; /主程序300ms处理一次的标识符 bit key_500ms ; /按键程序500ms处理一次的标识符long distance; /定义测量距离uint set_d; /定义设定距离uchar flag_csb_juli; /超声波超出量程 long flag_time0; /按键的IO变量的定义uchar key_can; /按键值的变量uchar zd_break_en,zd_break_value; /自动退出设置界面uchar menu_ljsd = 10; /用来控制连加的速度bit flag_lj_en; /按键连加使能bit fla

6、g_lj_3_en; /按键连3次连加后使能 加的数就越大了 uchar key_time; /定时器用,作为连加的中间变量,按键时间uchar flag_value;/定时器用,作为连加的中间变量uchar menu_1; /菜单设计的变量uchar a_a; /设定值写入单片机标志符/*数码管位选函数*/void smg_we_switch(uchar i)switch(i)case 3: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;case 2: smg_we1 = 1; smg_we2 = 0; smg_we3 =

7、 1; smg_we4 = 1; break;case 1: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;case 0: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;/*数码管显示函数*/void display()static uchar i; i+;if(i = smg_i) /smg_i=3,i = 0;smg_we_switch(i); /调用位选函数P1 = dis_smgi; /段选 /*把数据保存到单片机内部eepom中*/void wr

8、ite_eepom()SectorErase(0 x2000);byte_write(0 x2000, set_d % 256);/写入set_d值byte_write(0 x2001, set_d / 256);byte_write(0 x2058, a_a);/a_a标识符/*把数据从单片机内部eepom中读出来*/void read_eepom()set_d = byte_read(0 x2001);/读出set_d值set_d = 5) /确认无键按下key_value = 0;key_new = 1; /置位key_new,表初始无键按下flag_lj_en = 0; /关闭连加的使

9、能flag_lj_3_en = 0; /关闭3秒后连加的使能flag_value = 0; /连加变量清零key_time = 0; write_eepom(); /值(set_d)写入单片机else /初始无键按下if(P2 & 0 x07) != 0 x07) /按键检测(5次)key_value +; else key_value = 0;if(key_value = 5) /确认按键key_value = 0;key_new = 0;flag_lj_en = 1; /连加使能zd_break_en = 1; /自动退出设置界使能zd_break_value = 0; /自动退出设置界变

10、量清零,30秒后退出设置界面key_can = 20;if(key_500ms = 1) /连按500ms,启动连加key_500ms = 0;key_new = 0;key_old = 1;zd_break_value = 0; /自动退出设置界变量清零,30秒后退出设置界面if(key_new = 0) & (key_old = 1) /确认有键按下switch(P2 & 0 x07)case 0 x06: key_can = 1; break; /得到k2键值(设定键)case 0 x05: key_can = 2; break; /得到k3键值(加)case 0 x03: key_ca

11、n = 3; break; /得到k4键值(减) key_old = key_new; /初始化标识符/*按键处理数函数*/void key_with()if(key_can = 1) /得到k2键值(设定键)menu_1 +;if(menu_1 = 2)menu_1 = 0;if(menu_1 = 0) /退出设定界面menu_ljsd = 10; /连加速度控制变量(复位为500ms)dis_smg0 = smg_duandistance % 10; /测量值显示用dis_smg1 = smg_duandistance / 10 % 10 ; dis_smg2 = smg_duandist

12、ance / 100 % 10 & 0 x7f; smg_i = 3;if(menu_1 = 1) /设置界面menu_ljsd = 1; /连加速度变量(50ms)dis_smg0 = smg_duanset_d % 10; /设定值显示用dis_smg1 = smg_duanset_d / 10 % 10; dis_smg2 = smg_duanset_d / 100 % 10 & 0 x7f ; dis_smg3 = 0 x88;smg_i = 4; /A,设定值修改标识符if(menu_1 = 1) /设置报警值if(flag_lj_3_en = 0) /三次连加之后速度加快menu_

13、ljsd = 10 ; /500ms 加减一次else menu_ljsd = 1; /50ms 加减一次if(key_can = 2) /得到k3键值(加)set_d + ; if(set_d 350)set_d = 350;dis_smg0 = smg_duanset_d % 10; /设定值显示dis_smg1 = smg_duanset_d / 10 % 10 ; dis_smg2 = smg_duanset_d / 100 % 10 & 0 x7f; dis_smg3 = 0 x88;if(key_can = 3) /得到k4键值(减)set_d - ; if(set_d =0;i-

14、) _nop_(); /执行一条_nop_()指令就是1us /*超声波测距程序*/void send_wave()long temp = 888;c_send = 1; /10us的高电平触发 delay();c_send = 0; TH0 = 0; /给定时器0清零TL0 = 0;TR0 = 0; /关定时器0定时flag_hc_value = 0;while(!c_recive); /当c_recive为零时等待TR0=1;while(c_recive) /当c_recive为1计数并等待flag_time0 = TH0 * 256 + TL0;if(flag_hc_value 1) |

15、 (flag_time0 21000) /当超声波超过测量范围时,显示3个888TR0 = 0;flag_csb_juli = 2;temp = 888;flag_hc_value = 0;break ;else flag_csb_juli = 1;if(flag_csb_juli = 1) /距离处理TR0=0; /关定时器0定时EA = 0;temp = TH0; /读出定时器0的时间temp = temp * 256 + TL0;temp /= 59; /HC-SR04超声波模块 距离(厘米)=T*uS/58.823EA = 1;if(temp 380) /如果大于3.8m就超出超声波的

16、量程temp = 888; EA = 0;distance = temp; /距离 EA = 1;/*冒泡排序(最大值沉底)*/int iBuff5;void choise(int *a,int n) /选择法排序 int i,j,k,temp; for(i=0;in-1;i+) k=i; /给记号赋值 for(j=i+1;jaj) k=j; /是k总是指向最小元素*/ if(i!=k) /当k!=i是才交换,否则ai即为最小 temp=ai; ai=ak; ak=temp; /*测量距离处理及显示函数*/void smg_display()int Buff5;char i;if(distan

17、ce = 95)return; /95去掉iBuff4 = iBuff3;iBuff3 = iBuff2;iBuff2 = iBuff1;iBuff1 = iBuff0;iBuff0 = (int)distance;for(i = 0; i5; i+) Buffi = iBuffi;choise(Buff,5); /调用choise函数,冒泡排序distance = (long)Buff2; /取得排序后5值的中间值,以消弱误触,稳定测量结果 EA = 0; /关中断dis_smg0 = smg_duandistance % 10; /取百分位(厘米级)dis_smg1 = smg_duand

18、istance / 10 % 10; /取十分位(分米级)dis_smg2 = smg_duandistance / 100 % 10 & 0 x7f; /取个 位(米级)EA = 1; /开中断/*报警函数*/void clock_h_l()static uchar value;if(distance = 5)beep = beep; /蜂鸣器报警else value = 0; beep = 1; /取消报警void main()send_wave(); /测距离函数smg_display(); /处理距离显示函数time_init(); /定时器初始化init_eepom(); /初始化eepom(读取set_d)while(1)if(flag_300ms = 1) /300ms执行一次flag_300ms = 0;clock_h_l(); /报警函数send_wave(); /测距离函数if(menu_1 = 0) /没有键按下时才给缓冲数组赋新值smg_display(); /处理距离显示函数if(zd_break_en = 1) /自动退出设置界面程序zd_break_value +; /每300ms加一次if(zd_break_value 100) /30秒后自动退出设置界面menu_1 = 0; smg_i = 3;zd_bre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论