超声波探测仪的系统设计_第1页
超声波探测仪的系统设计_第2页
超声波探测仪的系统设计_第3页
超声波探测仪的系统设计_第4页
超声波探测仪的系统设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业论文(设计)论文题目:基于avr32单片机超声波测距仪的系统设计学生姓名:杨国学 号:0123576123所在院系:电气信息工程学院专业名称:自动化届 次:2012届指导教师:丁丽目 录前言31 超声波测距仪的整体方案和器件选择31.1超声波测距仪的测距原理31.2超声波测距仪的整体框架图31.3 ATMEGA32单片机的介绍41.4 CD4049芯片介绍61.5 DS18B20介绍61.6 显示液晶介绍72 超声波测距仪硬件电路设计72.1超声波发射电路的设计72.2超声波接收电路的设计92.3超声波温度补偿电路的设计102.4液晶显示电路的设计102.5报警电路的设计112.6系统整体

2、电路图113 超声波测距系统的软件设计123.1超声波测距仪的算法设计123.2超声波测距仪的主程序设计123.3超声波测距时间子程序设计133.4超声波温度补偿子程序设计143.5超声波液晶显示子程序设计154 系统调试及误差分析154.1仿真调试154.2程序编译调试174.3温度误差分析184.4干扰误差分析18总结18参考文献:182013届本科毕业论文基于avr32单片机超声波测距仪的系统设计学生:杨国(指导老师:丁丽)(电气信息工程学院)摘要:超声波技术是一种很好的非接触式的检测方式,其工作原理是:换能器将电信号转换成超声波信号发射出去,超声波遇到被测物体时,会被物体反射一部分回去

3、,回波作用在换能器上,转换成电信号,进而被识别。测出发射超声波到超声波遇到被测物体折返所需的时间t,那么超声波单程的时间(t/2)与声速的乘积就是我们所要测量的距离。本课题使用AVR ATmega32单片机作为控制系统,用单片机设置发射的波形,对接收电路接收的波形进行识别、处理,结合DS18B20测出的温度值,对测量结果进行修正,用液晶显示测量距离和当前温度,并设置有报警功能。关键词:超声波;非接触;测距;报警Based on avr32 Microcontroller Design of The Ultrasonic Range FinderAbstract: Ultrasonic tech

4、nology is a good way of non-contact detection.Its working principle is: The transducer converts electrical signals into the ultrasonic signal is emitted, ultrasonic encounter when the object to be tested, part of ultrasonic will be reflected by the object back and echo effect on transducer, converte

5、d to electrical signals, and then identified. Side of launch ultrasonic wave is measured by ultrasonic turn-back time required t object to be tested, so ultrasonic one-way time (t/2) with the velocity of sound is the product of what we're measuring distance. This topic using AVR ATmega32 single-

6、chip microcomputer as the control system, using single-chip microcomputer set launch waveform, the waveform of receiving circuit to receive recognition and processing, combined with DS18B20 measured temperature value, the measurement results are correct, the liquid crystal display (LCD) was used to

7、measure distance and the current temperature, and set the alarm function.Keywords: ultrasound; non-contact; distance measurement; alarm前言随着科技的发展,测距技术的应用越来越广泛, 它还可以同其他测距技术结合,利用各自的优点,开发出多功能测距仪。但就目前的测距水平,可利用的、经济的、高精度的、智能化的测距仪器还是非常少的。正是如此,给这个本来就蓬勃发展的领域增添了更多无限前景。在城市里拥挤的停车位,对于新手司机朋友来说,经常会由于进出停车场,而发生车辆间的擦伤

8、,碰撞的现象;比如倒车、入库和装卸货物时,小型汽车都比较困难,大型汽车可想而知,这些不仅需要考验驾驶员高超的驾驶技能和经验,还需要有细心和耐心,要是碰上不利状况,如下雨,夜晚等情形,还会增加更多的难度1。超声波测距是一种非接触检测技术2,它在新兴行业中也取得广泛的应用,还有现在特别流行的智能机器人设计中,也不乏看到超声波测距技术的身影。比如在机器人的视觉系统3中,如何获取前方障碍物的具体位置,从而可以顺利的行走。其中常用的就是利用超声波对其进行检测,这一点就如我们所熟知的蝙蝠和海豚的定位系统。超声波是频率超过20kHz的声波,我们知道,频率越高,它的衍射性越差,也就是它的指向性比较好。目前非接

