经过一天的调试,终于把STC15F2K60S2单片机测量超声波HC-SR04的程序搞定,主要存在问题是:
1、单片机时钟设置为22.1184MHz,而且采取1T模式运行时,触发信号维持10us以上时间要采用延时函数 Delay_us(250)并一定达到10us以上。
2、等待回声接收的引脚echo要开启接收,即echo=1;
3、触发信号发出后不能马上开启计数器计数,一定要等到有回声信号时(echo被置为高)才开启,为了防止回声信号一直不出现,增加超时退出。
4、测量时间(echo维持高电平时间)也增加超时退出,否则程序出现死机。
5、禁止定时计数后要软件清除一次中断标志,因是检测到echo回声停止,此时不一定出现中断(默认中断清除)
6、为保证测量精度,TH1TL1中的计数值要减去初值并除以22,因计数22次为1us。
具体子函数如下:
/*------------------------------------------------
超声波模块触发信号
------------------------------------------------*/
void trigger()
{
trig=0;
NOP(21); //延时
trig=1;
Delay_us(250); //至少10us高电平
trig=0;
}
/*------------------------------------------------
超声波模块距离测试函数
------------------------------------------------*/
void measuring() //晶振22.1184MHz
{
uint Return_time; //超声波返回时间
uint Wait_time;
TL1 = 0x33; //设置定时初值 2ms定时
TH1 = 0x53; //设置定时初值
echo=1; //等待回声(开启输入)
trig=1; //初始状态
Ping_count=0; //时间计数初值
trigger(); //触发
Wait_time=0;
while ((!echo)&(Wait_time++<10000)); //触发后等待echo出现高电平或超时不出现高电平
TR1 = 1; //启动定时计数器T1
Wait_time=0;
while((echo)&(Wait_time++<10000)); //等待echo=0或超时不出现低电平
TR1 = 0; //停止计数
TF1 = 0; //因不是响应中断停止,故软件清除
Return_time = (TH1<< 8) + TL1;
Return_time = (Return_time - 0x5333)/22; //多计时us部分 计数22次为1us
Return_time = 2000*Ping_count + Return_time; //计算总时间,单位是微秒
distance = 34.0*Return_time/200; //计算距离为mm:(34毫米*时间/200)
}
|