用keil编写基于AT89C51超声波液位检测报警代码(带注释)
时间: 2023-11-28 17:47:22 浏览: 99
很高兴为您提供帮助,以下是基于AT89C51的超声波液位检测报警代码,带有注释。
```c
#include<reg52.h> // 引入AT89C51的头文件
#define SOUND_SPEED 340 // 声速,单位为m/s
#define TRIGGER_TIME 10 // 触发时间,单位为us
#define MAX_DISTANCE 400 // 最大检测距离,单位为cm
#define MIN_DISTANCE 5 // 最小检测距离,单位为cm
#define ALARM_DISTANCE 20 // 报警距离,单位为cm
sbit TRIG=P1^0; // 定义超声波发射端口
sbit ECHO=P1^1; // 定义超声波接收端口
sbit BUZZER=P2^0; // 定义蜂鸣器端口
void delay_us(unsigned int us) // 延时函数,单位为us
{
while(us--);
}
void delay_ms(unsigned int ms) // 延时函数,单位为ms
{
unsigned int i, j;
for(i=0;i<ms;i++)
for(j=0;j<114;j++);
}
void init() // 初始化函数
{
TMOD=0x01; // 定时器0工作在模式1,用于测量超声波信号宽度
TH0=0; // 定时器0计数器的高8位初始化为0
TL0=0; // 定时器0计数器的低8位初始化为0
TRIG=0; // 发射端口初始化为0
EA=1; // 开启总中断
EX0=1; // 开启外部中断0
IT0=1; // 外部中断0触发方式为下降沿触发
}
void main() // 主函数
{
unsigned int distance; // 定义距离变量,单位为cm
init(); // 初始化
while(1) // 无限循环
{
TRIG=1; // 发射超声波
delay_us(TRIGGER_TIME); // 延时10us
TRIG=0;
while(!ECHO); // 等待接收到回波信号
TR0=1; // 开启定时器0
while(ECHO); // 等待回波信号结束
TR0=0; // 关闭定时器0
distance=TH0*256+TL0; // 计算距离
distance=(unsigned int)(distance*SOUND_SPEED/20000); // 距离转换为cm
if(distance>MIN_DISTANCE && distance<MAX_DISTANCE) // 如果距离在有效范围内
{
if(distance<ALARM_DISTANCE) // 如果距离小于报警距离
BUZZER=1; // 鸣笛
else
BUZZER=0; // 不鸣笛
}
else
BUZZER=0; // 超出检测范围,不鸣笛
delay_ms(100); // 每隔100ms进行一次检测
}
}
void Int0() interrupt 0 // 外部中断0中断服务函数
{
TH0=0; // 定时器0计数器的高8位初始化为0
TL0=0; // 定时器0计数器的低8位初始化为0
}
```
以上是基于AT89C51的超声波液位检测报警代码,带有注释,希望能够帮助到您。
阅读全文