51单片机超声波测距1602报警
时间: 2023-12-11 13:33:46 浏览: 136
基于提供的引用内容,我们可以了解到51单片机超声波测距1602报警的硬件组成和原理。下面是一个简单的实现过程:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5; // 蜂鸣器
sbit led = P1^6; // LED指示灯
sbit key = P3^2; // 按键
sbit RS = P2^6; // 1602液晶
sbit RW = P2^5;
sbit EN = P2^7;
void delay(uint x) // 延时函数
{
uint i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void write_com(uchar com) // 写命令函数
{
RS = 0;
RW = 0;
P0 = com;
EN = 1;
_nop_();
EN = 0;
delay(5);
}
void write_data(uchar dat) // 写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
_nop_();
EN = 0;
delay(5);
}
void init() // 初始化函数
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display(uchar *s) // 显示函数
{
while (*s != '\0')
{
write_data(*s);
s++;
}
}
void main()
{
uchar dis[16] = "Distance: ";
uint distance;
TMOD = 0x01; // 定时器1工作在模式1
TH0 = 0;
TL0 = 0;
while (1)
{
TRIG = 1; // 发送超声波
delay(10);
TRIG = 0;
while (!ECHO); // 等待接收超声波
TH0 = 0;
TL0 = 0;
while (ECHO); // 等待超声波结束
distance = TH0 * 256 + TL0; // 计算距离
distance = distance / 58;
dis[10] = distance / 100 + '0';
dis[11] = distance % 100 / 10 + '0';
dis[12] = distance % 10 + '0';
init();
display(dis); // 显示距离
if (distance < 30) // 距离小于30cm时报警
{
beep = 1;
led = 1;
}
else
{
beep = 0;
led = 0;
}
if (key == 0) // 按键按下时清空液晶
{
write_com(0x01);
delay(5);
}
}
}
```
上述代码实现了超声波测距并在1602液晶上显示距离,当距离小于30cm时蜂鸣器和LED指示灯会同时响起。按下按键时可以清空液晶。
阅读全文