1.题目要求

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

2.main.c测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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; 
}
点赞(157)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)
#include<stdio.h>
int main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX