基于89c51单片机的超声波测距内容摘要:

宁科技大学本科生毕业设计 第 14 页 第四章 系统软件设计 软件分 为两部分,主程序和中断服务程序,如图 41 所示。 主程序完成初始化工作、超声波发射和接收, 距离计算、结果的输出。 外部中断服务子程序主要完成时间值的读取。 NO YES 图 41 主程序流 程图 外部中断子程序 计算距离 结果输出 定时器及中断初始化 发射超声波 开外部中断 指示灯闪烁 单片机初始化 DS18B20 初始化 开 始 收到回波。 辽宁科技大学本科生毕业设计 第 15 页 主程序首先是对系统环境初始化,设置定时器 T0 工作模式为 16 位定时计数器模式。 置位总中断允许位 EA。 然后给 Trig 一个 20us 的高电平,然后在 Echo 引脚等待其变为高电平,一旦输出了高电平,表明超声波已开始发射,此刻即计时,等待 Echo变为低电平,即触发外部中断 0 的跳变沿方式中断。 读取当前定时器的值,换算成时间,乘以温度补偿后的波速,即得到测距距离。 由于采用的是 的晶 振,计数器每计一个数大概就是 1μ s,当主程序检测到接收成功的标志位后,将计数器T1 中的数(即超声波来回所用的时间)按式 计算,即可得被测物体与测距仪之间的距离。 测出距离后结果将以十进制 BCD 码方式送往 LED 显示约 ,然后再发超声波脉冲重复测量过程。 为了有利于程序结构化和容易计算出距离,主程序采用 C 语言编写。 显示子程序 本系统的 LED 显示采用了动态显示方式,用两块 74HC573 分别选通段码和位码,没显示一根管延时 2ms,利用人眼的视觉暂留效应,达到静态显示的效果, C 程序如下。 void display(uint distance_date) { uchar dm, cm, mm。 dm=distance_date/100。 cm=distance_date%100/10。 mm=distance_date%10。 dula=0。 P0=table[dm]。 dula=1。 dula=0。 wela=0。 P0=0x7f。 辽宁科技大学本科生毕业设计 第 16 页 wela=1。 wela=0。 delay(2)。 dula=0。 P0=table1[cm]。 dula=1。 dula=0。 wela=0。 P0=0xbf。 wela=1。 wela=0。 delay(2)。 P0=table[mm]。 dula=1。 dula=0。 P0=0xdf。 wela=1。 wela=0。 delay(2)。 } 外部中断子程序 因本设计把数据换算,计算距离以及显示子程序都放在了主程序中,所以外部中断子程序比较简单,它实现了对 T1数值读取,以及关闭外部中断的功能。 流程图如图 42所示。 辽宁科技大学本科生毕业设计 第 17 页 图 42 外部中断程序流程图 c程序如下: INTO_() interrupt 0 { outeH =TH1。 outeL =TL1。 succeed_flag=1。 EX0=0。 } 测量温度子程序 测温电路由美国 DALLAS 公司的 DS18B20芯片完成,其初始化过程如下: DS18B20的初始化 ( 1) 先将数据线置高电平 “1”。 ( 2) 延时(该时间要求的不是很严格,但是尽可能的短一点) ( 3) 数据线拉到低电平 “0”。 外部中断入口 关外部中断 读取时 间值 返回 辽宁科技大学本科生毕业设计 第 18 页 ( 4) 延时 750微秒(该时间的时间范围可以从 480到 960微秒)。 ( 5) 数据线拉到高电平 “1”。 ( 6) 延时等待 (如果初始化成功则在 15到 60毫秒时间之内产生一个由 DS18B20所返回的低电平 “0”。 据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。 ( 7) 若 CPU 读到了数据线上的低电平 “0” 后,还要做延时,其延时的时间从发出的高电平算起(第( 5)步的时间算起)最少要 480微秒。 ( 8) 将数据线再次拉高到高电平 “1” 后结束。 DS18B20的写操作 ( 1) 数据线先置低电平 “0”。 ( 2) 延时确定的时间为 15微秒。 ( 3) 按从低位到高位的顺序发送字节(一次只发送一位)。 ( 4) 延时时间为 45微秒。 ( 5) 将数据线拉到高电平。 ( 6) 重复上( 1)到( 6)的操作直到所有的字节全部发送完为止。 ( 7) 最后将数据线拉高。 DS18B20的读操作 ( 1)将数据线拉高 “1”。 ( 2)延时 2微秒。 辽宁科技大学本科生毕业设计 第 19 页 ( 3)将数据线拉低 “0”。 ( 4)延时 15微秒。 ( 5)将数据线拉高 “1”。 ( 6)延时 15微秒。 ( 7)读数据线的状态得到 1个状态位,并进行数据处理。 ( 8)延时 30微秒。 根据读写操作,其流程图如 43 转换完毕 开始 初始化 初始化 写命令:跳过读序列号操作( 0XCC) 写命令:启动温度转换( 0X44) 温度转换结束。 写命令:读温度寄存器( 0XBE) 写命令:跳过读序列号操作( 0XCC) 写 EEPROM,存储结果 辽宁科技大学本科生毕业设计 第 20 页 图 43 DS18B20初始化流程图 具体的各部分 C程序如下: void dsreset(void) //send reset and initialization mand { uint i。 DS=0。 i=103。 while(i0)i。 DS=1。 i=4。 while(i0)i。 } bit tmpreadbit(void) //read a bit { uint i。 bit dat。 DS=0。 i++。 //i++ for delay DS=1。 i++。 i++。 dat=DS。 i=8。 while(i0)i。 return (dat)。 } uchar tmpread(void) //read a byte date { uchar i, j, dat。 dat=0。 for(i=1。 i=8。 i++) 辽宁科技大学本科生毕业设计 第 21 页 { j=tmpreadbit()。 dat=(j7)|(dat1)。 //读出的数据最低位在最前面,这样刚好一个字节在 DAT 里 } return(dat)。 } void tmpwritebyte(uchar dat) //write a byte to ds18b20 { uint i。 uchar j。 bit testb。 for(j=1。 j=8。 j++) { testb=datamp。 0x01。 dat=dat1。 if(testb) //write 1 { DS=0。 i++。 i++。 DS=1。 i=8。 while(i0)i。 } else { DS=0。 //write 0 i=8。 while(i0)i。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。