ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C51+超声波+LCD1602显示遇到的问题,求大佬解

2021-10-15 09:05:34  阅读:161  来源: 互联网

标签:C51 nop void 1602 write LCD1602 time 大佬 com


问题现象

 

问题描述: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有