仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #include "1602.h"
- #include "delay.h"
- #include"18b20.h"
- #include"i2c.h"
- sbit led_l = P1^0;
- sbit led_b = P1^1;
- sbit fan = P1^4;
- sbit relay = P1^3;
- sbit key_s = P3^4;
- sbit key_a = P3^5;
- sbit key_u = P3^6;
- unsigned char readTem = 0 ;
- unsigned char readADCFlag = 0 ;
- int temp;
- float temperature = 0;
- char disdat[16];
- char disset[16];
- unsigned long time_20ms=0;
- float Lv=0.0;
- float Tv=0.0;
- unsigned int Lval =0;
- unsigned int Rval = 0;
- unsigned int distem;
- unsigned char rekey = 0;
- unsigned char SetFlag = 0;
- unsigned char setLval = 50;
- unsigned char setRval = 50;
- unsigned char setTval = 35;
- void Init_Timer0(void);
- void main (void)
- {
- unsigned char midval;
- Init_Timer0();
- LCD_Init();
- DelayMs(20);
- LCD_Clear();
- led_l = 0;relay = 0;led_b = 0;fan = 0;
- DelayMs(200);
- led_l = 1;relay = 1;led_b = 1;fan = 1;
- sprintf(disdat,"L:%2d R:%2d T:%2d C",Lval,Rval,distem);
- LCD_Write_String(0,0,disdat);
- sprintf(disset," L:%2d R:%2d T:%2d",(unsigned int)setLval,(unsigned int)setRval,(unsigned int)setTval);
- LCD_Write_String(0,1,disset);
- while (1)
- {
- if((key_s == 0)||(key_a == 0 )||(key_u == 0))
- {
- if(rekey == 0)
- {
- DelayMs(10);
- if(key_s == 0)
- {
- if(SetFlag == 0)
- {
- SetFlag =1;
- }
- else if(SetFlag == 1)
- {
- SetFlag =2;
- }
- else if(SetFlag == 2)
- {
- SetFlag = 3;
- }
- else if(SetFlag == 3)
- {
- SetFlag =0;
- }
- rekey = 1;
- }
- if(key_a == 0)
- {
- if(SetFlag == 1)
- {
- if(setLval <99)
- {setLval++;}
- }
- else if(SetFlag == 2)
- {
- if(setRval <99)
- {setRval++;}
- }
- else if(SetFlag == 3)
- {
- if(setTval <99)
- {setTval++;}
- }
- rekey = 1;
- }
- if(key_u == 0)
- {
- if(SetFlag == 1)
- {
- if(setLval >0)
- {setLval--;}
- }
- else if(SetFlag == 2)
- {
- if(setRval >0)
- {setRval--;}
- }
- else if(SetFlag == 3)
- {
- if(setTval >0)
- {setTval--;}
- }
- rekey = 1;
- }
- }
- }
- else
- {rekey = 0;}
- if(readADCFlag == 1)
- {
- midval=ReadADC(1);
- Lv=5.15-(float)midval*5.15/255;
- Lval = (unsigned int )(Lv * 100 )/5.16;
- DelayMs(10);
- midval=ReadADC(0);
- Tv=5.15-(float)midval*5.15/255;
- Rval = (unsigned int )(Tv * 100 )/5.16;
- sprintf(disdat,"L:%2d R:%2d T:%2d C",Lval,Rval,distem);
- LCD_Write_String(0,0,disdat);
- LCD_Write_Char(14,0,0XDF) ;
- readADCFlag = 0 ;
- sprintf(disset," L:%2d R:%2d T:%2d ",(unsigned int)setLval,(unsigned int)setRval,(unsigned int)setTval);
- LCD_Write_String(0,1,disset);
- if(SetFlag == 1)
- {
- LCD_Write_Char(0,1,'S') ;
- LCD_Write_Char(5,1,' ') ;
- LCD_Write_Char(10,1,' ') ;
- }
- else if(SetFlag == 2)
- {
- LCD_Write_Char(0,1,' ') ;
- LCD_Write_Char(5,1,'S') ;
- LCD_Write_Char(10,1,' ') ;
- }
- else if(SetFlag == 3)
- {
- LCD_Write_Char(0,1,' ') ;
- LCD_Write_Char(5,1,' ') ;
- LCD_Write_Char(10,1,'S') ;
- }
- else
- {
- LCD_Write_Char(0,1,' ') ;
- LCD_Write_Char(5,1,' ') ;
- LCD_Write_Char(10,1,' ') ;
- }
- if(Lval <= setLval)
- {
- led_l = 0;
- }
- else
- {
- led_l = 1;
- }
- if(Rval <= setRval)
- {
- relay = 0;
- }
- else
- {
- relay = 1;
- }
- if(distem <= setTval)
- {
- led_b = 0;
- fan = 1;
- }
- else
- {
- led_b = 1;
- fan = 0;
- }
- }
- if(readTem==1)
- {
- temp=ReadTemperature();
- temperature=(float)temp*0.0625;
- if(temperature >1)
- {distem = (unsigned int )temperature;}
- readTem=0;
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01;
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
-
- time_20ms++;
- if(time_20ms % 20 == 0)
- {
- readADCFlag = 1;
- }
- if(time_20ms % 40 == 0)
- {
- readTem = 1;
- }
- }
复制代码 有对单片机感兴趣的,研究技术的,欢迎加群955477798
所有资料51hei提供下载:
51大鹏温湿度光照(准) (2).zip
(290.07 KB, 下载次数: 192)
|