9、触测量4主要是红外线、激光、雷达、超声波等。众所周知,红外线测量距离比较短,不利于较大距离的测量;而雷达、激光的设备大,携带不便,造价高;综合之下,超声波测距仪有着相对优势之处。常见超声波传感器有流体力型超声波传感器和电声型超声波传感器,简单的说,流体力型中又包括两种,气体型和液体型两种类型。由于应用目的和工作频率不同,超声波测距仪结构形式丰富、多种多样,同样,不同的方法有着不同的优缺点,那就要看设计者的设计需求了,对此各生产厂家的命名也不尽相同。1 超声波测距仪的整体方案和器件选择1.1超声波测距仪的测距原理超声波传感器其实就是一种能量转换装置,将电能和机械能(机械波的形式)相互转化,而当发

10、射超声波的时候,将电能转机械波,进行发射;而在接受回波的时,则将声波振动的能量转换成电信号,以达到检测目的。 对此,常用渡越时间检测法6进行距离的测量。测出发射超声波到超声波遇到被测物体折返所需的时间t,那么超声波单程的时间(t/2)与声速的乘积就是我们所要测量的距离。脉冲信号接发收波形见图1所示。图1 信号的发送和接收处理令V为声速, t是时间差, 为距离S,可得如下式子: S=V*t/2 (公式1)式中V为超声波的传播速度,单位 m/s。温度对声速的影响也是很大的,现又知声速与温度的关系如下:V=331.4+0.606*T (m/s) (公式2)其中,T为当前环境温度,单位。由上述两式,可

11、知:S=(165.7+0.303*T )*t (m) (公式3)1.2超声波测距仪的整体框架图整体的设计框架图如下图2所示,控制核心为AVR ATmega327单片机,单元模块有温度传感器电路,超声波发射和接收电路,液晶显示电路以及蜂鸣器报警电路。图 2 总体电路框架图1.3 ATMEGA32单片机的介绍ATmega32是ATMEL8公司开发的一种基于增强RISC结构的、低功耗、CMOS技术、8位微控制器的AVR单片机。图3为40引脚的封装实物图。图 3 ATmega32封装图ATmega32单片机的主要特点:(1) 它的CPU采用先进的RISC结构执行指令的时间特别快,大多只需一个时钟周期,

12、共有131条机器指令;拥有32个8位通用工作寄存器;在16MHz时具有16MIPS的性能;只需要配备2个时钟的硬件乘法器。(2) 片内数据存储器比较大32KB在线可编程Flash程序存储器,采用Boot Load技术支持IAP功能;为了实现更高的保密程度,片内集成了SRAM数据存储器,拥有1KB的存储空间,这样就可以烧写更多的加密程序,一共可以实现3级锁定加密; (3) JTAG接口利用标准化的JTAG接口,可以很好的实现在线调试的功能,同时我们还可以通过JTAG口设定ATmega32单片机内的一些相关设置,这一点是沿承了其之前的AVR的优点。(4) 外围接口相比于AVR ATmega8单片机

13、,AVR ATmega32 的接口功能显得很强大,拥有8路10位的A/D转换器,分辨率可以达到1/1024;对于晶振,它的内部自带有独立的振荡器,可以不需外接晶振,就可以实现相关功能,不过其内部晶振比较低;它还有4个可以产生PWM波的通道,经过对其设置,可以发出我们想要得到的信号脉冲,借此,我们可以利用它来发射超声波脉冲;不仅如此,它在片内还设置了单端通道,共有8个;片内不仅有两个8位常规的定时器/计时器;还配置了一个高性能的,具有捕捉和比较功能的16为定时器/计时器,最大值可以计到65535;有一个SPI串行接口,用来对单片机工作模式的切换,可以选择是主机模式,还是从机模式;跟其他单片机一样

