其他分享
首页 > 其他分享> > C51+超声波+LCD1602显示遇到的问题,求大佬解

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