设计内容:1、3个独立按键分别控制“自然风”、“睡眠风”、“常风”,(三者的区别是直流电机的停歇时间不同),并在数显管上显示出区别
2、每种类型风可以根据按下独立按键次数分为4个档的风力调节。
3、设计风扇的过热保护,用继电器实现。即当风扇运行一段时间后,暂停10秒。
4、其他创新内容(如报警提示
程序如下:#include<reg51.h> //头文件
sbit K1=P1^0; //定义按键 开关 sbit K2=P1^1; //正常风 sbit K3=P1^2; //自然风 sbit K4=P1^3; //睡眠风
sbit mada=P2^0; //马达驱动 sbit jdq=P2^1; //继电器驱动 int PWM=40; //PWM寄存器 int dang=1; //档位寄存器 int i,j; //输出PWM是的变量 int moshi=0; //模式标志 int time; //睡眠和自然风开关间隙时间,定时寄存器 int time1; //定时工作1分钟休息10秒钟,定时寄存器 int daima=0; //数码管显示位选选择 sbit p1=P2^4; //数码管位选 sbit p2=P2^5; sbit p3=P2^6; sbit p4=P2^7; char data_7seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0x86}; //数码管段码
void xianshi() //显示子程序 { switch(daima) {case 0: p1=0;p2=0;p3=0;p4=0; //位选关 P0=data_7seg[moshi]; //发送第一位数码管显示代码 p1=1;p2=0;p3=0;p4=0; //第一个位选开 daima=1; //显示延迟 break;
case 1: p1=0;p2=0;p3=0;p4=0; //位选关 P0=data_7seg[10]; //发送第二位数码管显示代码 p1=0;p2=1;p3=0;p4=0; //第二个位选开 daima=2; //显示延迟 break;
case 2: p1=0;p2=0;p3=0;p4=0; //位选关 P0=data_7seg[10]; //发送第三位数码管显示代码 p1=0;p2=0;p3=1;p4=0; //第三个位选开 if(moshi==0) daima=0; //显示延迟 else daima=3; break;
case 3: p1=0;p2=0;p3=0;p4=0; //位选关 P0=data_7seg[dang]; //发送第四位数码管显示代码 p1=0;p2=0;p3=0;p4=1; //第四个位选开 daima=0; //显示延迟 break; } }
void key() //按键扫描 { if(K1==0) //档位切换 { dang++; //循环 if(dang>4) dang=1;
switch(dang) //根据档位控制PWM占空比 { case 1: PWM=40; break; case 2: PWM=60; break; case 3: PWM=80; break; case 4: PWM=100; break; } } while(K1==0);
if(K2==0) //正常模式按键 { moshi=1; //正常模式 } while(K2==0);
if(K3==0) //自然风模式按键 { moshi=2; //自然风模式 } while(K3==0);
if(K4==0) //睡眠模式按键 { moshi=3; //睡眠模式 } while(K4==0); }
void main() //主程序 { mada=0; //初始化端口 i=100; jdq=0; TMOD=0X12; //定义中断和开启中断 TH0=256-100; TL0=256-100; ET0=1;TR0=1; EA=1; TH1 = 0x3C; TL1 = 0x0B0; ET1 = 1; TR1 = 1; while(1) //无限循环 { key(); //按键扫描 if(moshi==0) //模式=0,待机 {i=0;jdq=1;time1=0; } else if(moshi==1) //模式=1,正常 i=PWM; //正常输出 else if(moshi==2) //模式=2,自然风 { if(time<200) //开10秒,关5秒 i=PWM; else i=0; } else if(moshi==3) //模式=3,睡眠风 { if(time<100) //开5秒,关10秒 i=PWM; else i=0; }
} }
void Timer0Interrupt(void) interrupt 0 //定时器中断,输出PWM,占空比 { if(j>100) j=0; if(j<i) { mada=1; } else
{ mada=0; } xianshi(); } void Timer1Interrupt(void) interrupt 3 //定时器中断0,计时 { TH1 = 0x3C; TL1 = 0x0B0; if(moshi>1) time++; else time=0;
time1++; if(time1>=1400) time1=0;
if(time1>=1200) jdq=1; else if(moshi>0) jdq=0; if(time>=300) time=0; }
|