|
找了個程序下到單片機,開機結果沒有溫濕度顯示出來。顯示出來的是這樣子。。不知什么原因??
程序如下:
#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液晶初始化函數;
void LCD_Display(); //聲明LCD_Display液晶顯示函數;
void Rec_DHT(); //聲明Rec_DHT,DHT11接收數據函數;
//主函數
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延時函數********/
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/***延時10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}
/********主機發出開始信號*******/
void DHT11_Start() //請結合時序圖分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持電平時間大于18ms
DHTIO=1;
delay1(); //延遲等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一個字節數據*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低電平結束
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接收數據*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主機發出開始信號
DHTIO=1; //拉高等待DHT11響應
if(!DHTIO) //從機發出響應信號
{
flag = 2;
while((!DHTIO) && flag++);
//判斷從機是否發出 80us 的低電平響應信號是否結束
flag = 2;
while(DHTIO && flag++);
//判斷從機是否發出 80us 的高電平,若發出則開始采集數據
Tem_Z = receive_data(); //采集濕度整數部分
Tem_X = receive_data(); //采集濕度小數部分
Hum_Z = receive_data(); //采集溫度整數部分
Hum_X = receive_data(); //采集溫度小數部分
Check = receive_data(); //采集校驗位
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); //注:此部分因采用的最小系統板電路設計原因,需要將字節信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******數據碼*******/
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); //注:此部分因采用的最小系統板電路設計原因,需要將字節信息逆置;
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); //顯示模式設置,設置16*2顯示,5*7點陣,8位數據接口
delay(2);
write_com(0x0c); //顯示開關及光標設置
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); //輸出溫度的個位
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); //輸出濕度的個位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}
程序編譯沒問題,否則無法生成HEX文件的。。。
|
|