基于单片机的温湿度监控报警系统设计
Write_byte(0xa1); Check_Ack(); temp=Read_byte(); SEND1(); IICStop();
return temp; }
void wrteeprom(unsigned char addr,unsigned char dat) { IICStart(); Write_byte(0xa0); Check_Ack(); Write_byte(addr); Check_Ack(); Write_byte(dat); Check_Ack(); IICStop(); }
#ifndef _2402_H_ #define _2402_H_ #include
sbit SCL = P1^0; //模拟I2C 总线的引脚定义
sbit SDA = P1^1; //定义2402在I2C总线协议中从机地址 void DELAY(unsigned int t); //延时函数 void IICStart(void); //I2C开始函数 void IICStop(void); //I2C结束函数 void Ack(void); //I2C应答函数 void NOAck(void); //I2C应答非函数 bit Check_Ack(void); //I2C应答检测函数 void SEND0(void); //I2C发送0函数
void SEND1(void); //I2C发送1函数 void Write_byte(unsigned char dat); //I2C发送字节函数 unsigned char Read_byte(void); //I2C读取字节函数
unsigned char rdeeprom(unsigned char addr); //读AT2402函数 void wrteeprom(unsigned char addr,unsigned char dat); //写AT2402函数
- 32 -
基于单片机的温湿度监控报警系统设计
#endif //_2402_H_ A1.3 DHT11传感器程序
#include \U8 U8FLAG,k;
U8 U8count,U8temp; U8
U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata;
U8 count, count_r=0; void Delay1(U16 j) { U8 i;
for(;j>0;j--)
{ for(i=0;i<27;i++); } }
void Delay_10us(void)
{ U8 i; i--; i--;
i--; i--; i--; i--; } void COM(void) { U8 i;
for(i=0;i<8;i++) { U8FLAG=2; while((!DATA)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0;
if(DATA)U8temp=1;
- 33 -
基于单片机的温湿度监控报警系统设计
U8FLAG=2;
while((DATA)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1.如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; U8comdata|=U8temp; } //0 }
//温湿度读取子程序 -以下变量均为全局变量
//温度高8位== U8T_data_H-温度低8位== U8T_data_L //湿度高8位== U8RH_data_H-湿度低8位== U8RH_data_L //校验 8位 == U8checkdata-调用相关子程序如下 U8 RH(void)
{ DATA=0; //主机拉低18ms Delay1(180); //原来为5 DATA=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us();
DATA=1; //主机设为输入 判断从机响应信号 //判断从机是否有低电平响应信号,不响应跳出,响应则向下运行 if(!DATA) //T ! { U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!DATA)&&U8FLAG++); U8FLAG=2; //判断从机是否发出 80us 的高电平,发出则进入数据接收状态 while((DATA)&&U8FLAG++);
COM(); //数据接收状态 U8RH_data_H_temp=U8comdata; COM();
U8RH_data_L_temp=U8comdata; COM();
- 34 -
基于单片机的温湿度监控报警系统设计
U8T_data_H_temp=U8comdata; COM();
U8T_data_L_temp=U8comdata; COM();
U8checkdata_temp=U8comdata;
DATA=1; //数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; }
U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; } return 1; }
else //传感器不响应 { return 0; }
A1.4 1602程序
/************该程序实现了对液晶1602的控制**************/ #include \#include \
void delay() //功能.延时,延时时间大概为140US。 { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++); } uchar Convert(uchar In_Date) { return In_Date; }
void enable(uchar del) //1602命令函数,输入的命令值 { P0 = Convert(del); RS = 0; RW = 0; E = 0; delay();
- 35 -
相关推荐: