<pre name="code" class="vb"><pre name="code" class="objc"><pre name="code" class="csharp"><h3 style="padding: 0px; margin: 0px 0px 2px; font-size: 10pt; font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun;"><pre name="code" class="cpp"><span style="font-weight: normal;"><span style="font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun; font-size: 14px;">//可以用来测量环境温湿度,当超过一定温度后会自动报警。</span>
#include <AT89X52.h>
#include <intrins.h>
<span style="color:#009900;">//#include"1602.h"
//#include<dh11.h></span>
unsigned char temp[] ="SET H:00% T: C\0"; //设置 的湿度值显示
unsigned char temp_s[] ="RH:00% TEMP:00 \0"; //实时湿度显示
<span style="color:#009900;">//DHT11
//传感器接受和发送信息,然后将接收来的信息作出相应的判断和处理,然后反馈到显示器。
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//</span>
sbit DQ = P3^7 ;
<span style="color:#009900;">//----------------LCD1602-----------------------//</span>
sbit LcdRs = P2^4;
sbit LcdRw = P2^5;
sbit LcdEn = P2^6;
<span style="color:#009900;">//sfr DBPort = 0x80; //端口定义,LcdRs就代表P1^0口,以下同.
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//</span>
unsigned char FLAG,k;
unsigned char tempre;
unsigned char T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
unsigned char T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;
unsigned char comdata;
unsigned char outdata[5]; //定义发送的字节数
unsigned char indata[5];
unsigned int temp1,temp2;
<span style="color:#009900;">//以上为变量的定义.</span>
sbit sw3=P3^4; //按键定义
sbit sw1=P3^2;
sbit sw2=P3^3;
sbit baojing=P2^0;
<span style="color:#009900;">//sbit led=P3^5;</span>
unsigned char setn; //变量定义
unsigned char num1,num2;
unsigned char getdata=55;
unsigned char H_shangxian=80; //湿度上限值 初值
unsigned char T_shangxian=35; //温度上限值 初值
unsigned char temp_h,temp_t;
void key();
void kongzhi();
void delay(unsigned int); //延时程序
void LCD_Initial(); //LCD1602初始化
<span style="color:#009900;">
//DHT11/
</span>
void COM(void);
void Delay2(unsigned int j) //延时函数
{
unsigned char i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //延时10us的延时函数.
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
FLAG=2;
while((!DQ)&&FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
tempre=0;
if(DQ)tempre=1;
FLAG=2;
while((DQ)&&FLAG++);
//超时则跳出for循环
if(FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
comdata<<=1; //左移1位
comdata|=tempre; //comdata与tempre相或,结果保存在comdata中.
}
}
<span style="color:#009900;">//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------</span>
void RH(void)
{
<span style="color:#009900;">//主机拉低18ms </span>
DQ=0;
Delay2(180);
DQ=1;
<span style="color:#009900;"> //总线由上拉电阻拉高 主机延时20us</span>
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
<span style="color:#009900;"> //主机设为输入 判断从机响应信号</span>
DQ=1;
<span style="color:#009900;">//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 </span>
if(!DQ) <span style="color:#009900;">//T ! </span>
{
FLAG=2;
<span style="color:#009900;"> //判断从机是否发出 80us 的低电平响应信号是否结束
</span> while((!DQ)&&FLAG++);
FLAG=2;
<span style="color:#009900;"> //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
</span> while((DQ)&&FLAG++);
<span style="color:#009900;"> //数据接收状态
</span> COM(); //调用COM函数
RH_data_H_temp=comdata;
COM();
RH_data_L_temp=comdata;
COM();
T_data_H_temp=comdata;
COM();
T_data_L_temp=comdata;
COM();
checkdata_temp=comdata;
DQ=1;
<span style="color:#009900;"> //数据校验
</span> tempre=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
if(tempre==checkdata_temp)
{
RH_data_H=RH_data_H_temp;
RH_data_L=RH_data_L_temp;
T_data_H=T_data_H_temp;
T_data_L=T_data_L_temp;
checkdata=checkdata_temp;
}<span style="color:#009900;">//对数据作出相应的处理与运算.</span>
}
}
<span style="color:#009900;">LCD1602
//1602将接受来的信息进过字符转换,反馈到了液晶屏上面///
//同时我们可以根据需要加减所学要的预设湿度值。/
///</span>
void delay(unsigned int z) //延时函数
{
unsigned int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
<span style="color:#009900;">//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
</span>void LCD_Wait(void) //内部等待函数,LCD的显示需要一定的延迟时间.
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
<span style="color:#009900;">// return DBPort;
</span>}
<span style="color:#009900;">//向LCD写入命令或数据
</span>#define LCD_COMMAND 0 <span style="color:#009900;">// Command</span>
#define LCD_DATA 1 <span style="color:#009900;">// Data</span>
#define LCD_CLEAR_SCREEN 0x01 <span style="color:#009900;">// 清屏</span>
#define LCD_HOMING 0x02 <span style="color:#009900;">// 光标返回原点</span>
<span style="color:#009900;">//以上4行为宏定义,以后出现LCD_HOMING的地方就可以用0x02来代替.
</span>void LCD_Write(bit style, unsigned char input) <span style="color:#009900;">//LCD写入子函数,形参为数据类型和无符号字符型输入.</span>
{
LcdEn=0;
LcdRs=style; <span style="color:#009900;">//数据类型传递给LcdRS</span>
LcdRw=0; _nop_();
P0=input; _nop_();//写入的数据传递给DBPort
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
<span style="color:#009900;">// LCD_Wait(); //调用内部等待函数.
</span>}
<span style="color:#009900;">//设置显示模式
//************************************************************</span>
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode) //LCD显示设置子函数
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
<span style="color:#009900;">//设置输入模式</span>
<span style="color:#009900;">//************************************************************
</span>#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
<span style="color:#009900;">//初始化
//LCD***********************************************************</span>
void LCD_Initial() //初始化函数.
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
delay(5);
LCD_Write(LCD_COMMAND,0x38);
delay(5);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
delay(5);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
delay(5);
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
delay(5);
}
<span style="color:#009900;">//液晶字符输入的位置************************
</span>void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
<span style="color:#009900;">//将字符输出到液晶显示
</span>void Print(unsigned char *str)
{
if(setn==1)
{
if(num2==0)
temp[4]='H';
if(num2==10)
temp[4]=' ';
}
if(setn==2)
{
temp[4]='H';
if(num2==0)
temp[10]='T';
if(num2==10)
temp[10]=' ';
}
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
delay(1);
}
}
void key(void) //按键检测程序
{
if(sw1==0)
{
baojing=0;
delay(50);
baojing=1;
if(sw1==0)
{
setn++;
if(3==setn)
{
setn=0;
temp[4]='H';
temp[10]='T';
}
}
while(sw1==0);
}
if(setn!=0)//上限设置
{
if(sw2==0) //上限 减功能
{
baojing=0;
delay(50);
baojing=1;
if(sw2==0)
{
if(setn==1)
{
if(H_shangxian<99)
H_shangxian++;
else
H_shangxian=99;
}
if(setn==2)
{
if(T_shangxian<99)
T_shangxian++;
else
T_shangxian=99;
}
}
while(sw2==0);
}
if(sw3==0) //上限 加功能
{
baojing=0;
delay(50);
baojing=1;
if(sw3==0)
{
if(setn==1)
{
if(H_shangxian>0)
H_shangxian--;
else
H_shangxian=0;
}
if(setn==2)
{
if(T_shangxian>0)
T_shangxian--;
else
T_shangxian=0;
}
}
while(sw3==0);
}
}
}
void kongzhi() //控制报警
{
if((temp_h>=H_shangxian)||(temp_t>=T_shangxian)) <span style="color:#009900;">//当温湿度任一值超过限度时</span>
{
<span style="color:#009900;"> //led=1;</span>
num1++;
if(num1>=20)
{
num1=0;
baojing=~baojing;
}
}
else {baojing=1; }
}
void zhuanhuan()//扫描数据转换
{
temp[6]=H_shangxian/10%10+0x30;
temp[7]=H_shangxian%10+0x30;
temp[12]=T_shangxian/10%10+0x30;
temp[13]=T_shangxian%10+0x30;
temp[14]=0xdf;
temp_s[3]=temp_h/10%10+0x30;
temp_s[4]=temp_h%10+0x30;
temp_s[3]=temp_h/10%10+0x30;
temp_s[4]=temp_h%10+0x30;
temp_s[12]=temp_t/10%10+0x30;
temp_s[13]=temp_t%10+0x30;
temp_s[14]=0xdf;
temp_s[15]='C';
}
<span style="color:#009900;">//------------------------------------------------------------
</span>main()
{
baojing=0;
delay(500);
baojing=1;
<span style="color:#009900;">// led=0;</span>
LCD_Initial(); <span style="color:#009900;">//液晶初始化</span>
while(1)
{
RH();
temp_t=T_data_H;
temp_h=RH_data_H;
zhuanhuan();
key();<span style="color:#009900;">// 按键检测 </span>
kongzhi();
GotoXY(0,0);//显示起始位置 Y=0,第一行,Y=1 第二行//显示第一行
Print(temp);// 内容
GotoXY(0,1);//显示起始位置 Y=0,第一行,Y=1 第二行 显示第二行
Print(temp_s);// 内容
delay(1);
<span style="color:#009900;">//getdate= GetADCResult(0)*3.9;</span>
if(setn!=0)
{
num2++;
if(num2==20)
{
num2=0;
}
}
}
}</span>