1、单片机 智能环境监测系统程序51单片机 智能环境监测系统程序王维进#include #include #include #include #include 0832.h#define uchar unsigned char#define uint unsigned int#include eeprom52.hsbit DATA = P37; /温湿度sbit E=P25; /1602使能引脚sbit RS=P27; /1602数据/命令选择引脚sbit RW=P26;sbit K1=P13;/设置键sbit K2=P14;/加sbit K3=P15;/减sbit K4=P17; /人体sbit
2、 K5=P16; /布防撤防按键sbit LED1=P31; /烟雾报警sbit LED2=P32; /温度上限sbit LED3=P33; /温度下限sbit LED4=P34; /湿度上限sbit LED5=P35; /湿度下限sbit LED6=P36; /红外报警sbit alarm=P30; /蜂鸣器uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;uchar U8RH_data_H,U8RH_data_L,U
3、8T_data_H,U8T_data_L,U8checkdata;uchar Mode,humidity,temperature,smog;bit BJ_LED1=1,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1;bit bdata FlagStartRH;uchar flag ;/记录当前设置状态uint count;/定时器0初始化void Timer0_Init() ET0 = 1; /允许定时器0中断 TMOD = 0x11; /定时器工作方式选择 TL0 = 0xFF; TH0 = 0x4B; /定时器赋予初值 TH1=0xdc;
4、 TL1=0x00; ET1=1; TR0 = 1; /启动定时器/定时器0中断void Timer0_ISR (void) interrupt 1 using 0 uchar RHCounter; TL0 = 0xFF; TH0 = 0x4B; /定时器赋予初值 RHCounter+; if (RHCounter = 15) FlagStartRH = 1; RHCounter = 0; void Delay1(uint j) uchar i; for(;j0;j-) for(i=0;i27;i+); void Delay_10us(void) uchar i; i-; i-; i-; i-
5、; i-; i-; void COM(void) uchar i; for(i=0;i8;i+) U8FLAG=2; while(!DATA)&U8FLAG+); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(DATA)U8temp=1; U8FLAG=2; while(DATA)&U8FLAG+); /超时则跳出for循环 if(U8FLAG=1)break; /判断数据位是0还是1 / 如果高电平高过预定0高电平值则数据位为 1 U8comdata=1; U8comdata|=U8temp; /0 /rof/-/-温湿度读取子
6、程序 -/-/-以下变量均为全局变量-/-温度高8位= U8T_data_H-/-温度低8位= U8T_data_L-/-湿度高8位= U8RH_data_H-/-湿度低8位= U8RH_data_L-/-校验 8位 = U8checkdata-/-调用相关子程序如下-/- Delay();, Delay_10us();,COM(); /-uchar RH(void) /主机拉低18ms DATA=0; Delay1(180); /原来为5 DATA=1; /总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_1
7、0us(); /主机设为输入 判断从机响应信号 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(); U8T_data_H
8、_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
9、_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; return 1; else /传感器不响应 return 0; /* 文件名 : 液晶1602显示.c* 描述 : 该程序实现了对液晶1602的控制。*/* 名称 : delay()* 功能 : 延时,延时时间大概为140US。* 输入 : 无* 输出 : 无*/void delay() int i,j; for(i=0; i=10; i+) for(j=0; j99) TH=0;if(TH98) TL=0; if(TL=TH) TL=TH-1; write_1602com(0x8c);wri
10、te_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break; case 3: HH+;if(HH99) HH=0; if(HH98) HL=0; if(HL=HH) HL=HH-1; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break; case 5: SM+;if(SM9) SM=0; write_1602com(0x83);write_1602dat(SM
11、/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break; while(!K2); if(K3=0) Delay1(200); if(K3=0) switch (flag) case 1: TH-;if(TH99) TH=99; if(TH99) TL=98;if(TL=TH) TL=TH-1; write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break; case 3: HH-;if(HH
12、99) HH=99; if(HH99) HL=98;if(HL=HH) HL=HH-1; write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break; case 5: SM-;if(SM99) SM=9; write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break; while(!K3); if(K5=0) Delay1(
13、200); if(K5=0&flag=0) if(bufang=2|bufang=1) bufang=0; count=0; TR1=0; write_eeprom(); write_1602com(0xcf); write_1602dat( ); else TR1=1; write_1602com(0xcf); write_1602dat(Z); bufang=2; while(K5=0); void Onealarm() alarm=0; Delay1(200); alarm=1;/* 名称 : Main()* 功能 : 主函数*/void main() uint testnum; EA
14、= 0; Timer0_Init(); /定时器0初始化 EA = 1; RW=0; L1602_init(); write_1602com(0x85); write_1602dat(0xdf); write_1602com(0x80); write_1602dat(T); display(); init_eeprom(); read_eeprom(); write_1602com(0x80); write_string(Te: C Hu: % ); write_1602com(0xc0); if(bufang=1) write_string(Sg: mg/m3 B); else write_
15、string(Sg: mg/m3 ); while(1) if (FlagStartRH = 1) /温湿度转换标志检查 TR0 = 0; testnum = RH(); FlagStartRH = 0; TR0 = 1; humidity = U8RH_data_H; /读出温湿度,只取整数部分 temperature = U8T_data_H; if(temperature=TH) LED2=0;BJ_LED2=0; else LED2=1;BJ_LED2=1; if(temperature=HH) LED4=0;BJ_LED4=0; else LED4=1;BJ_LED4=1; if(humidity=SM) LED1=0;BJ_LED1=0; else LED1=1;BJ_LED1=1; if(K4=0&bufang=1) LED6=0;BJ_LED6=0; else if(count=0|count=2000) LED6=1;BJ_LED6=1; if(BJ_LED1=0|BJ_LED2=0|BJ_LED3=0|
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1