51单片机超声波测距用lcd1602显示距离写个程序
时间: 2023-08-30 20:04:04 浏览: 34
这里提供一个简单的基于51单片机和超声波传感器测距的程序,使用LCD1602显示距离。
```
#include <reg52.h>
#include <intrins.h>
#define LCD_DATABUS P0
sbit LCD_RS = P2^0; //液晶屏RS引脚
sbit LCD_RW = P2^1; //液晶屏RW引脚
sbit LCD_EN = P2^2; //液晶屏EN引脚
sbit TRIG = P3^5; //超声波模块TRIG引脚
sbit ECHO = P3^2; //超声波模块ECHO引脚
unsigned int distance;
unsigned char disStr[5];
void writeCommand(unsigned char command);
void writeData(unsigned char dat);
void initLcd(void);
void delayMs(unsigned int ms);
void delayUs(unsigned int us);
void sendTriggerSignal(void);
void main()
{
initLcd();
while(1)
{
sendTriggerSignal();
while(!ECHO); //等待ECHO变高
while(ECHO); //等待ECHO变低
distance = TH0; //读取高8位
distance <<= 8;
distance |= TL0; //读取低8位
//将距离转化为厘米
distance = distance / 58;
//将距离转化为字符串
disStr[0] = distance / 100 + '0';
disStr[1] = distance % 100 / 10 + '0';
disStr[2] = distance % 10 + '0';
disStr[3] = 'c';
disStr[4] = 'm';
//显示距离
writeCommand(0x80); //将光标移动到第一行第一列
for(unsigned char i=0; i<5; i++)
{
writeData(disStr[i]);
}
delayMs(500); //延时一段时间后再次读取
}
}
void sendTriggerSignal(void)
{
TRIG = 0;
delayUs(2);
TRIG = 1;
delayUs(10);
TRIG = 0;
}
void initLcd(void)
{
writeCommand(0x38); //16*2显示,5*7点阵,8位数据总线
writeCommand(0x0c); //开显示,不显示光标,不闪烁
writeCommand(0x06); //文字不动,地址自动+1,写入数据后光标右移
writeCommand(0x01); //清屏
delayMs(10);
}
void writeCommand(unsigned char command)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATABUS = command;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void writeData(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATABUS = dat;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void delayMs(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
{
for(j=0; j<114; j++);
}
}
void delayUs(unsigned int us)
{
unsigned int i;
for(i=0; i<us; i++);
}
```
注意,程序中使用的是定时器0来计算超声波模块返回的时间,需要在程序中设置定时器0的相关参数。此外,程序中还需要使用delayMs和delayUs函数来实现一定的延时,以保证程序能够正确运行。