仿真图是显示的但是实物不显示是为什么呀
#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;
}
}

看起来没什么问题,既然代码仿真都能跑了,你实物没跑起来,可能是你的lcd1602的这个屏有点问题,或者是电源的部分没接好,你先从硬件角度进行排查一下,确认一下硬件有没有问题,你怀疑软件有问题的话,进行追踪一下,使用while(1) + 显示的方式,看一下程序到底是怎么跑的,导致没达到你想要的效果。
看照片,下面一排8个是用来显示数据的吧?你查一下LCD1602,第三脚是调对比度的。可以接个电位器来调对比度的;将第三脚脚连上个电位器,电位器的两端接5V电源与地.然后调下电位器,数据就能显示出来了。
仿真图能显示,说明程序至少没太大问题,可能是硬件连接的问题。从显示效果看,可能是对比度问题,你那个对比度是不是接成固定电平了,用个电位器试试。你原理图上也没接电位器,仿真和实际还是有些差别的的,仿真里可能忽略了那个
参考chatgpt
传感器连接问题:请确保传感器已正确连接到单片机,并且连接线路没有故障。
传感器型号选择错误:请确认使用的传感器型号与程序中设置的型号一致。
程序逻辑错误:请检查程序中读取温度值的代码是否正确,例如是否使用正确的引脚和读取方式。
编译环境问题:请确认编译器和开发环境是否正确配置,以确保程序能够正常编译和运行。
根据代码,程序应该可以正常工作。但是,我无法确定具体的硬件配置是否正确。建议检查电路连接和硬件设置,确保数据线和电源线没有接反或松动,以及检查温度传感器是否能够正常输出数据。
此外,值得注意的是,当前代码中的温度阈值检测似乎只判断了整数位,而未考虑小数位。这可能会导致误差,建议在代码中增加对小数位的比较。
感谢大家,我的是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各种国标码一般都是采用两个字节进行编码。暂且叫做汉字内码吧,详细的编码方式可以百度一下。