欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1