1.题目要求
我们在第九章第3讲的例程基础上,实现用超声波模块模拟倒车雷达报警的功能,当障碍物距离超声波模块小于等于10cm左右我们就用蜂鸣器鸣叫产生报警,大于10cm就不报警。代码上添加的程序量比较少,我们只是把定时时间改为200微秒好使蜂鸣器鸣叫的比较尖锐。
2.main.c测试代码#include
#include //详见第六章第8讲
#include //详见第八章第11讲
#include
sbit TRIG = P2^0;
sbit ECHO = P2^1;
u8 FLAG=0,BEEP_FLAG=0;
void delay_20us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void main()
{
u16 time_data,CM_data;
TRIG = 0;
ECHO = 0;
LED_Init(); //初始化LED硬件模块
EA = 1; //闭合总中断开关
TIM1_Init(100,34); //定时100us,这是为了使蜂鸣器鸣叫的比较尖锐,34是微调使定时精度更高,每次微调都由中断函数里的内容而决定
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
while(1)
{
TH0 = 0;
TL0 = 0;
FLAG = 0; //上次如果是超出测量范围,FLAG被置1,这次再测就要清0
//启动发射声波
TRIG = 1;
delay_20us();
TRIG = 0;
while(!ECHO); //声波开始发射,ECHO引脚拉高退出这个循环
TR0 = 1; //打开定时器进行计数
while(ECHO); //收到声波返回来的信号引脚就拉低,退出这个循环,如果定时器溢出,就会进入中断函数执行“FLAG=1;”也就是距离太远,一直没有收到反射回来的信号
TR0 = 0; //关闭定时器结束计数
time_data =TH0;
time_data=(time_data<<8)|TL0; //把两个八位的寄存器里的值组成一个16位变量的值,也就是定时器计数值
CM_data = time_data/54; //得到厘米的表达式
if(FLAG==1){ShowNumber(999); delay_ms(20);} //超出测量范围显示999,延时为的是不让数码管频繁在两个数的偏差之间变化太频繁
else {ShowNumber(CM_data); delay_ms(20);}
if(CM_data<=10)BEEP_FLAG=1; //测距小于等于10CM蜂鸣器鸣叫
else BEEP_FLAG=0;
}
}
void TIM1_IRQHandler() interrupt 3
{
static u8 i=0;
TH1 = T1RH; //重新加载重载值
TL1 = T1RL;
i++;
if(i>=5){i=0; SEG_Scan();} //间隔1ms刷新数码管
if(BEEP_FLAG==1)BEEP=!BEEP;
}
void TIM0_IRQHandler() interrupt 1
{
FLAG=1;
}