51单片机超声波测距l用cd1602显示程序
时间: 2023-08-29 16:07:35 浏览: 86
51单片机超声波测距,1602显示
以下是基于51单片机和CD1602液晶屏的超声波测距程序:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = "Distance: ";
void delay_us(uint us) //微秒级延时函数
{
while(us--)
{
_nop_();
_nop_();
}
}
void delay_ms(uint ms) //毫秒级延时函数
{
while(ms--)
{
delay_us(1000);
}
}
void write_com(uchar com) //写命令函数
{
P0 = com;
P2 &= ~0x01; //RS = 0
P2 &= ~0x02; //RW = 0
P2 |= 0x04; //E = 1
delay_us(10);
P2 &= ~0x04; //E = 0
}
void write_data(uchar dat) //写数据函数
{
P0 = dat;
P2 |= 0x01; //RS = 1
P2 &= ~0x02; //RW = 0
P2 |= 0x04; //E = 1
delay_us(10);
P2 &= ~0x04; //E = 0
}
void init_lcd() //LCD初始化函数
{
write_com(0x38); //8位数据接口,2行显示,5x7点阵字符
write_com(0x0c); //开显示,无光标,不闪烁
write_com(0x06); //文字不动,光标自动移动
write_com(0x01); //清屏
}
void init_timer() //定时器初始化函数
{
TMOD |= 0x01; //定时器0工作在模式1:16位自动重载定时器
TH0 = 0; //计时初值
TL0 = 0;
TR0 = 1; //启动定时器
}
uint get_distance() //获取超声波测距结果函数
{
uchar i;
uint distance;
for(i = 0; i < 5; i++) //进行5次测量取平均值
{
P1 = 0x01; //发射超声波脉冲
delay_us(20);
P1 = 0x00;
while(!P3_2); //等待接收到回波
TR0 = 0; //停止定时器
distance = (TH0 << 8) | TL0; //计算距离
distance /= 58;
TH0 = 0; //清零定时器
TL0 = 0;
TR0 = 1; //重新启动定时器
delay_ms(50); //延时50ms
}
return distance;
}
void main()
{
uchar i;
uint distance;
init_lcd();
init_timer();
while(1)
{
distance = get_distance();
write_com(0x80); //第1行第1个字符
for(i = 0; i < 10; i++) //显示"Distance: "
{
write_data(table[i]);
}
write_com(0x8a); //第1行第11个字符
write_data((distance / 100) % 10 + '0'); //百位
write_data((distance / 10) % 10 + '0'); //十位
write_data(distance % 10 + '0'); //个位
write_data('c'); //单位:厘米
delay_ms(500); //延时500ms
}
}
```
注:本程序使用的超声波模块为SR04,其中TRIG引脚接单片机的P1.0口,ECHO引脚接单片机的P3.2口,VCC和GND分别接单片机的5V和GND。CD1602液晶屏的RS、RW、E引脚分别接单片机的P2口的0、1、2位,D0-D7引脚分别接单片机的P0口。
阅读全文