14、,ATmega32片内也配置了一个看门狗定时器,它是可以编程的,并且有自己的独立振荡器,实时的监测单片机的运行状况。考虑到信号的衰弱现象,还配置了2 个可编增益的差分通道,能够把增益设置为1倍,10倍和200倍。(5) 其他特点内部和外部可利用的中断源有很多,各种类型的加起来有21个;还有可编程的掉电检测复位电路的加入,扰我们可以自助设置复位门限电压,让单片机的工作电压范围更多元化;还有可以校正的RC振荡回路,这个经常作为ATmega32单片机自己系统的时钟使用。(6) 运行特性电压范围宽。运行速度:ATmeaga32L型单片机频率是08MHz,ATmeaga32型单片机频率是016MHz。另

15、外,低功耗。(7) 芯片引脚和封装形式封装的形式,根据引脚数来区分:40引脚的封装形式有PDIP封装,44引脚的封装形式有TQFP封装MLF封装两种。1.4 CD4049芯片介绍CD4049是一个反相缓冲器,如果我们要拿它来实现转换逻辑电平时,我们对其输入的高平电压一定要高于它的电源电压,这样它才能进行转换。这样我们也就知道了它的供电电压,在本设计的电路中至少要大于5V。对于超声波发射电路,我们需要将信号放大,在放大的同时还要考虑到波形的问题,不能失真,要不然即使回波传到了我们的接收电路里,我们也无法识别,无法正确及时地判别超声波返回的时间事多久,这样,我们下面的工作也都无法进行下去。由此,我

16、们对这一块芯片选择很重要,一定要能达到我们的设计要求才行。另外,74LS04也是一款很好的反相器,也常用于放大电路的设计当中,但它只能在5V电源下正常工作,相比之下,CD系列可适应供电电压范围更大,但工作电流较74LS04要小,综合考虑之后,我还是认为使用CD4049芯片给发射超声波信号进行放大比较好,故此,我选择使用CD4049。1.5 DS18B20介绍1.5.1 DS18B20的主要特性DS18B209是我在Proteus课程里学习到的一款测温芯片,它小巧,经济,接口电路简单,加上我对这款芯片比较了解,所以我就选用了它来进行对环境温度的实时测量。DS18B2010是一款高度集成的芯片,封

17、装外观酷似一个三极管,只有三个引脚,在使用时不需要外围电路,可以大大简化了我们的电路设计构架。它可测量的温度范围也很大,在-10+85这么大的区间内误差也仅在±0.5。该芯片的耐压性能也做的特别好,即使不小心把电源的正负极接反了,也不会将它损坏,只是不能正常工作而已,电源正确连接后又可以正常进行工作。DS18B20封装如图4所示:图 4 DS18B20封装图片1.5.2 DS18B20的内部结构DS18B2011内部结构如图5所示,由图中我们可以知道,它最重要的部分是高速缓冲存储器,64光刻ROM ,温度灵敏元件,高低温触发器和配置寄存器。图 5 DS18B20内部结构图1.6 显示

18、液晶介绍显示方面,有三种器件可供选择,分别为数码管,LCD1286412和LCD1602。其中数码管显示方式最为简单,但是界面很单调,不美观。LCD12864是一种可以显示汉字式的LCD,他可以显示4行汉字等其他字符。对但我只需要显示两行文字即可,一行温度,一行距离。综合考虑到美观、实用、成本等因素,LCD1602是理想选择。对于LCD1602这种的点阵型液晶模块,可以用ATmega32单片机直接驱动它。它每行可以显示16个字符,如果不能完全显示出你想要书写的内容,还可以对它的显示模式进行设置,改变成流动显示,这样就可以显示出所有的字符。实物见图6如下:图 6 LCD1602液晶图片2 超声波

19、测距仪硬件电路设计2.1超声波发射电路的设计我想到了两种可发射超声波电路,下面是我对这两种电路的比较与选择。T40-16是一种反馈型耦合元器件,在我们的电路里面充当的是输出换能器的角色,负责把超声波信号不是真的放大的同时,发射出去。让S1按键开关控制外部电源电压,把S1按下,便能使T40-16经供电发射处超声波信号。经过测算,该电路中的工作电流大约为25mA,电路设计13如图7所示。图 7 基于T40-16的超声波发射电路第二种电路,由我们的ATmega32单片机产生40KHz方波信号,但是单片机输出的信号很弱,在输出到发射头之前,要经过CD4049放大,以利于产生的超声波的回波,这样更容易被

