写一个用hc-sr04和lcd1602测量距离并显示的51单片机代码
时间: 2023-11-16 18:08:02 浏览: 161
用51单片机实现HC-SR04超声波测距程序.doc
以下是基于STC89C52单片机的代码,可以使用hc-sr04和lcd1602模块测量距离并显示:
```
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig = P3^3; //定义超声波发射引脚
sbit echo = P3^2; //定义超声波接收引脚
void delay_us(uint i) //微秒延时函数
{
while(i--)
{
_nop_(); //空操作指令
}
}
void delay_ms(uint i) //毫秒延时函数
{
uchar j;
while(i--)
{
for(j = 0; j < 120; j++);
}
}
void write_com(uchar com) //写入命令函数
{
P0 = com; //将命令写入P0口
P2 &= ~0x01; //RS=0,选择命令寄存器
P2 &= ~0x04; //RW=0,选择写入模式
P2 |= 0x08; //E=1,启动液晶屏
delay_us(5);
P2 &= ~0x08; //E=0,停止液晶屏
}
void write_data(uchar dat) //写入数据函数
{
P0 = dat; //将数据写入P0口
P2 |= 0x01; //RS=1,选择数据寄存器
P2 &= ~0x04; //RW=0,选择写入模式
P2 |= 0x08; //E=1,启动液晶屏
delay_us(5);
P2 &= ~0x08; //E=0,停止液晶屏
}
void init_lcd() //初始化液晶屏函数
{
write_com(0x38); //8位数据总线,2行显示,5x7点阵字符
write_com(0x0c); //开启显示,光标隐藏
write_com(0x06); //文字不动,光标自动移动
write_com(0x01); //清屏
}
void display_distance(uint dis) //显示距离函数
{
uchar i;
uchar str[6] = {0}; //定义字符数组
sprintf(str, "%d", dis); //将距离转换成字符串
for(i = 0; i < 6; i++) //循环显示字符
{
if(str[i] != '\0') //如果字符不为空
{
write_data(str[i]); //将字符写入液晶屏
}
}
}
uint get_distance() //获取距离函数
{
uint distance; //定义距离变量
trig = 0; //将触发引脚设为低电平
delay_us(2);
trig = 1; //将触发引脚设为高电平
delay_us(10);
trig = 0; //将触发引脚设为低电平
while(!echo); //等待接收引脚变为高电平
TL1 = 0; //清空定时器1低8位
TH1 = 0; //清空定时器1高8位
TR1 = 1; //启动定时器1
while(echo); //等待接收引脚变为低电平
TR1 = 0; //停止定时器1
distance = (TL1 + TH1 * 256) / 58; //计算距离
return distance; //返回距离值
}
void main()
{
uint distance; //定义距离变量
init_lcd(); //初始化液晶屏
while(1)
{
distance = get_distance(); //获取距离值
write_com(0x80); //显示距离
write_data('D');
write_data('i');
write_data('s');
write_data('t');
write_data('a');
write_data('n');
write_data('c');
write_data('e');
write_data(':');
display_distance(distance); //显示距离值
delay_ms(500); //延时0.5秒
}
}
```
注:以上代码仅供参考,请根据具体情况进行修改和调试。
阅读全文