標(biāo)題:
c52單片機(jī)板子仿真能跑實(shí)物上LCD1602顯示屏是一堆白塊
[打印本頁]
作者:
bfzakd
時(shí)間:
2023-5-18 22:27
標(biāo)題:
c52單片機(jī)板子仿真能跑實(shí)物上LCD1602顯示屏是一堆白塊
如圖,仿真的時(shí)候是這樣的,但是實(shí)物用開發(fā)板拼好之后是這樣的大佬們知道怎么改嗎
1.png
(14.27 KB, 下載次數(shù): 23)
下載附件
2023-5-19 00:46 上傳
2.png
(61.3 KB, 下載次數(shù): 20)
下載附件
2023-5-19 00:46 上傳
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
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}; //緩沖數(shù)據(jù)
unsigned char datas1[]={0,0,0,0}; //緩沖數(shù)據(jù)
uint ch0=0,ch1=0;
int vcc;
uchar dat=0;
void send_pulse_z(u8 step)
{
u8 temp=step;
switch(temp)//8個(gè)節(jié)拍控制: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個(gè)節(jié)拍控制: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--);
}
//復(fù)位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)//判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
{
retry++;
_nop_();
};
if(retry>=100)return 1;
else retry=0;
while (DHT11_DQ&&retry<100)//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)
{
retry++;
_nop_();
};
if(retry>=100)return 1;
return 0;
}
//從DHT11讀取一個(gè)字節(jié)
//返回值:讀到的數(shù)據(jù)
u8 DHT11_Read_Byte(void)
{
u8 i,temp;
u8 data_byte=0;
u8 retry=0;
for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)
{
// while(!DHT11_DQ);//等待50us的低電平開始信號(hào)結(jié)束
while (!DHT11_DQ&&retry<50)//等待50us的低電平開始信號(hào)結(jié)束
{
retry++;
_nop_();
};
retry=0;
delay_10us(3);//等待40us
temp=0;//時(shí)間為26us-28us表示接收的為數(shù)據(jù)'0'
if(DHT11_DQ==1)
temp=1; //如果26us-28us之后還為高電平則表示接收的數(shù)據(jù)為'1'
// while(DHT11_DQ);//等待數(shù)據(jù)信號(hào)高電平'0'為26us-28us'1'為70us
while (DHT11_DQ&&retry<100)//等待數(shù)據(jù)信號(hào)高電平'0'為26us-28us'1'為70us
{
retry++;
_nop_();
};
data_byte<<=1;//接收的數(shù)據(jù)為高位在前右移
data_byte|=temp;
}
return data_byte;
}
//從DHT11讀取一次數(shù)據(jù)
//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位數(shù)據(jù)
{
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位的值,如果不相同舍去。若一直出現(xiàn)顯示為零,請(qǐng)將該行去掉
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;
//數(shù)據(jù)處理
datas0[2]=smog/100;
datas0[1]=smog/10%10; //小數(shù)點(diǎn)后兩位
datas0[0]=smog%10; //小數(shù)點(diǎn)后兩位
ch1=adc0832(1)*1.97;
//數(shù)據(jù)處理
datas1[3]=ch1/1000; //個(gè)位
datas1[2]=ch1%1000/100; //小數(shù)點(diǎn)后一位
datas1[1]=ch1%100/10; //小數(shù)點(diǎn)后兩位
datas1[0]=ch1%10; //小數(shù)點(diǎn)后兩位
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);
}
}
復(fù)制代碼
作者:
bfzakd
時(shí)間:
2023-5-18 22:58
圖片好像沒有發(fā)出來,就是實(shí)物上lcd1602是一行白塊
作者:
yzwzfyz
時(shí)間:
2023-5-19 08:47
先確認(rèn)實(shí)物與仿真是一樣的。
作者:
lkc8210
時(shí)間:
2023-5-19 08:51
檢查接線,檢查排阻方向
作者:
mtt661
時(shí)間:
2023-5-22 23:03
調(diào)整下對(duì)比度試試,就是第三腳的電壓
作者:
bingtangxl
時(shí)間:
2023-5-23 00:23
首先查看一下接線,看看硬件接線是否出錯(cuò),還有單片機(jī)型號(hào)確認(rèn)一下
作者:
123456ZXC1
時(shí)間:
2023-5-23 11:06
實(shí)物和仿真差距大這呢
作者:
123156fsadf
時(shí)間:
2023-5-23 13:47
應(yīng)該是對(duì)比度電壓不對(duì),要用可調(diào)電阻進(jìn)行調(diào)節(jié)的。
作者:
xuyaqi
時(shí)間:
2023-5-23 15:40
程序還牽扯DHT11的操作,如果DHT11不正常,會(huì)影響LCD1602。我屏蔽DHT11程序在實(shí)物上試,LCD1602顯示是正常的。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1