20、我们的超声波接受电路所接收。其中CD4049是反相缓冲器,针对下图中的电路,我们把超声波脉冲信号分成了两路。在设计电路的末端加两个上拉电阻,R10和R11的加入,不仅拉高驱动能力,增大信号的幅值,还可以增加超声波换能器的阻尼效果,缩短自由振荡时间,防止超声波波形经放大失真。电路设计14见图8所示。图 8 基于CD4049的超声波发射电路2.2超声波接收电路的设计CX20106A介绍第1引脚IN:输入阻抗较大,在40k左右。第2引脚AGC:此引脚与地之间连接成一个RC串联网络,组成负反馈串联网络的一部分,前置放大器的增益和频率特性可以通过改变他们的数值进行改变。要想使负反馈量增大,放大倍数减小,

21、只需增大电阻R或减小电容C;反之,减小电阻值或增大电容值,放大倍数增大。一般情况下,不要改变调整电容的大侠,这样会影响频率特性。第3引脚C0:在与地相连之前要连接一个极性电容,这个电容是一检波电容,根据电容值的大小分为两种检波方式。电容比较小时,此时灵敏性比较高,脉冲宽度会变大,容易被其他波干扰,易发生误动作,此时叫做峰值检波;当电容值比较大时,不易发生误动作,但灵敏度比较低,被称为平均值检波。对此,兼顾灵敏度和减小误动作的发生,我们常设定电容值的大小为3.3F。第4引脚GND:接地。第5引脚RC0:串接一个电阻后与电源端相连。第6引脚C:连接一个积分电容之后接地,该电容的接入影响探测的距离。

22、当电容越小,探测距离就会越大;反之,探测距离减小。常接入的玷辱标准值为330pF。第7引脚OUT:作为遥控命令的输出端,在这里接入一个上拉电阻,以增加它的驱动能力。第8引脚RC1接电源正极。电路设计15见图9所示。图 9 超声波接收电路2.3超声波温度补偿电路的设计2.3.1 DS18B20的引脚说明第1引脚(GND):接地。第2引脚(DQ):数据输入输出端口。第3引脚(VDD):接电源。2.3.2 DS18B20的初始化1.将数据线置高电平,延时一段时间,将数据线拉到低电平。2.延时480960微秒,再把数据线拉到高电平。3.当初始化结束之后,通过检测DS18B29是否发出低电平,进而判断初

23、始化是否成功。4.为了不让检测程序进入死循环,需设定延时等待时间,需再次把2引脚拉高到高电平后才能结束。温度传感器引脚接线如图10所示:图10 温度传感器DS18B20电路虽然DS18B20温度传感器的连接线路比较简单,但是由于温度对我们的测量值是有比较大的影响的,它所测环境中实时的温度值,对我们修正测量值来说可以提供很大的帮助。2.4液晶显示电路的设计1602的接口方式如图12所示:1脚:接地端。2脚和15脚:接5V的正向电源。3脚:接一个10K左右的滑动变阻器,然后与地相连,通过对滑动变阻器的值的改变,进行对液晶屏幕的亮暗进行调节,调到合适位置即可。第4脚:可以通过对其赋高电平还是低电平,

24、进而选择寄存器的工作状态。5脚:接地置低电平,进行写操作。6脚:使能端,高电平时读信息,下降沿触发时执行指令。1114脚:数据传输。16脚接地。LCD1602的接线方式如图11所示:图11 LCD1602液晶接线电路2.5报警电路的设计声音是一种波,是由于物体振荡而产生的,蜂鸣器的发声原理很简单,只要通过持续的高低电平,带动蜂鸣器间歇性的工作,从而产生振动频率,就可以发声。通常利用软件编程给蜂鸣器提供持续的方波信号,在经过外接放大电路,驱动蜂鸣器。蜂鸣器是个电感型元件,为了防止它产生的瞬间电流击穿驱动三极管,它两端可以产生瞬间达几十伏的电压,为了保护好三极管,最好要在其电路中设置一个保护电路,

