51单片机超声波测距用lcd1602显示距离写个程序
时间: 2023-09-01 13:10:21 浏览: 103
51单片机超声波测距(LCD1602显示)
5星 · 资源好评率100%
以下是51单片机超声波测距并用LCD1602显示距离的程序:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6; //LCD1602控制引脚
sbit RW = P2^5;
sbit E = P2^7;
uchar count; //定时器计数器
uint distance; //测距距离
void Init_Timer0(); //初始化定时器0
void Start_Module(); //超声波模块开始测距
void Display_Distance(uint d); //在LCD1602上显示距离
void main()
{
Init_Timer0(); //初始化定时器0
while(1)
{
Start_Module(); //超声波模块开始测距
Display_Distance(distance); //显示距离
}
}
void Init_Timer0()
{
TMOD |= 0x01; //定时器0工作在模式1
TH0 = 0; //定时器0计数初值
TL0 = 0;
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
}
void Start_Module()
{
EA = 0; //关闭总中断
count = 0; //清零计数器
P0 = 0x01; //发送信号给超声波模块
delay(10); //等待10us
P0 = 0x00; //停止发送信号
while(!P1_2); //等待模块返回高电平
TR0 = 1; //启动定时器0
while(P1_2); //等待模块返回低电平
TR0 = 0; //停止定时器0
EA = 1; //开启总中断
}
void Display_Distance(uint d)
{
uchar temp[5] = {0}; //存放距离的数组
uint i = 0;
temp[0] = d / 1000; //计算千位数字
temp[1] = (d % 1000) / 100; //计算百位数字
temp[2] = (d % 100) / 10; //计算十位数字
temp[3] = d % 10; //计算个位数字
RS = 0; //写入命令
RW = 0;
E = 1;
P0 = 0x38; //设置8位数据总线,2行显示,5*7点阵
E = 0;
delay(5);
RS = 0;
RW = 0;
E = 1;
P0 = 0x0c; //开显示,不显示光标
E = 0;
delay(5);
RS = 0;
RW = 0;
E = 1;
P0 = 0x06; //写入数据后地址指针加1,不移动光标
E = 0;
delay(5);
RS = 1; //写入数据
RW = 0;
E = 1;
P0 = 'D'; //显示字符 D
E = 0;
delay(5);
RS = 1;
RW = 0;
E = 1;
P0 = 'i'; //显示字符 i
E = 0;
delay(5);
RS = 1;
RW = 0;
E = 1;
P0 = 's'; //显示字符 s
E = 0;
delay(5);
RS = 1;
RW = 0;
E = 1;
P0 = 't'; //显示字符 t
E = 0;
delay(5);
RS = 1;
RW = 0;
E = 1;
P0 = ':'; //显示字符 :
E = 0;
delay(5);
for(i=0; i<4; i++)
{
RS = 1;
RW = 0;
E = 1;
P0 = temp[i] + 48; //将数字转换为字符
E = 0;
delay(5);
}
}
void Timer0() interrupt 1
{
TH0 = 0; //定时器0计数初值
TL0 = 0;
count++; //计数器加1
if(count == 50) //超时
{
distance = 0xffff; //表示超时
count = 0; //计数器清零
TR0 = 0; //停止定时器0
}
}
void delay(uint i)
{
uint j, k;
for(j=0; j<i; j++)
for(k=0; k<100; k++);
}
```
以上程序中,需要按照实际情况修改以下内容:
1. LCD1602控制引脚的定义,根据实际电路进行修改。
2. P0口连接超声波测距模块,需要根据实际电路进行修改。
阅读全文