前述:
QQ:961209458
V X:F9986858
承接毕业设计。
设计内容
本设计将要实现一个以单片机为核心的红外遥控电风扇系统的设计。该控制系统具有红外遥控发射与接收,温度采集,定时工作,手动、自动控制转速的功能。采用红外遥控器远程控制风扇的开启和停止,也可以通过遥控控制控制风扇的工作时间,也可以根据温度自动控制风扇转速或是手动控制转速。
硬件方案
红外遥控电风扇系统硬件如下图1所示,其主要包括红外遥控发射器,遥控信号接收,温度采集,风扇控制以及单片机最小系统。单片机最小系统是整个系统的控制核心,负责各个模块之间的数据计算和传输。红外遥控器发射编码信号,接收头接收编码信息,由单片机进行解码,然后单片机根据解码指令进行风扇控制和定时,在屏幕部分可以显示当前室温和风扇转速档位。
软件方案
红外遥控电风扇系统软件流程图如图2所示,红外遥控电风扇系统设计采用单片机开发软件和应用软件来实现系统的设计。通过DS18B20来时实现温度采集,通过LCD1602屏幕显示风扇定时时长和转速档位,通过红外遥控器控制风扇的启动、停止以及工作时长。
硬件电路
部分核心代码
#include "reg52.h"
#include "lcd1602.h"
#include "delay.h"
#include "Ds18b20.h"
#include "infrared.h"
sbit LED1 = P2^5;
sbit LED2 = P2^6;
sbit LED3 = P2^7;
sbit AIN1 = P3^5;
sbit AIN2 = P3^4;
sbit PWMA = P3^3;
void Timer0_Init();
void LED_Select(u8 num);
void Motor();//电机
void main()
{
LCD_Init();//LCD1602初始化
Timer0_Init();//定时器0初始化
IrInit();//外部中断初始化
AIN1=0;AIN2=1;PWMA=0;//初始化TB6612 关闭电机
while(1)
{
if(Temp_ok) {Temp_ok=0;Tem_display(Ds18b20ReadTemp());}//获取温度
Display();//显示
Ir_work();//红外解码
Motor();//电机
}
}
void Motor()
{
u8 temp_wendu;
if(time_set_ok)
{
if(motor_dangwei==0)LED_Select(0);
if(motor_dangwei==1)LED_Select(1);
if(motor_dangwei==2)LED_Select(2);
if(motor_dangwei==3)LED_Select(3);
}
else
LED_Select(0);
//自动计算电机转速
if(!hand_or_auto)
{
temp_wendu=shi*10+ge;
if(temp_wendu>24) {PWM_Duty=temp_wendu-24;if(PWM_Duty>=10) PWM_Duty=10;}
else PWM_Duty=0;
}
else {PWM_Duty=0;}
}
void LED_Select(u8 num)
{
if(num==0)
{LED1=0;LED2=0;LED3=0;}
if(num==1)
{LED1=1;LED2=0;LED3=0;}
if(num==2)
{LED1=1;LED2=1;LED3=0;}
if(num==3)
{LED1=1;LED2=1;LED3=1;}
}
void Timer0_Init()
{
TMOD = 0x01;
TH0 = (65536-1000)/256;//定时1ms
TL0 = (65536-1000)%256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void Service_Timer0() interrupt 1
{
static u8 count;
static u16 set_time_count;
static u16 count_temp;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
count++;count_temp++;
if(motor_run==1)
{
if(hand_or_auto==1&&run_time_1>0) PWM_Duty=motor_dangwei*3;//手动模式下,档位受控 0 3 6 9
if(count<PWM_Duty)
{PWMA=1;}//电机工作
else
{PWMA=0;}//电机不工作
if(count==10)
{count=0;}
}
if(++count_temp>=1000) {Temp_ok=1;count_temp=0;}//一秒获取一次温度
if(time_set_ok){
if(++set_time_count>=60000) {set_time_count=0;
if(run_time_1>0){
if(run_time_1==0){time_set_ok=0;motor_run=0;PWMA=0;}//时间为0
run_time_1--;//一分钟减一
run_time[0]=run_time_1/100;run_time[1]=run_time_1%100/10;run_time[2]=run_time_1%10;}//更新显示运行时间
}
}
}