25、用一种最简单,最实用,也是最容易的办法,就是用一个二极管串接在电路里,便能达到所要的效果。否则,可能烧坏用来驱动的三极管,甚至可能会干扰该电路系统的其它部件。蜂鸣器电路接线如图12所示:图12 蜂鸣器报警电路2.6系统整体电路图将以上部件组装,制作出的超声波设计原理图,如下图13所示:图13 超声波测距仪整体电路图3 超声波测距系统的软件设计3.1超声波测距仪的算法设计超声波测距的原理为:换能器将电信号转换成超声波信号发射出去,超声波遇到被测物体时,会被物体反射一部分回去,回波作用在换能器上,转换成电信号,进而被识别。测出发射超声波到超声波遇到被测物体折返所需的时间t,那么超声波单程的时间(t

26、/2)与声速的乘积就是我们所要测量的距离。由前面的推导可知,距离S的计算公式为:S=(165.7+0.303*T )*t (m) (公式4)其中,S为被测物与测距仪的距离,T为环境温度,t为声波来回所用的时间。3.2超声波测距仪的主程序设计首先初始化,设置计时器工作模式为16位的定时器,并且设置计数初值,接着发射40kHz的超声波。一旦检测到接收成功的标志位,立即停止计数,将计数器中的数减去计数初值(即超声波来回所用的时间t),同时将DS18B20所测的温度值,进行温度补偿,代入计算公式S=(165.7+0.303*T )*t (m)。测量距离后结果转换成十进制,然后传送给LCD1602进行显

27、示温度值和测距值。然后等待进行下一次距离的测量,当距离超出设置的最小距离后,启动蜂鸣器进行报警。设计流程图如图14所示:图 14 主程序设计流程图3.3超声波测距时间子程序设计超声波脉冲一发射,计数器就开始计数,同时单片机不停检测PD1,判定其是否为低电平,一旦变为低电平,说明单片机接收到了折返的超声波信号,程序就进入中断程序,同时关闭定时器,定时器停止计时,再把计数差计算出来,待传送到主程序中进行计算。但考虑到在Proteus仿真图中,无法向实物发出超声波,进而也就没有反射回波的存在,为了演示出超声波接发送效果,我用了两个按键进行替代,模拟出超声波的发射和接收的时间差,从而将仿真继续演示下去

28、,对此,在课题的后半部分也有说明,对此,特声明,以下的程序流程图设计是基于制作实物的设计,而我这次仿真的设计另有差异,具体仿真中的程序可查看附件2。测距时间子程序流程如图15所示:图 15 测距时间子程序流程图3.4超声波温度补偿子程序设计温度补偿子程序流程如图16所示:图16 温度补偿程序流程图3.5超声波液晶显示子程序设计液晶显示子程序流程如图17所示:图17 液晶显示程序流程图4 系统调试及误差分析4.1仿真调试仿真之前有几点说明,由于没有做实物,只能用Proteus或其他仿真软件进行仿真测量实验。对此,也就无法产生真正的超声波,也就无法接收经过被测物体反射回波。但是从超声波测距原理S=

29、(165.7+0.303*T )*t (m)中,我们可以清楚的知道,其实,只有两个未知变量,一个是温度T,另一个是时间差t。温度可以在DS18B20中的属性中任意设置,可以做到模拟不同温度时,对测距的影响。现在就差t无法解决,为此,提出一个方案,用两个按键模拟超声波的发射和接收装置,一个按下表示发射超声波,另一个按下表示检测到了超声波,通过测量两个按键的时间差t来替换我们所要测量的时间差。解决了这个问题之后,现象会有一点变动,因为我们手动去按两个按键的时间差,相对真正的测量时间会偏大,而声波的速度又很快,在340m/s左右。所以,液晶上显示的测量数字会比较大,而显得好像出错了,为了避免引起不必

