智能风扇控制系统
设计报告
(电子大赛选拔赛)
小组成员:沈君豪/130144323 13电子中美 吕智超/130154338 13电子中美 黄寒雪/130154359 13电子中美 设计时间:2015.2—2015.3
一. 前期准备:
经过我们小组三人的讨论,最终我们决定采用8051作为整个系统的控制部分,运用8051系列单片机以及C51编程实现解决方案。故我们事先进行了分工,并进入了准备阶段。
二. 总体设计:
作为控制部分,我们决定使用8051单片机;电源部分我们采用了micro usb 母座进行供电,工作时可以插入手机充电器(micro usb公头)进行供电;风扇使用直流电机代替;直流电机驱动部分则使用L298N芯片。
1.首先是按键部分,3个按键(分别表示风速、类型、停止)的状态以启动电扇或设置相应的工作状态。这样就需要3个按键,要通过一个按键来控制2个以上的状态,可以通过按键的次数来控制第几种状态,比如风速有三种状态(弱、中、强),可以用按键1次控制弱,按键2次控制中,按键3次控制强,这样就可以实现一键控制多钟状态了。其中停止按键与P3.2(外部中断0)相接,按下时即可停止所有行为。
2.控制器的指示灯,我们想使用六个LED灯进行显示,分别显示不同风速、类型等6个指示信号。
3. 用直流电机作为电风扇,其转速和停止可通过改变L298N其使能输入的频率来改变电机的速度。利用L298N的2,3引脚来驱动直流电机。
4.风速和风种的实现,采用8051的定时器中断,每隔一定的时间停止L298N的使能输入,使电机停止,改变不同的定时时间,来获得电机的不同转速与风种。
三. 原理图:
四.程序设计(C51)
#include #define uchar unsigned char #define uint unsigned int sbit A1=P1^0;//电机控制端口 sbit B1=P1^1; sbit ENA=P1^2; sbit key1=P3^0; //风速设置按键 sbit key2=P3^1; //风种设置按键 sbit key3=P3^2; //停止设置按键 sbit led1=P0^0;//强风指示灯 sbit led2=P0^1;//中风指示灯 sbit led3=P0^2;//慢风指示灯 sbit led4=P0^3;//正常指示灯 sbit led5=P0^4;//自然指示灯 sbit led6=P0^5;//睡眠指示灯 bit Stop_Flag = 0; uint count = 0; uchar pwm_duty = 0;//最大为100 uchar wind_speed = 0;//分为三级 0高 1中 2慢 uchar wind_mode = 0; //分为三类 0正常 1自然 2睡眠 uint time = 0; //计时变量 void delay1ms(void) { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void Motor_Forward()//电机正转 { A1=1; B1=0; ENA=1; } void Motor_Reversal()//电机反转 { A1=0; B1=1; ENA=1; } void Motor_Stop()//电机急停 { A1=1; B1=1; ENA=0; } void InitTimer0(void)//T0初始化为1ms定时器 { TMOD = 0x01; TH0 = 0x0FC; TL0 = 0x18; EA = 1; ET0 = 1; //TR0 = 1; } //主函数 void main() { //端口配置 P0=0xff; P1=0x00; P2=0xff; P3=0xff; InitTimer0(); EX0=1; //外部中断0开 IT0=1; //边沿触发 TR0 = 1; while(1) { if(!key1) //设置风速 { delay1ms(); if(!key1) { wind_speed++; if(wind_speed >= 3) wind_speed = 0; TR0 = 1; //开启定时器 Stop_Flag = 0; //标志位清零 } while(!key1); //等待按键释放 } if(!key2) //设置风种 { delay1ms(); if(!key2) { wind_mode++; if(wind_mode >= 3) wind_mode = 0; time = 0; } while(!key2); //等待按键释放 } if(!Stop_Flag) { switch(wind_speed) { case 0: pwm_duty = 100;//100%转速 A1=1; B1=0; led1 = 0; led2 = 1; led3 = 1; break; case 1: pwm_duty = 70; //70%转速 A1=1; B1=0; led1 = 1; led2 = 0; led3 = 1; break; case 2: pwm_duty = 40; //40%转速 A1=1; B1=0; led1 = 1; led2 = 1; led3 = 0; break; default: A1=1; B1=1; break; } } else { P0 = 0xff;//LED全灭 } } } void Timer0Interrupt(void) interrupt 1 { TH0 = 0x0FC; TL0 = 0x18; count++; if(wind_mode == 0) //正常 { if(count <= pwm_duty) ENA = 1; else ENA = 0; if(count >= 100) count = 0; led4 = 0; led5 = 1; led6 = 1; } else if(wind_mode == 1)//自然 { time++; if(time <= 4000)//4s { if(count <= pwm_duty) ENA = 1; else ENA = 0; if(count >= 100) count = 0; } else { ENA = 0; //定时器中断T0 } if(time >= 8000) time = 0; led4 = 1; led5 = 0; led6 = 1; } else //睡眠 { time++; if(time <= 8000)//8s { if(count <= pwm_duty) ENA = 1; else ENA = 0; if(count >= 100) count = 0; } else { ENA = 0; } if(time >= 16000) time = 0; led4 = 1; led5 = 1; led6 = 0; } } void ISR_Key(void) interrupt 0 using 1 //外部中断0 { Motor_Stop(); //关闭马达 P0 = 0xff;//关闭所有LED TR0 = 0; Stop_Flag = 1; } 四. 实物焊接图 五.元件清单: STC89C51 L298N 1个 1个 按键 4个 12M晶振 1个 22Pf电容 2个 10Uf电解电容 1个 直流电机 1个 330Ω电阻 6个 10kΩ电阻 6个 LED 6个 六.参考用书: 1.《工程电路分析》(美)WilliamH.Hayt(威廉H.海特) 著电子工业出版社 出版时间 2012-9-1 2.《C Primer Plus》 (美)Stephen Prata 著 人民邮电出版社 出版时间 2005-2-1 3.《时间触发嵌入式系统设计模式》(英) Michael J.Pont 中国电力出版社 出版时间 2004-7-1 著 因篇幅问题不能全部显示,请点此查看更多更全内容