标题:
c52单片机板子仿真能跑实物上LCD1602显示屏是一堆白块
[打印本页]
作者:
bfzakd
时间:
2023-5-18 22:27
标题:
c52单片机板子仿真能跑实物上LCD1602显示屏是一堆白块
如图,仿真的时候是这样的,但是实物用开发板拼好之后是这样的大佬们知道怎么改吗
1.png
(14.27 KB, 下载次数: 23)
下载附件
2023-5-19 00:46 上传
2.png
(61.3 KB, 下载次数: 20)
下载附件
2023-5-19 00:46 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit DATO=P1^3;
sbit DATI=P1^2;
sbit CS=P1^0;
sbit Clk=P1^1;
sbit DHT11_DQ=P2^3;
sbit IN1_A=P3^0;
sbit IN2_B=P3^1;
sbit IN3_C=P3^2;
sbit IN4_D=P3^3;
sbit motor=P3^7;
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
unsigned char datas0[]={0,0,0,0}; //缓冲数据
unsigned char datas1[]={0,0,0,0}; //缓冲数据
uint ch0=0,ch1=0;
int vcc;
uchar dat=0;
void send_pulse_z(u8 step)
{
u8 temp=step;
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
}
}
void send_pulse_f(u8 step)
{
u8 temp=step;
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 6: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 1: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
}
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//复位DHT11
void DHT11_Rst(void)
{
DHT11_DQ=1;
delay_10us(1);
DHT11_DQ=0;
delay_ms(25);
DHT11_DQ=1;
delay_10us(3);
}
u8 DHT11_Check(void)
{
u8 retry=0;
while (!DHT11_DQ&&retry<100)//判断从机发出 80us 的低电平响应信号是否结束
{
retry++;
_nop_();
};
if(retry>=100)return 1;
else retry=0;
while (DHT11_DQ&&retry<100)//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
{
retry++;
_nop_();
};
if(retry>=100)return 1;
return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
u8 i,temp;
u8 data_byte=0;
u8 retry=0;
for(i=0;i<8;i++)//接收8bit的数据
{
// while(!DHT11_DQ);//等待50us的低电平开始信号结束
while (!DHT11_DQ&&retry<50)//等待50us的低电平开始信号结束
{
retry++;
_nop_();
};
retry=0;
delay_10us(3);//等待40us
temp=0;//时间为26us-28us表示接收的为数据'0'
if(DHT11_DQ==1)
temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
// while(DHT11_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us
while (DHT11_DQ&&retry<100)//等待数据信号高电平'0'为26us-28us'1'为70us
{
retry++;
_nop_();
};
data_byte<<=1;//接收的数据为高位在前右移
data_byte|=temp;
}
return data_byte;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
u8 DHT11_Init(void)
{
DHT11_DQ=1;
DHT11_Rst();
return DHT11_Check();
}
void delay1ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void wr_com(uchar com)
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(uchar dat)
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_new()
{
uchar i;
wr_com(0x40);
for(i=0;i<8;i++)
{
wr_dat(table[ i]);
}
}
void lcd_init()
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
wr_new();
wr_com(0x80);
wr_dat('A');
wr_com(0x89);
wr_dat('B');
wr_com(0xc0);
wr_dat('C');
wr_com(0xcd);
wr_dat('%');
}
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
u8 smog=0;
u8 steps;
void main(void)
{
u8 temp=0,humi=0;
lcd_init();
wr_com(0x01);
while(DHT11_Init());
motor=1;
while(1)
{
DHT11_Read_Data(&temp,&humi);
ch0=adc0832(0)*1.97;
smog=ch0/5;
//数据处理
datas0[2]=smog/100;
datas0[1]=smog/10%10; //小数点后两位
datas0[0]=smog%10; //小数点后两位
ch1=adc0832(1)*1.97;
//数据处理
datas1[3]=ch1/1000; //个位
datas1[2]=ch1%1000/100; //小数点后一位
datas1[1]=ch1%100/10; //小数点后两位
datas1[0]=ch1%10; //小数点后两位
vcc=datas1[3]*1000+datas1[2]*100+datas1[1]*10+datas1[0];
wr_com(0x80);
wr_dat('s');
wr_dat('m');
wr_dat('o');
wr_dat('g');
wr_dat(':');
wr_dat(datas0[2]+0x30);
wr_dat(datas0[1]+0x30);
wr_dat(datas0[0]+0x30);
wr_dat('%');
wr_com(0x8b);
wr_dat(datas1[2]+0x30);
wr_dat('.');
wr_dat(datas1[1]+0x30);
wr_dat(datas1[0]+0x30);
wr_dat('V');
wr_com(0x80+0x40);
wr_dat('t');
wr_dat(':');
wr_dat(temp/10+0x30);
wr_dat(temp%10+0x30);
wr_dat('^');
wr_dat('C');
wr_com(0x88+0x40);
wr_dat('h');
wr_dat(':');
wr_dat(humi/10+0x30);
wr_dat(humi%10+0x30);
wr_dat('%');
if(vcc>177){//大于1.77V
send_pulse_f(steps);
steps++;
if(steps>=8){
steps=0;
}
}
if(vcc<120){
send_pulse_z(steps);
steps++;
if(steps>=8){
steps=0;
}
}
if(temp>40 || humi>80){
motor=0;
}
else motor=1;
delay_ms(30);
}
}
复制代码
作者:
bfzakd
时间:
2023-5-18 22:58
图片好像没有发出来,就是实物上lcd1602是一行白块
作者:
yzwzfyz
时间:
2023-5-19 08:47
先确认实物与仿真是一样的。
作者:
lkc8210
时间:
2023-5-19 08:51
检查接线,检查排阻方向
作者:
mtt661
时间:
2023-5-22 23:03
调整下对比度试试,就是第三脚的电压
作者:
bingtangxl
时间:
2023-5-23 00:23
首先查看一下接线,看看硬件接线是否出错,还有单片机型号确认一下
作者:
123456ZXC1
时间:
2023-5-23 11:06
实物和仿真差距大这呢
作者:
123156fsadf
时间:
2023-5-23 13:47
应该是对比度电压不对,要用可调电阻进行调节的。
作者:
xuyaqi
时间:
2023-5-23 15:40
程序还牵扯DHT11的操作,如果DHT11不正常,会影响LCD1602。我屏蔽DHT11程序在实物上试,LCD1602显示是正常的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1