模拟倒车雷达报警

点击打开在线编译器,边学边练

1.题目要求

我们在第九章第3讲的例程基础上,实现用超声波模块模拟倒车雷达报警的功能,当障碍物距离超声波模块小于等于10cm左右我们就用蜂鸣器鸣叫产生报警,大于10cm就不报警。代码上添加的程序量比较少,我们只是把定时时间改为200微秒好使蜂鸣器鸣叫的比较尖锐。


2.main.c测试代码

#include <reg52.h> 
#include <function.h> //详见第六章第8讲
#include <timer.h>    //详见第八章第11讲
#include <intrins.h>

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; 
}

本文固定URL:https://www.dotcpp.com/course/403

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)