标题: 51单片机LCD1602显示的温度计液晶屏只显示格子 [打印本页]

作者: 一君呀    时间: 2020-9-28 21:31
标题: 51单片机LCD1602显示的温度计液晶屏只显示格子
本帖最后由 一君呀 于 2020-9-28 22:03 编辑

想做一个温度显示计,传感器用的DS18b20,程序写完了在开发板上试了结果液晶屏上是这个样子,不知道是咋回事,有人能帮忙看一下么,拜托了这里是程序

第一次写,可能有很多漏洞什么的,还请多多指教

单片机源程序如下:
#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define LCD1602 P0


sbit DS = P3^7;      //定义DS18B20的端口
sbit RS = P2^6;                 //lcd1602寄存器
sbit RW = P2^5;                  //读写
sbit EN = P2^7;                   //片选



void delay_us(u16 i)         //微秒延时函数        ,不精确延时,i=1大约为10us
{
    while(i--);
}

void delay1ms(u16 ms)                 //1毫秒延时函数
{
    u16 i,j;
        for (i=0;i<ms;i++);
        for(j=0;j<120;j++);
}

void delay(u16 x)       //延时函数
{
        u16 i;
        for(i=x;i>0;i--);
}


u8 DS18B20_CS()                 //DS18B20初始化
{
    bit x;
    u8 i = 0;                  
    DS = 0;                                //拉低总线
        i = 70;
        while(i--);      //延时642us
        DS = 1;
        i = 0;
        delay_us(7);
        x = DS;
        delay_us(15);
        DS = 1;
        _nop_();
    return(x);
}

void DS18B20_XSX(u8 i)        //DS18B20写时序
{
    u8  y;
        for(y=0;y<8;y++)
           {
             DS = 1;                                
                 _nop_();
                 DS = 0;
                 DS = i&0x01;
                 delay_us(7);
                 DS = 1;
                 _nop_();
                 _cror_(i,1);           
           }
}

u8 DS18B20_DSX()            //读时序
{
     u8 x,y,z;
         for(x=0;x<8;x++)
           {
               DS = 0;
                   _nop_();
                   DS = 1;
                   _nop_();
                   y = DS;
                   delay_us(7);
                   DS = 1;
                   _nop_();
                   z = (y<<7)|(z>>1);        //从最低位开始读取,循环8位
           }
           return(z);
}

void DS18B20_change()       //转换温度
{
     DS18B20_CS();
         delay1ms(1);
         DS18B20_XSX(0xcc);
     DS18B20_XSX(0x44);
}

void DS18B20_FS()           //发送温度
{
      DS18B20_CS();
          delay1ms(1);
          DS18B20_XSX(0xcc);
          DS18B20_XSX(0xbe);   
}

int DS18B20_DQ()                 //读取温度
{
     int temp = 0;
         u8 H,L;
         DS18B20_change();
         DS18B20_FS();
         L=DS18B20_DSX();  //从低8位开始读
         H=DS18B20_DSX();   //高8位
         temp = H;
         temp<<=8;
         temp |= L;
         return temp;   
}

void LCD1602_com(u8 com)                 //LCD1602写指令函数
{
           RS = 0;
           RW = 0;
           EN = 0;
           P0 = com;
           delay1ms(1);
           EN = 1;
           delay1ms(5);
           EN = 0;
}

void LCD1602_dat(u8 dat)     //写数据函数
{
     P0 = dat;       //送出时序
         RS = 1;
         RW = 0;
         EN = 1;
         delay(200);
         EN = 0;
}

void LCD1602_init()                //初始化
{
     LCD1602_com(0x01);   //初始化
         LCD1602_com(0x38);     //清屏
         LCD1602_com(0x0c);      //开显示。不显示光标
         LCD1602_com(0x06);     //地址加1写入数据时光标右移
     LCD1602_com(0x87);                  //起始位置
}

void LCD1602_disp(int temp)                //显示函数
{
     u8  table[] ={0,0,0,0};
         float i;         
         LCD1602_com(0x80);
         i = temp;
         temp = i*0.0625*10+0.5;
         table[0]=temp/100;
         table[1]=temp/10%10;
         table[2]=temp%10;
         LCD1602_com(0x87);    //显示第一位数的位置
         LCD1602_dat('0'+table[0]);
         LCD1602_com(0x88);       //显示个位
         LCD1602_dat('0'+table[1]);
         LCD1602_com(0x89);      //显示小数点
         LCD1602_dat('.');
         LCD1602_com(0x0A);      //小数后一位
         LCD1602_dat('0'+table[2]);
         delay(50);
}

void main()
{
     LCD1602_init();
         LCD1602_com(0x88);
         while(1)
         {
              LCD1602_disp( DS18B20_DQ());
         }
}


作者: 一君呀    时间: 2020-9-28 22:03
这个是不是要自己顶贴啊,希望有人能帮看看吧
作者: wulin    时间: 2020-9-29 07:31
一君呀 发表于 2020-9-28 22:03
这个是不是要自己顶贴啊,希望有人能帮看看吧

ds18b20温度LCD显示 仿真.zip (155.78 KB, 下载次数: 23) 可以用这个程序测试你的板子,消除黒块可能要调整LCD的对比度。


作者: man1234567    时间: 2020-9-29 09:06
改成这:        LCD1602_com(0x8A);      //小数后一位

作者: hhdsdy    时间: 2020-9-29 09:27
1602的对比度调节正常吗?
作者: man1234567    时间: 2020-9-29 17:21
0x8A,是绝对移位的指令;
0x0A,有关闭显示的功效;
1602是个很容易上手的东东,但自定义字符只有8个且分辨率呵呵。用得多的话可以搞个4+2线标准的程序用着方便,这东东上电后调节对比度貌似都可以显示小方块。
作者: 一君呀    时间: 2020-9-29 19:53
hhdsdy 发表于 2020-9-29 09:27
1602的对比度调节正常吗?

调过的,出来都是乱码
作者: 一君呀    时间: 2020-9-29 19:59
man1234567 发表于 2020-9-29 09:06
改成这:        LCD1602_com(0x8A);      //小数后一位

改了,现在只显示00.0,在第8.9.10.11位
作者: felix123    时间: 2020-9-29 20:15
显示屏貌似有点漏光

作者: ccsyjq    时间: 2020-9-29 21:39
你可以试试电位器调下  程序我看没有什么问题
作者: man1234567    时间: 2020-9-30 01:59
一君呀 发表于 2020-9-29 19:59
改了,现在只显示00.0,在第8.9.10.11位

全部是0说明读温度没成功,只是显示已完成调试。建议:
1、普中的板子自带程例,可先用哪怕不懂;
2、各器件都也有说明书,应先读必须认真;
3、这类程序本站也多现成的,下载可借用。
PS:感觉程序里的时序有点任性
作者: 一君呀    时间: 2020-10-7 22:09
man1234567 发表于 2020-9-30 01:59
全部是0说明读温度没成功,只是显示已完成调试。建议:
1、普中的板子自带程例,可先用哪怕不懂;
2、 ...

好的,谢谢
作者: jsjjzlz    时间: 2020-10-21 16:26
也感觉DS18B20初始化的时序写得有点瑕疵,可以找坛子里写得比较标准的程序借鉴一下
作者: 派珂纳米吴先森    时间: 2020-10-21 16:31
要修改:LCD1602_com(0x8A);      //小数后一位
作者: luzhongyi86    时间: 2020-10-22 16:08
1602没收到指令的,先断开DS18b20,发固定字符表其中一个给1602看看通信是否正常
作者: laopihappy123    时间: 2020-10-22 18:54
你可以试试电位器调下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1