溫控風扇程序
帶中文注釋
- #include <REGX52.H>
- #include "LCD1602.h"
- #include "DS18B20.h"
- #include "Delay.h"
- #include "AT24C02.h"
- #include "Key.h"
- #include "Timer0.h"
- #include "Buzzer.h"
- //電機引腳定義
- sbit Motor = P1^0;
- //指示燈引腳定義
- sbit LED_H = P2^2;
- sbit LED_L = P2^3;
- sbit LED_Fan=P2^4;
- float T,Tabs; //Tabs是溫度的絕對值
- char TLow,THigh; //溫度上限和下限
- unsigned char Counter,Compare,KeyNum,Mode,Fan;
- //Counter:定時器計數
- //Compare:PWM(Pulse Width Modulation)即脈沖寬度調制
- //KeyNum:接收獨立按鍵鍵值
- //Mode:按鍵調控THigh,TLow模式選擇
- //Fan:控制風扇是否隨溫度變化轉動
- void main()
- {
- DS18B20_ConvertT(); //防止剛上電時溫度未轉換出現默認值
- Delay(750); //轉換所需要的時間
- THigh=AT24C02_ReadByte(0); //從ROM中讀取上一次設置的溫度閥值
- TLow=AT24C02_ReadByte(1);
- if(THigh>125 || TLow<-55 || THigh<=TLow)//如果讀取出的數據不合法,添加默認值
- {
- THigh=20;
- TLow=15;
- }
- LCD_Init(); //初始化LCD1602
- LCD_ShowString(1,1,"T:");
- LCD_ShowString(2,1,"TH:");
- LCD_ShowString(2,9,"TL:");
- LCD_ShowChar(1,10,0xDF); //顯示特殊字符℃
- LCD_ShowChar(1,11,'C');
- LCD_ShowSignedNum(2,4,THigh,3);
- LCD_ShowSignedNum(2,12,TLow,3);
- LED_L=1;LED_H=0; //默認光標在THigh,指示燈亮
- Timer0_Init(); //定時器初始化
- while(1)
- {
- KeyNum=Key(); //讀取鍵值
- /*溫度讀取及顯示*/
- DS18B20_ConvertT();
- T=DS18B20_ReadT();
- if(T<0) //對溫度正負的處理
- {
- LCD_ShowChar(1,3,'-');
- Tabs=-T;
- }
- else
- {
- LCD_ShowChar(1,3,'+');
- Tabs=T;
- }
- LCD_ShowNum(1,4,Tabs,3); //顯示整數部分
- LCD_ShowChar(1,7,'.'); //顯示小數點
- LCD_ShowNum(1,8,(unsigned long)(Tabs*100)%100,2); //顯示小數點后兩位
- //最多可顯示四位,因為DS18B20測溫度的精度為2^(-4)
- /*閾值判斷及顯示*/
- if(KeyNum) //判斷是否有按鍵按下
- {
- if(KeyNum==1) //按鍵1控制Mode
- {
- if(Mode==0){Mode=1;} //切換光標到TLow
- else{Mode=0;}
- LED_L=~LED_L;
- LED_H=~LED_H;
- }
- if(KeyNum==2) //按鍵2控制閥值的增加
- {
- if(Mode==0)
- {
- THigh++;
- if(THigh>125){THigh=125;} //DS18B20測溫度的范圍為:-55~125攝氏度
- }
- else
- {
- TLow++;
- if(THigh<=TLow){TLow--;} //確保閥值的合法性
- }
- }
- if(KeyNum==3) //按鍵2控制閥值的增加
- {
- if(Mode==0)
- {
- THigh--;
- if(THigh<=TLow){THigh++;}
- }
- else
- {
- TLow--;
- if(TLow<-55){TLow=-55;}
- }
- }
- if(KeyNum==4) //按鍵4控制風扇是否隨溫度變化轉動
- {
- if(Fan==0){Fan=1;Compare=0;}
- else{Fan=0;}
- LED_Fan=~LED_Fan;
- }
- Buzzer_Time(20); //按鍵提示音,默認響20ms,500Hz,無源蜂鳴器
- LCD_ShowSignedNum(2,4,THigh,3); //更新閥值
- LCD_ShowSignedNum(2,12,TLow,3);
- AT24C02_WriteByte(0,THigh); //寫入閥值到ROM中
- Delay(5);
- AT24C02_WriteByte(1,TLow);
- Delay(5);
- }
- if(T>THigh) //閥值與當前溫度比較
- {
- LCD_ShowString(1,13,"OV:H");
- if(Fan==0){Compare=60;} //溫度過高則電機占空比為30%
- }
- else if(T<TLow)
- {
- LCD_ShowString(1,13,"OV:L");
- if(Fan==0){Compare=0;} //溫度過低則電機占空比為0
- }
- else
- {
- LCD_ShowString(1,13," ");
- if(Fan==0){Compare=40;} //溫度正常則電機占空比為20%
- }
- }
- }
- void Timer0_Routine() interrupt 1
- {
- static unsigned int Counter;
- TL0 = 0xA4; // 100us
- TH0 = 0xFF;
-
- Counter++;
- if(Counter>=200) //每20ms,掃描一次按鍵
- {
- Counter = 0;
- Key_Loop();
- }
- if(Counter<Compare) //Compare:PWM(Pulse Width Modulation)即脈沖寬度調制
- {
- Motor=1;
- }
- else
- {
- Motor=0;
- }
- }
復制代碼
原理圖: 無
仿真: 無
代碼:
智能溫控風扇.zip
(84.29 KB, 下載次數: 49)
2023-9-17 15:03 上傳
點擊文件名下載附件
|