|
顯示不出溫濕度
#include <reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P1^2;
sbit LCD1602_RW = P1^3;
sbit LCD1602_E = P1^1;
/* 等待液晶準(zhǔn)備好 */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB; //讀取狀態(tài)字
LCD1602_E = 0;
} while (sta & 0x80); //bit7等于1表示液晶正忙,重復(fù)檢測(cè)直到其等于0為止
}
/* 向LCD1602液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 設(shè)置顯示RAM起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo) */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址
addr = 0x00 + x; //第一行字符地址從0x00起始
else
addr = 0x40 + x; //第二行字符地址從0x40起始
LcdWriteCmd(addr | 0x80); //設(shè)置RAM地址
}
/* 在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //設(shè)置起始地址
while (*str != '\0') //連續(xù)寫(xiě)入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符
{
LcdWriteDat(*str++);
}
}
/* 初始化1602液晶 */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
LcdWriteCmd(0x0C); //顯示器開(kāi),光標(biāo)關(guān)閉
LcdWriteCmd(0x06); //文字不動(dòng),地址自動(dòng)+1
LcdWriteCmd(0x01); //清屏
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^0;
uchar rec_dat[13]="123695669999";
extern void InitLcd1602();
uchar showset[16]="12369566999999";
int wendu=0;
int shidu=0;
sbit shezhi=P2^0;
sbit jia=P2^1;
sbit jian=P2^2;
sbit beep=P3^7;
int wendul=5;
int wenduh=30;
int shidul=30;
int shiduh=60;
int change=0;
uchar key_can; //按鍵值
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待數(shù)據(jù)
DHT11_delay_us(40); //延時(shí)80us
R_H=DHT11_rec_byte(); //濕度高位
R_L=DHT11_rec_byte(); //濕度低位
T_H=DHT11_rec_byte(); //溫度高位
T_L=DHT11_rec_byte(); //溫度低位
revise=DHT11_rec_byte(); //獲取數(shù)據(jù)
DHT11_delay_us(25); //延時(shí)
if((R_H+R_L+T_H+T_L)==revise) //校驗(yàn)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數(shù)據(jù)分解*0-9*/
// rec_dat[0]='0'+(RH/10);
// rec_dat[1]='0'+(RH%10);
// rec_dat[2]='R';
// rec_dat[3]='H';
// rec_dat[4]=' ';
// rec_dat[5]=' ';
// rec_dat[6]='0'+(TH/10);
// rec_dat[7]='0'+(TH%10);
// rec_dat[8]='C';
shidu=RH;
wendu=TH;
rec_dat[0]='H';
rec_dat[1]=':';
rec_dat[2]='0'+(RH/10);
rec_dat[3]='0'+(RH%10);
rec_dat[4]='R';
rec_dat[5]='H';
rec_dat[6]=' ';
rec_dat[7]=' ';
rec_dat[8]='T';
rec_dat[9]=':';
rec_dat[10]='0'+(TH/10);
rec_dat[11]='0'+(TH%10);
rec_dat[12]='C';
}
}
void main()
{
InitLcd1602(); //1602初始化
while(1)
{
DHT11_delay_ms(500); //DHT11初始1S延時(shí)1500
DHT11_receive();
if(shezhi==0)
{
DHT11_delay_ms(2);
if(shezhi==0)
{
change++;
if(change>3)
{
change=0;
}
}
}
if(change==0)
{
if(jia==0)
{
DHT11_delay_ms(2);
if(jia==0)
{
shidul++;
if(shidul>99)
{
shidul=99;
}
}
}
if(jian==0)
{
DHT11_delay_ms(2);
if(jian==0)
{
shidul--;
if(shidul<0)
{
shidul=0;
}
}
}
}
if(change==1)
{
if(jia==0)
{
DHT11_delay_ms(2);
if(jia==0)
{
shiduh++;
if(shiduh>99)
{
shiduh=99;
}
}
}
if(jian==0)
{
DHT11_delay_ms(2);
if(jian==0)
{
shiduh--;
if(shiduh<0)
{
shiduh=0;
}
}
}
}
if(change==2)
{
if(jia==0)
{
DHT11_delay_ms(2);
if(jia==0)
{
wendul++;
if(wendul>99)
{
wendul=99;
}
}
}
if(jian==0)
{
DHT11_delay_ms(2);
if(jian==0)
{
wendul--;
if(wendul<0)
{
wendul=0;
}
}
}
}
if(change==3)
{
if(jia==0)
{
DHT11_delay_ms(2);
if(jia==0)
{
wenduh++;
if(wenduh>99)
{
wenduh=99;
}
}
}
if(jian==0)
{
DHT11_delay_ms(2);
if(jian==0)
{
wenduh--;
if(wenduh<0)
{
wenduh=0;
}
}
}
}
showset[0]='L';
showset[1]=':';
showset[2]='0'+(shidul/10);
showset[3]='0'+(shidul%10);
showset[4]='H';
showset[5]=':';
showset[6]='0'+(shiduh/10);
showset[7]='0'+(shiduh%10);
showset[8]='L';
showset[9]=':';
showset[10]='0'+(wendul/10);
showset[11]='0'+(wendul%10);
showset[12]='L';
showset[13]=':';
showset[14]='0'+(wenduh/10);
showset[15]='0'+(wenduh%10);
if((shidu< shidul )|| (shidu>shiduh))
{
beep=0;
}
else if((wendu< wendul )|| (wendu>wenduh))
{
beep=0;
}
else
{
beep=1;
}
LcdShowStr(0,1,showset); //顯示溫濕度設(shè)置
LcdShowStr(0,0,rec_dat); //顯示溫濕度
}
}
|
|