標(biāo)題:
請(qǐng)問(wèn)下我在網(wǎng)上找到的代碼,使用89c52測(cè)dht11在lcd1602上顯示用的是12m晶振數(shù)據(jù)不刷新
[打印本頁(yè)]
作者:
zj1
時(shí)間:
2019-5-4 11:23
標(biāo)題:
請(qǐng)問(wèn)下我在網(wǎng)上找到的代碼,使用89c52測(cè)dht11在lcd1602上顯示用的是12m晶振數(shù)據(jù)不刷新
用的是stc89c51,傳感器是dht11,液晶屏是lcd1602,晶振是12m,經(jīng)測(cè)試數(shù)據(jù)不刷新,在拔插一下data數(shù)據(jù)線(xiàn)(由傳感器輸入到單片機(jī)接收口),數(shù)據(jù)才會(huì)刷新,我想問(wèn)問(wèn)是什么原因。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char unint8;
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {"TRH RH: "};
unsigned char code dis2[] = {"TRH T: "};
sbit TRH = P2^7;//溫濕度傳感器DHT11數(shù)據(jù)接入
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
// 毫秒級(jí)延時(shí)子程序
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//5us級(jí)延時(shí)程序
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
// 測(cè)試LCD忙碌狀態(tài)
//lcd_busy()為1時(shí),忙,等待。lcd_busy()為0時(shí),閑,可寫(xiě)指令與數(shù)據(jù)。
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
// 寫(xiě)入指令數(shù)據(jù)到LCD
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//寫(xiě)顯示數(shù)據(jù)到LCD
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數(shù)據(jù)。
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//LCD初始化設(shè)定
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)
delay_ms(5);
lcd_wcmd(0x06); //移動(dòng)光標(biāo)
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容,如果屏幕過(guò)暗,可將這倆句刪除
//delay_ms(5);
}
//設(shè)定LCD顯示位置
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //數(shù)據(jù)指針=80+地址變量
}
//收發(fā)信號(hào)檢測(cè),數(shù)據(jù)讀取
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗(yàn) 8位 == CK_data
//調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
void read_TRH()
{
//主機(jī)拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA總線(xiàn)由上拉電阻拉高 主機(jī)延時(shí)20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
TRH=1;
//判斷DHT11是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(!TRH)
{
respond=2;
//判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
while((!TRH)&& respond++);
respond=2;
//判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while(TRH && respond++);
//數(shù)據(jù)接收狀態(tài)
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//數(shù)據(jù)校驗(yàn)
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//濕度整數(shù)部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小數(shù)點(diǎn)
//濕度小數(shù)部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//溫度整數(shù)部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小數(shù)點(diǎn)
//溫度小數(shù)部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
//主函數(shù)
//TH,TL,RH,RL分別代表溫濕度的整數(shù)和小數(shù)部分
void main()
{
unsigned char i,n=0x40,m;
lcd_init();
delay_us();
while(1)
{
read_TRH();
//寫(xiě)字符
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //顯示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //顯示字符
lcd_wdata(dis2[i]);
}
//寫(xiě)濕度數(shù)據(jù)
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//寫(xiě)溫度數(shù)據(jù)
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延時(shí)
delay_ms(1000) ;
}
}
作者:
liuyin9744
時(shí)間:
2021-3-25 22:52
為什么6個(gè)i--是5US呢
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1