为什么52单片机测温实物LCD不显示数值?(c语言)

仿真图是显示的但是实物不显示是为什么呀

img

img


#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
sbit ds = P2^2;  //ds18b20端口定义
sbit rw = P2^6;  //LCD1602端口定义
sbit RS = P2^5;  
sbit LCDEN = P2^7; 
sbit kaiguan = P2^0;
sbit K1 = P3^4;  //K1独立按键设置温度+
sbit K2 = P3^5;  //K1独立按键设置温度-

void delayUs()  //延时一个机器周期
{
    _nop_();
}

 void delayMs(uint a)  //延时a毫秒
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}

/*******************************LCD1602*******************************/
void writeComm(uchar comm)  //LCD写命令
{
    RS = 0;    
    P0 = comm;
    LCDEN = 1;
    delayUs();
    LCDEN = 0;
    delayMs(1);
}

void writeData(uchar dat)  //写数据:RS=1, RW=0;
{
    RS = 1;
    P0 = dat;
    LCDEN = 1;
    delayUs();
    LCDEN = 0;
    delayMs(1);
}

void init()  //LCD初始化
{
    rw = 0; 
    writeComm(0x38);  //16*2显示,5*7点阵,8位数据接口
    writeComm(0x0c); //显示器开。光标关闭
    writeComm(0x06);//文字不动,地址自动加一
    writeComm(0x01);//清屏 

}

void writeString(uchar * str, uchar length)  //LCD写字符串
{
    uchar i;
    for(i = 0; i < length; i++)
    {
         writeData(str[i]);
    }
 }
 
/*******************************DS18B20*******************************/
void dsInit()  //ds18b20初始化
{
    unsigned int i;  
    ds = 0;
    i = 100;  
     while(i>0) i--;
    ds = 1;   
    i = 4;
     while(i>0) i--;
}
 
void dsWait()  //等待
 {
      unsigned int i;
      while(ds);  
      while(~ds);
      i = 4;
      while(i > 0) i--;
}


bit readBit()  //读一位数据
{
    unsigned int i;
    bit b;
    ds = 0;
    i++;   
    ds = 1; 
    i++; i++;  
    b = ds;
    i = 8; 
    while(i>0) i--;
    return b;
}

unsigned char readByte()  //读一个字节
{
    unsigned int i;
    unsigned char j, dat;
    dat = 0;
    for(i=0; i<8; i++)
    {
        j = readBit();
      
        dat = (j << 7) | (dat >> 1);
    }
    return dat;
}


void writeByte(unsigned char dat)  //写一个字节
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j = 0; j < 8; j++)
    {
        b = dat & 0x01;
        dat >>= 1;
    
        if(b)   
        {
           ds = 0;          i++; i++;  
            ds = 1;    
            i = 8; while(i>0) i--;  
        }
        else  
        {
            ds = 0;
          i = 8; while(i>0) i--;  
            ds = 1;
           i++; i++;
        }
    }
}


void sendChangeCmd()  //温度转换
{
    dsInit();    
    dsWait();   
    delayMs(1);    
    writeByte(0xcc);  //跳过64位光刻ROM操作
    writeByte(0x44);  //写入RAM操作
}

void sendReadCmd()  
{
    dsInit();
    dsWait();
    delayMs(1);
    writeByte(0xcc); 
    writeByte(0xbe); 
}


int getTmpValue()  //获取温度
{
    unsigned int tmpvalue;
    int value; 
    float t;
    unsigned char low, high;
    sendReadCmd();
    
    low = readByte(); 
    high = readByte();
   
    tmpvalue = high;
    tmpvalue <<= 8;
    tmpvalue |= low;
    value = tmpvalue;
    t = value * 0.0625;
    value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
    return value;
}

unsigned char datas[] = {0, 0, 0, 0, 0};  //温度储存数组
void display(int v)  //显示温度
{
    unsigned char count;
    unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
    datas[1] = tmp % 10000 / 1000;
    datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
    datas[4] = tmp % 10;
    writeComm(0xc0+7);
    if(v < 0)
    {
        writeString("- ", 2);
    }
    else
    {
       writeString("+ ", 2);
    }
    if(datas[0] != 0)
    {
        writeData('0'+datas[0]);
    }
    for(count = 1; count != 5; count++)
    {
        writeData('0'+datas[count]);
        if(count == 2) writeData('.');
    }
}