30、要的误解,故在此特别指出。正常测距状态如图18所示:图18 正常测距时图片相应的,为了检测我的报警功能,我在程序中设置的报警距离为500,以便我可以在手动按按键的情形下触发报警,更好地检测我的报警功能是否健全。此时蜂鸣器会报警的同时,液晶第二行也会显示“dangerous”进一步提醒,当我们想重新测量下一组数据时,只要按下复位按钮复位即可。当距离过小时,如图19所示:图19 测距过小时图片4.2程序编译调试ICCAVR编译软件具有功能全面、简单易学、技术支持性好等特点。我们不仅可以在ICCAVR中编写,编译程序,还可以在编写完成之后,对程序进行软仿,一步一步的调试我们的程序,有利于我们找到那些

31、不易发现的错误。在编译出错时,在错误状态窗口中,单击错误语句,就可以快速找到错误程序行,减小了在繁多的程序行中查找错误的繁重工作量。ICCAVR可以直接编译生成HEX文件,这是一种可以直接给单片机烧写的文件,将生成的HEX文件导入Proteus的模拟单片机,通过仿真效果的演示,就可以判别我们的编写程序是否可以达到我们的设计要求。ICCAVR是一个32位的程序,支持长文件名,如下图20所示。图20 ICCAVR中程序编译4.3温度误差分析至于温度因素,我在前面也详细的说明了。比如设计的测距器在程序编写时如果声速统一采用340m/s的话,测量10m距离时,结果在0(此时实际声速为323m/s)和3

32、0(此时实际声速为349m/s)的最大误差为d=(349-323)*10/340 m=0.765m,显然误差已经很大了,所以我们对温度进行测量,可知修正测量值,这一步骤是很有必要的。4.4干扰误差分析我们知道,电路之间由于电生磁,磁生电,经常会发生个电路部分相互干扰的现象,假如设计中发射电路和接收接收相距较近,这样发射端发射超声波后,会有部分超声波经过障碍物反射就直接绕射到接收端上了,这部分接收的信号显然是无用的,必然会引起系统误差,但是这种误差却是不可避免的。我们可以在程序中利用延时来解决这个问题,所以会存在盲区问题。总结本次设计是基于ATmega32的超声波测距系统,发射和接收信号的时间差

33、的测量、温度修正以及抗干扰是本设计的重点和难点。一开始,单片机通过内部程序,由PD0发出40kHz方波脉冲,约12微秒。然后经CD4049反相器放大,发射出去,同时计时器开始计时。DS18B20把环境温度采集过来,把时间和温度代入计算公式(当然,这是在程序中进行二进制的运算),计算出距离。再将其数值转换成十进制数在LCD1602上显示,同时设置蜂鸣器报警值。这就完成了本课题的完整流程。通过系统设计制作的过程,让我对AVR单片机更熟悉了,更重要的是对超声波测距系统有了比较深刻的理解,给我很多的灵感,相信必定会给我以后的发展带来很大的帮助。参考文献:1 袁佑新,吴妍,刘苏敏,等.可视汽车倒车雷达预

34、警系统设计J.微计算机信息,2006,10(3):2831.2 栾桂东,等.传感器及其应用M.西安.西安电子科技大学出版社,1996:6769.3 宗光华机器人的创意设计与实践M北京:北京航空航天大学出版社,2004:5156.4 孟立凡,等.传感器原理及技术M.北京:国防工艺出版社,2005:1211255 张谦琳,等.超声波检测原理和方法M.北京:中国科技大学出版社,1993:2830.6 卜英勇,何永强,等.一种高精度超声波测距仪测量精度的研究J.郑州大学学报(工学版),2006(12):101106.7 徐玮,等.AVR单片机快速入门M.机械工业出版社,2011,11:7883.8 何

35、立民,等.AVR单片机原理与接口技术M.北京航空航天大学出版社,2002:6366.9 贾振国,等.DS1820及高精度温度测量的实现J.电子技术应用,2000,1(5):2528.10 周月霞,孙传友,等.DS18B20硬件连接及软件编程J.传感器世界,2001,12(15):4347.11 徐煜明,韩雁,等.单片机原理与接口技术M.电子工业出版社,2005:7377.12 胡汉才,等.单片机原理与接口技术M.北京:清华大学出版社,1996:3739.13 康华光,等.电子技术基础(模拟部分)M.高等教育出版社,2006:192195.14 康华光,等.电子技术基础(数字部分)M.高等教育出

