实现功能:
①超声波测距
②设置了一个报警阈值,小于这个范围蜂鸣器响、灯闪
③通过按键增减
#include "REG52.h"
#include "LCD1602.h"
#include "key.h"
#include "SR04.h"
#include "stdio.h"
sbit BEEP = P1^4; //蜂鸣器控制引脚定义
//液晶数字显示函数
static void Lcd_ShowNum(unsigned char x,unsigned char y,int Num);
unsigned int Time_Cot = 500; //定时器中断计数
unsigned int TimeAlarm = 0; //报警计数
//main函数
void main(void){
unsigned char Key_Num = 0; //按键
unsigned int Dis = 0; //超声波距离
unsigned int DisLimit = 50; //超声波报警距离
Key_Init(); //按键初始化
SR_Init(); //超声波初始化
Lcd1602_Init();
TMOD |= 0x01; //定时器0 工作方式一
TL0 = 0x18; //设置定时初始值 1ms
TH0 = 0xFC; //设置定时初始值
TR0 = 1;
ET0 = 1;
EA = 1;
//液晶显示初始化
Lcd1602_Display(0,0,"Disance:000CM");//显示距离
Lcd1602_Display(0,1,"Dis Lim:050CM");//显示报警阈值
while(1){
Key_Num = Key_Scan(); //读取按键值
if(Time_Cot >= 100){ //每100ms执行一次
Time_Cot = 0; //定时中断计数 清零
Dis = SR_Get(); //获取距离
Lcd_ShowNum(8,0,(int)Dis); //显示距离值
if(Dis < DisLimit){ //距离<报警阈值
TimeAlarm = (Dis * 100 / DisLimit) * 10; //根据距离计算蜂鸣器报警周期
}else{
TimeAlarm = 0;
}
}
switch(Key_Num){ //查询按键值10~400
case KEY_ADD: //+
if(DisLimit < 400) //报警阈值<400
DisLimit++; //报警阈值+1
Lcd_ShowNum(8,1,(int)DisLimit); //刷新阈值显示
break;
case KEY_SUB: //_
if(DisLimit > 10) //报警阈值>10
DisLimit--; //报警阈值-1
Lcd_ShowNum(8,1,(int)DisLimit); //刷新阈值显示
break;
}
}
}
//液晶数字显示函数
static void Lcd_ShowNum(unsigned char x,unsigned char y,int Num){
unsigned char ShowTemp[8];
sprintf(ShowTemp,"%03d",Num); //数值转化为字符串
Lcd1602_Display(x,y,ShowTemp); //数值刷新显示
}
//定时器0 中断入口函数
void Timer0Interrupt() interrupt 1
{
int Time = 0; //报警时间
TL0 = 0x18; //设置定时初始值 1ms
TH0 = 0xFC; //设置定时初始值
Time_Cot++; //定时器中断 + 1
if(TimeAlarm != 0){ //报警时间>0
Time++; //报警时间+1
if(Time < 100)
BEEP = 0; //打开蜂鸣器
else if(Time < TimeAlarm)
BEEP = 1;
else //报警事件不小于报警周期
Time = 0;
}else{ //报警周期为0
Time = 0;
BEEP = 1; //关闭蜂鸣器
}
}