|
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>
typedef bit BOOL ;
sbit io = P1^1 ;//(口线定义)
sbit bee= P1^0 ;
sbit rs = P2^5 ;
sbit rw = P2^6 ;
sbit ep = P2^7 ;
sbit led =P1^5 ;
bit flag_300ms ;
sbit K1=P1^2;
sbit K2=P1^3;
sbit K3=P1^4;
uchar yemian=0;//(定义变量)
uchar flat=1;
uchar data_byte;
uchar RH,RL,TH,TL;
uchar WenDu,ShiDu;//报警的温度和湿度
uchar value;
/****************************延时程序****************************/
void delay(uchar ms)
{ // 延时子程序
uchar i ;
while(ms--)
{
for(i = 0 ; i<120;i++) ;
}
}
void delay1()//延时10us
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************报警程序部分*******************/
void warn() //报警函数
{
if(TH>WenDu) //检测的温度高于设定温度报警值
{
bee=0; //报警
led=0;delay(10);led=~led; //灯快闪烁
}
if(RH>ShiDu) //检测的湿度高于设定湿度报警值
{
bee=0; //报警
led=0;delay(10);led=~led; //灯快闪烁
}
if( TH<WenDu && RH<ShiDu )
{
bee=1; //停止报警
led=1; //停止闪烁
}
}
/************************LCD模块******************************************/
BOOL lcd_bz()//测试LCD忙碌状态
{
uchar temp ;
rs = 0 ;
rw = 1 ;
_nop_();
P0=0xff;
_nop_();
ep=1;
temp=P0;
_nop_();
ep = 0 ;
return (temp&0x80);
}
void write_cmd(uchar cmd)// 写指令
{
while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
_nop_();
ep = 0 ;
P0 = cmd ;
_nop_();
ep = 1 ;
_nop_();
_nop_();
ep = 0 ;
_nop_();
_nop_();
}
void write_addr(uchar addr)//写地址
{
write_cmd(addr|0x80) ;
}
void write_byte(uchar dat)//写字节
{
while(lcd_bz()) ;
rs = 1 ;
rw = 0 ;
_nop_();
ep = 0 ;
P0 = dat ;
_nop_();
ep = 1 ;
_nop_();
_nop_();
ep = 0 ;
_nop_();
_nop_();
}
void lcd_init()// 初始化
{ delay(10);
write_cmd(0x38) ;
delay(5);
write_cmd(0x08) ;
delay(5);
write_cmd(0x01) ;
delay(1);
write_cmd(0x06) ;
delay(1);
write_cmd(0x0c) ;
delay(1);
}
void display(uchar addr, uchar q)//在某一地址上显示一字节
{
delay(1) ;
write_addr(addr) ;
write_byte(q) ;
delay(1) ;
}
/*********************** DHT11测试模块***************************************/
void start()//开始信号
{
io=1;
_nop_();
_nop_();
io=0;
delay(18);//>18ms
io=1;
delay1();//20-40us
delay1();
delay1();
delay1();
}
uchar receive_byte()//接收一个字节
{
uchar i;
for(i=0;i<8;i++)
{
data_byte<<=1; //循环左移
while(!io); //每发送一位数据间隔50us低电平
delay1();delay1();delay1();delay1(); //延迟40us
if(io==1)
{
data_byte=data_byte|0x01;
while(io);
}
else
{
data_byte=data_byte|0x00;
}
}
return data_byte;
}
void receive()//接收数据
{
uchar T_H,T_L,R_H,R_L,check;
start();//开始信号
io=1;
if(!io)//读取DHT11响应信号
{
while(io==0) ; //判断输出低电平
while( io==1) ; //判断输出高电平
R_H=receive_byte();
R_L=receive_byte();
T_H=receive_byte();
T_L=receive_byte();
check=receive_byte();
io=0;
delay1();delay1();delay1();delay1();delay1(); //拉低延时50us
io=1;
if(R_H+R_L+T_H+T_L==check) //矫正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
}
}
//void showw() // 问候语函数
//{
// lcd_init(); //初始化
// delay(10);
//
// display(0x01,'I');
// display(0x02,' ');
// display(0x03,'a');
// display(0x04,'m');
// display(0x05,' ');
// display(0x06,'s');
// display(0x07,'u');
// display(0x08,'p');
// display(0x09,'e');
// display(0x0a,'r');
// display(0x0b,'m');
// display(0x0c,'a');
// display(0x0d,'n');
// display(0x0e,'!');
// delay(250); //短暂延时
// delay(250);
// delay(250);
// delay(250);
//
//}
/*************定时器0初始化程序***************/
void time_init()
{
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
EA = 1; //开总中断
}
void caidan() //按键程序 选择菜单模式
{
if(!K1)
{
delay(20);
if(!K1)
{
while(!K1)
;
yemian++;
flat++;
if(yemian>=3)
{
yemian=0;
}
}
}
}
shezhi() //对里面的数值进行修改
{
if(!K2)
{
delay(50);
if(!K2)
{
if(yemian==1)
{
WenDu+=1;
if(WenDu>99) WenDu=99; //湿度上限加
}
if(yemian==2)
{
ShiDu+=1;
if(ShiDu>99) ShiDu=99; //湿度下限加
}
}
}
if(!K3)
{
delay(50);
if(!K3)
{
if(yemian==1)
{
WenDu-=1; //湿度下限减
if(WenDu<1) WenDu=1;
}
if(yemian==2)
{
ShiDu-=1; //湿度下限减
if(ShiDu<1) ShiDu=1;
}
}
}
}
/***************************主程序*********************************/
void main()
{
// start();
time_init(); //初始化定时器
// showw(); //显示问候语 和名字
WenDu=40;
ShiDu=60;
value=0;
while(1)
{
caidan();
//====================yemian==0时 进入工作状态=================================
if(yemian==0)
{
if(flat==1)
{
flat=0;
lcd_init(); //初始化
display(0x00,'T') ; //Temp
display(0x01,'e');
display(0x02,'m');
display(0x03,'p');
display(0x04,':');
display(0x08,0xdf); // 度
display(0x09,'C');
display(0x40,'H') ; //Humi
display(0x41,'u');
display(0x42,'m');
display(0x43,'i');
display(0x44,':');
display(0x47,'%');
display(0x48,'R');
display(0x49,'H');
display(0x0c,'T');
display(0x0d,':');
display(0x0e,WenDu/10+0x30); //温度报警
display(0x0f,WenDu%10+0x30);
display(0x4c,'H');
display(0x4d,':');
display(0x4e,ShiDu/10+0x30); //湿度报警
display(0x4f,ShiDu%10+0x30);
}
if(flag_300ms == 1)
{
flag_300ms = 0;
receive();
display(0x05,(TH)/10+0x30); //温度显示
display(0x06,(TL)%10+0x30);
display(0x45,RH/10+0x30); //湿度显示
display(0x46,RL%10+0x30);
warn();
}
}
//====================yemian==1 温度设置===========================
if(yemian==1) //温度
{
if(flat==1)
{
flat=0;
bee=1;
lcd_init(); //初始化
display(0x06,'T');
display(0x07,'e');
display(0x08,'m');
display(0x09,'p');
}
shezhi();
display(0x47,WenDu/10+0x30); //温度显示
display(0x48,WenDu%10+0x30);
}
//====================yemian==1湿度设置==========================
if(yemian==2) //湿度设置
{
if(flat==1)
{
flat=0;
bee=1;
lcd_init(); //初始化
display(0x06,'H');
display(0x07,'u');
display(0x08,'m');
display(0x09,'i');
}
shezhi();
display(0x47,ShiDu/10+0x30); //湿度显示
display(0x48,ShiDu%10+0x30);
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256; // 50ms
value++;
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
value = 0;
}
}
|
|