36、版社,2006:154158.15 邱光源,等.电路基础M.北京:高等教育出版社,1998:5558.16 侯宝玉,等.基于Proteus的51系列单片机设计与仿真M.电子工业出版社,2008,9:7374.17 谭浩强,等 C程序设计M 清华大学出版社,2005:21321719附录附录1 PROTEUS仿真电路图图21 Proteus中完整仿真图附录2 C语言程序主程序17如下:#include <iom16v.h>#include "ds18b20.h"#include "1602.h"#define CLR_DIR_1WIRE DDR

37、B&=BIT(7) #define SET_DIR_1WIRE DDRB|=BIT(7) #define CLR_OP_1WIRE PORTB&=BIT(7) #define SET_OP_1WIRE PORTB|=BIT(7) #define CHECK_IP_1WIRE (PINB & 0x80) /检测 unsigned char time=0;unsigned char start=0;unsigned int ct=0;unsigned char flag=0;float dis=0;void init_1820() SET_DIR_1WIRE; /设置PC2

38、 为输出 SET_OP_1WIRE; CLR_OP_1WIRE; delay_nus(580); /最好在480us以上 SET_OP_1WIRE; CLR_DIR_1WIRE; delay_nus(25); /1560us while(CHECK_IP_1WIRE); SET_DIR_1WIRE; SET_OP_1WIRE; delay_nus(140); /60240us /写18B20 void write_1820(unsigned char x) unsigned char m; for(m=0;m<8;m+) CLR_OP_1WIRE; if(x&(1<<

39、m) /开始写数据,先写低位的写 SET_OP_1WIRE; else CLR_OP_1WIRE; delay_nus(40); /1560us SET_OP_1WIRE; SET_OP_1WIRE; /读18B20unsigned char read_1820() unsigned char temp,k,n; temp=0; for(n=0;n<8;n+) CLR_OP_1WIRE; SET_OP_1WIRE; CLR_DIR_1WIRE; k=(CHECK_IP_1WIRE); /读数据,从低位开始 if(k) temp|=(1<<n); else temp&=

40、(1<<n); delay_nus(80); /60120us SET_DIR_1WIRE; return (temp); /读取温度值 并送显示缓冲unsigned int gettemp() unsigned char temh,teml; unsigned int t; init_1820(); /复位18b20 write_1820(0xcc); / 发出转换命令 write_1820(0x44); delay_nms(200); /不延时也可以,但有时可能会出现死机现象 init_1820(); write_1820(0xcc); /发出读命令 write_1820(0x

41、be); teml=read_1820(); /读数据 temh=read_1820(); t = temh; t = t << 8; t = t + teml; t = t * 10 /16; return t; unsigned int tempture=0;void main() LCD_init(); MCUCR = 0x0A; GICR = 0xC0; TIMSK = 0x01; /timer interrupt sources SEI(); /re-enable interrupts DDRA=0X01; PORTA=0xff; PORTD=0XFF; DDRD=0X0

42、0; LCD_write_string(0,0,"temperature:"); while(1) tempture=gettemp(); tempture/=10; LCD_write_char(12,0,tempture/10+'0'); LCD_write_char(13,0,tempture%10+'0'); LCD_write_char(14,0,0xdf); LCD_write_char(15,0,'C'); if(PIND&(1<<PD0)=0) if(start=0) start=1; TC

43、NT0 = 0x8B; /set count OCR0 = 0x75; /set compare TCCR0 = 0x05; flag=1; if(PIND&(1<<PD1)=0) if(start=1) TCCR0 = 0x00; dis=(331.4+0.607*tempture)*ct*0.01; ct=0; if(flag=1) flag=2; start=0; if(flag=2) if(dis<500) PORTA=0x00; delay_nms(10); PORTA=0xff; LCD_write_string(0,1,"dangerous &

44、quot;); else PORTA=0XFF; LCD_write_string(0,1,"distance:"); else PORTA=0XFF;LCD_write_string(0,1,"distance:"); LCD_write_char(9,1,(unsigned int)dis/10000+'0'); LCD_write_char(10,1,(unsigned int)dis%10000/1000+'0'); LCD_write_char(11,1,(unsigned int)dis%10000%1000/

45、100+'0'); LCD_write_char(12,1,(unsigned int)dis%10000%1000%100/10+'0'); LCD_write_char(13,1,(unsigned int)dis%10+'0'); LCD_write_char(14,1,'c'); LCD_write_char(15,1,'m'); #pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) /external interupt on INT0#

46、pragma interrupt_handler int1_isr:iv_INT1void int1_isr(void) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVFvoid timer0_ovf_isr(void) TCNT0 = 0x8B; ct+;LCD1602液晶的头文件如下:#define LCD_EN_PORT PORTC /以下2个要设为同一个口#define LCD_EN_DDR DDRC#define LCD_RS_PORT PORTC /以下2个要设为同一个口#define LCD_RS_DDR DDRC#defi

47、ne LCD_DATA_PORT PORTC /以下3个要设为同一个口#define LCD_DATA_DDR DDRC /默认情况下连线必须使用高四位端口,如果不是请注意修改#define LCD_DATA_PIN PINC#define LCD_RW_PORT PORTC#define LCD_RW_DDR DDRC#define LCD_RW_PIN PINC#defineLCD_RW (1<<PC6)#define LCD_RS (1<<PC4) /0x20 portC6 out#define LCD_EN (1<<PC5) /0x40 portC7

48、 out#define LCD_DATA (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3) /0xf0 portA 4/5/6/7 out#define RW_SET LCD_RW_PORT|=LCD_RW#define RW_CLR LCD_RW_PORT&=LCD_RW#define RS_SET LCD_RS_PORT|=LCD_RS#define RS_CLR LCD_RS_PORT&=LCD_RS #define EN_SET LCD_EN_PORT|=LCD_EN#define EN_CLR LC

49、D_EN_PORT&=LCD_ENvoid busy_check();void LCD_init(void);void LCD_en_write(void);void LCD_write_command(unsigned char command) ;void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);void LC

