C51+超声波+LCD1602显示遇到的问题,求大佬解
作者:互联网
问题现象:
问题描述:1,随着测量距离的增大,显示数值与实际数值之间误差也随之增大
2,当测量距离为110是,显示数值自动清零。
源代码如下:
#include<reg52.h> //包含头文件
#include<intrins.h>
#define uint unsigned int //预定义
#define uchar unsigned char
sbit Trig = P3^3;
sbit Echo = P3^4;
sbit rs=P2^3; //1602的数据/指令选择控制线
sbit rw=P2^4; //1602的读写控制线
sbit en=P2^5; //1602的使能控制线
/*P0口接1602的D0~D7*/
uint shi=0,ge=0,bai=0;
uchar code table2[]="distance=";
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
void Rstart() //超声波驱动
{
Trig=0;
Trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
int gettime()
{
unsigned int time = 0;
time = TH0*256+TL0;
return time;
}
float Getdis(uint time)
{
float distance;
distance = (float)time*0.0017 ;
TH0=0;
TL0=0;
return distance;
}
void star()
{
TH0 = 0;
TL0 = 0;
TR0 = 1;
}
void end()
{
TR0 = 0;
}
void GetOnce()
{
Rstart();
while(!Echo);
star();
while(Echo);
end();
}
void delay(uint n) //延时函数
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //1602写命令函数
{
rs=0; //选择指令寄存器
rw=0; //选择写
P1=com; //把命令字送入P2
delay(10); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口
en=0;
}
void write_data(uchar dat) //1602写数据函数
{
rs=1;
rw=0;
P1=dat;
delay(10);
en=1;
en=0;
}
void lcd_init()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main()
{
uchar m=0;
uint time=0;
uint dis;
lcd_init();
while(1)
{
GetOnce();
time = gettime();
dis = Getdis(time);
write_com(0xc0);
for(m=0;m<9;m++)
{
write_data(table2[m]);
}
bai=dis/100;
shi=dis%100/10;
ge=dis%10;
write_com(0xc0+10);
write_data(table[bai]);
_nop_();
write_com(0xc0+11);
write_data(table[shi]);
_nop_();
write_com(0xc0+12);
write_data(table[ge]);
_nop_();
}
}
标签:C51,nop,void,1602,write,LCD1602,time,大佬,com 来源: https://blog.csdn.net/weixin_51142093/article/details/120776599