用单片机制作超声波测距的问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 09:37:05
制作个超声波测距的东东,实现功能:只要到达一定距离响应一定的动作就行
我编写程序的思路是:用定时器设定个时间(时间是根据要设定的距离算的,比如要设定为30CM,算出超声波发射到接受到的时间,是声波走60CM所用的时间,设定的初值就是定时器最大值减去这个时间),再启动定时器的时刻同时启动发射超声波.之后不断的检测P1.6和TF0位
如果在检测到P.6变为0之前,即接收到之前,定时器溢出,说明距离远于30CM
重新开始,如果定时器溢出之前,检测到P1.6接收到声波,说明距离小于30CM,就执行需要的子程序,比如使P1.4灯亮
例如:P1.5控制超声波发射,p1.6检测是不是接收到超声波,当检测到小于30CM时,接P1.4的灯变亮.程序如下:
START:LCALL DELAY;延时1秒
SETB P1.4
SETB P1.5
SETB P1.6 ;
MOV TMOD,#00H ;设置为方式0
;
MOV TH0,#84H ;装入初值(此处初值可能设为30CM的那个时间,只做示范用的)
MOV TL0,#3H ;

SETB TR0;将寄存器TCON的TR0位置1,启动T0开始工作
CLR P1.5;发射超声波
START1: JNB P1.6 ,HHH;判断P1.6是不是接收到,接收到为0就执行HHH,使P1.4变为0,灯亮,
;接收不到执行下条指令
JNB TF0,START1 ; 判断是否计时益处,没有溢出,则转到START1,继续查询,
;溢出了,执行下条,最后重新开始程序
CLR TF0 ;清除溢出位
CLR TR0;关闭定时
LJMP START:跳转重新开始
HHH:CLR P1.4 ;
DELAY: MOV R2, #10
DEL3: MOV R3,#200
DEL2: MOV R4,#125

没有打开EA总中断!
而且在HHH子程序结束后,没有跳转指令或等待指令,让程序无处运行。
感觉编的思路好像有点太费力了。
我的建议:
开机后把定时器设到定时时间长一些,先不开。
假如说,我们把定时器时间定为125ms,然后在定时器中断的程序中,先进行TH的恢复,再在里面设置某寄存器加1程序,后面会用到。
发送超声波后,紧跟着起动定时器,
起动完后,一直反复检查P1.6口是否收到,当收到后,关闭定时器,读出定时器的TH值以及中断里面寄存器的值,根据这两个值,不就可以算出比较准确的时间了吗?
而且这是一次性的,不需要在每个距离上试验。

可能是定时器发生了中断,程序跑到中断程序里了,并且清除了TF0标志.

发错地方了

发错了