50、D_write_char(unsigned char X,unsigned char Y,unsigned char data);/-#include <macros.h>#include "delay.h"void busy_check() RS_CLR;RW_SET;LCD_DATA_PORT&=0xf0;EN_SET;delay_nus(10);while(!(LCD_RW_PIN&LCD_RW);EN_CLR;LCD_DATA_PORT|=0X0F;void LCD_init(void) /液晶初始化 LCD_DATA_DDR|=LCD_

51、DATA; /数据口方向为输出 delay_nus(40); LCD_EN_DDR|=LCD_EN; /设置EN方向为输出 delay_nus(40); LCD_RS_DDR|=LCD_RS; /设置RS方向为输出 delay_nus(40); LCD_write_command(0x28); LCD_en_write(); delay_nus(40); LCD_write_command(0x28); /4位显示 LCD_write_command(0x0c); /显示开 LCD_write_command(0x01); /清屏 delay_nms(2); void LCD_en_write

52、(void) /液晶使能 LCD_EN_PORT|=LCD_EN; delay_nus(40); LCD_EN_PORT&=LCD_EN;void LCD_write_command(unsigned char command) /写指令 LCD_RS_PORT&=LCD_RS; /RS=0 delay_nus(40); LCD_DATA_PORT&=0xf0; /清高四位 delay_nus(40); LCD_DATA_PORT|=(command>>4)&0x0f; /写高四位 delay_nus(40); LCD_en_write(); del

53、ay_nus(40); LCD_DATA_PORT&=0xf0; /清高四位 delay_nus(40); LCD_DATA_PORT|=command&0x0f; /写低四位 delay_nus(40); LCD_en_write(); void LCD_write_data(unsigned char data) /写数据 delay_nus(16); LCD_RS_PORT|=LCD_RS; /RS=1 delay_nus(40); LCD_DATA_PORT&=0Xf0; /清高四位 delay_nus(40); LCD_DATA_PORT|=(data>>4)&0x0f; /写高四位 delay_nus(40)

温馨提示

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

评论

0/150

提交评论