void main()
{
      int a=30;
    uchar table1[] = "shezhi:";
      uchar table2[] = "wendu:";
      kaiguan = 0;
    sendChangeCmd();   //温度转换
    init(); 
    writeComm(0x80);
    writeString(table1,7);
      writeComm(0x80+10);
        writeData('0'+a/10);
      writeData('0'+a%10);
      writeComm(0xc0);
    writeString(table2,6);
    while(1)
    {
        delayMs(1000); //温度转换时间需要750ms以上
        writeComm(0xc0);
        display(getTmpValue());
        sendChangeCmd();
            
                if(K1==0)
                {
                        delayMs(10);
                        if(K1==0)
                        {
                            while(K1==0);
                            a++;
                            writeComm(0x80+10);
                            writeData('0'+a/10);
                          writeData('0'+a%10);
                        }
                }
                if(K2==0)
                {
                        delayMs(10);
                        if(K2==0)
                        {
                            while(K2==0);
                            a--;
                            writeComm(0x80+10);
                            writeData('0'+a/10);
                          writeData('0'+a%10);
                        }
                }
        
                if(datas[1]>=(a/10)&datas[2]>=(a%10)||datas[1]>(a/10))
                    kaiguan=1;
                else kaiguan=0;
    }
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/880763754586168.jpg "#left")


看起来没什么问题,既然代码仿真都能跑了,你实物没跑起来,可能是你的lcd1602的这个屏有点问题,或者是电源的部分没接好,你先从硬件角度进行排查一下,确认一下硬件有没有问题,你怀疑软件有问题的话,进行追踪一下,使用while(1) + 显示的方式,看一下程序到底是怎么跑的,导致没达到你想要的效果。

看照片,下面一排8个是用来显示数据的吧?你查一下LCD1602,第三脚是调对比度的。可以接个电位器来调对比度的;将第三脚脚连上个电位器,电位器的两端接5V电源与地.然后调下电位器,数据就能显示出来了。

仿真图能显示,说明程序至少没太大问题,可能是硬件连接的问题。从显示效果看,可能是对比度问题,你那个对比度是不是接成固定电平了,用个电位器试试。你原理图上也没接电位器,仿真和实际还是有些差别的的,仿真里可能忽略了那个

参考chatgpt

传感器连接问题:请确保传感器已正确连接到单片机,并且连接线路没有故障。

传感器型号选择错误:请确认使用的传感器型号与程序中设置的型号一致。

程序逻辑错误:请检查程序中读取温度值的代码是否正确,例如是否使用正确的引脚和读取方式。

编译环境问题:请确认编译器和开发环境是否正确配置,以确保程序能够正常编译和运行。

根据代码,程序应该可以正常工作。但是,我无法确定具体的硬件配置是否正确。建议检查电路连接和硬件设置,确保数据线和电源线没有接反或松动,以及检查温度传感器是否能够正常输出数据。

此外,值得注意的是,当前代码中的温度阈值检测似乎只判断了整数位,而未考虑小数位。这可能会导致误差,建议在代码中增加对小数位的比较。

感谢大家,我的是LCD出了问题,换了一块LCD就可以了,除此之外,代码中lcd初始化也加了延时,怕初始化错误,谢谢大家!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/655741
  • 这篇博客你也可以参考下:LCD段码屏中的驱动电压是什么?
  • 除此之外, 这篇博客: 单片机LCD少量汉字显示中的 单片机LCD少量汉字取模显示(不需要字库) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    最近在做一个小项目的时候需要用到LCD显示中文汉字,用到的字数不多,如果使用字库占的内存大,而且本人不太熟悉。上网看了一下别人的方法,移植了一下,觉得这个方法不错。后期还可以移植到OLED的显示上,直接可以像显示英文字符串的方法一样显示中文,非常方便:

    		show_Hz32(60,160,"武汉加油",BLACK,WHITE);
    		Show_Hz16(60,200,"武汉",BLACK,WHITE);
    		LCD_ShowString(20,90,100,40,16,"China come on!");
    

    下面以正点原子的mini开发板和2.8寸液晶LCD为例,记录一下这种显示方法的实现。

    我们知道LCD上显示汉字一般都需要加上字库,因为编码方式与英文的方式不同,汉字或者说GBK各种国标码一般都是采用两个字节进行编码。暂且叫做汉字内码吧,详细的编码方式可以百度一下。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^