|
找了個(gè)程序下到單片機(jī),開(kāi)機(jī)結(jié)果沒(méi)有溫濕度顯示出來(lái)。顯示出來(lái)的是這樣子。。不知什么原因??
程序如下:
#include "reg52.h"
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit DHTIO = P1^1; //管腳定義,DHT11總線輸入輸出;
sbit LCDRS = P2^3; //管腳定義,1602液晶RS控制端;
sbit LCDWR = P2^4; //管腳定義,1602液晶W/R控制端;
sbit LCDEN = P2^5; //管腳定義,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init(); //聲明LCD_Init液晶初始化函數(shù);
void LCD_Display(); //聲明LCD_Display液晶顯示函數(shù);
void Rec_DHT(); //聲明Rec_DHT,DHT11接收數(shù)據(jù)函數(shù);
//主函數(shù)
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延時(shí)函數(shù)********/
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/***延時(shí)10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}
/********主機(jī)發(fā)出開(kāi)始信號(hào)*******/
void DHT11_Start() //請(qǐng)結(jié)合時(shí)序圖分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持電平時(shí)間大于18ms
DHTIO=1;
delay1(); //延遲等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一個(gè)字節(jié)數(shù)據(jù)*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低電平結(jié)束
temp=0;
delay1();delay1();delay1();delay1();
if(DHTIO==1)
{
temp=1;
count=2;
while((DHTIO)&&count++);
}
if(count==1) break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
/********DHT11接收數(shù)據(jù)*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主機(jī)發(fā)出開(kāi)始信號(hào)
DHTIO=1; //拉高等待DHT11響應(yīng)
if(!DHTIO) //從機(jī)發(fā)出響應(yīng)信號(hào)
{
flag = 2;
while((!DHTIO) && flag++);
//判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
flag = 2;
while(DHTIO && flag++);
//判斷從機(jī)是否發(fā)出 80us 的高電平,若發(fā)出則開(kāi)始采集數(shù)據(jù)
Tem_Z = receive_data(); //采集濕度整數(shù)部分
Tem_X = receive_data(); //采集濕度小數(shù)部分
Hum_Z = receive_data(); //采集溫度整數(shù)部分
Hum_X = receive_data(); //采集溫度小數(shù)部分
Check = receive_data(); //采集校驗(yàn)位
DHTIO = 1;
}
}
/*******指令碼*******/
void write_com(uchar com)
{
com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7); //注:此部分因采用的最小系統(tǒng)板電路設(shè)計(jì)原因,需要將字節(jié)信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******數(shù)據(jù)碼*******/
void write_data(uchar date)
{
date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7); //注:此部分因采用的最小系統(tǒng)板電路設(shè)計(jì)原因,需要將字節(jié)信息逆置;
LCDRS=1;
LCDEN=0;
delay(2);
LCDEN=1;
P0=date;
delay(2);
LCDEN=0;
}
/*********************/
/********1602液晶顯示初始化*******/
void LCD_Init()
{
LCDEN=0; //使能低電平
LCDWR=0;
write_com(0x38); //顯示模式設(shè)置,設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
delay(2);
write_com(0x0c); //顯示開(kāi)關(guān)及光標(biāo)設(shè)置
delay(2);
write_com(0x06);
delay(2);
write_com(0x01); //清屏
delay(2);
}
/**********1602液晶顯示*********/
void LCD_Display()
{
//液晶顯示第一行:溫度顯示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2); //輸出溫度的十位
write_data(table[(Tem_Z%10)]);delay(2); //輸出溫度的個(gè)位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2); //輸出℃
write_data(0x43);delay(2);
//液晶第二行:濕度顯示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2); //輸出濕度的十位
write_data(table[(Hum_Z%10)]);delay(2); //輸出濕度的個(gè)位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}
程序編譯沒(méi)問(wèn)題,否則無(wú)法生成HEX文件的。。。
|
|