温控风扇程序
带中文注释
- #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)
|