单片机在REST端加一个大于20ms正脉冲即可实现复位,上电复位和按钮组合的复位电路图如图3.8.
在系统上电的瞬间,RST与电源电压同电位,随着电容的电压逐渐上升,RST电位下降,于是在RST形成一个正脉冲。只要该脉冲足够宽就可以实现复位。当人按下按钮SW1时,使电容C1通过R1迅速放电,待SW1弹起后,C1再次充电,实现手动复位。
图3.8 复位电路
3.6 时钟电路和蜂鸣器电路
3.6.1 时钟电路
单片机时钟电路是用来配合外部晶体实现振荡的电路,这样可以为单片机提供运行时钟,如果运行时钟为0的话,单片机就不工作,当然超出单片机的工作频率的时钟也会导致单片机不工作。
当使用单片机内部时钟电路时,单片机的XTAL1和XTAL2用来接石英晶体和微调电容,如图3.9.
图3.9 时钟电路
3.6.2 蜂鸣器电路
本次设计通过一只蜂鸣器来提示用户按键按下了,现在单片机开始了测距。蜂鸣器是一块压电晶片,在其两端加上3-5V的直流电压,就能产生3KHz的蜂鸣声,电路如图3.10.通过单片机软件产生3KHz的信号从P3.7口送到三极管9013的基极,控制着电压加到蜂鸣器上,驱动蜂鸣器发出声音。
图3.10 蜂鸣器电路
4 系统软件的设计
超声波测距仪的软件设计主要由主程序、超声波程序发生子程序、超声波接收中断程序及显示子程序组成。我们都知道单片机编程可以用C语言或者汇编语言来实现,但是哪种编程语言会比较好呢?
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。而C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此使用C语言进行程序设计已成为软件开发的一个主流,所以本设计使用C语言编写程序[13]。
4.1 超声波测距仪的算法设计
超声波测距的原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。距离的计算公式为:s=ct/2。其中s为被测物与测距仪的距离,c为声速,t为声波来回所用的时间。在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和接收到反射波的时间。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。
4.2 系统主程序
主程序主要是开始要对系统初始化,第一是设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;第二是调用超声波发生子程序循环发送4个40MKz的超声波脉冲,并开始计时。为了避免超声波从发射器直接传到接收器引起的直射波,需要延时约0.1ms后才可打开外中断0接收返回的超声波信号。第三是第三读取外界环境的温度,由该温度确定环境中的超声波传输速度。第四等待中断,若超声波被接收探头捕捉到,那么通过中断可测得超声波在环境中的传播时长。由于采用的是12MHz的晶振,计数器每计一个数就是1us,所以当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按测距公式计算,即可得被测物体与测距器之间的实际距离[14]。主程序流程图如图4.1所示。 AT89C51单片机的身高自动测量系统设计+Proteus仿真图(7):http://www.751com.cn/zidonghua/lunwen_9261.html