有没有大神帮忙看看,为什么风扇转速不变啊
设计内容:1、3个独立按键分别控制“自然风”、“睡眠风”、“常风”,(三者的区别是直流电机的停歇时间不同),并在数显管上显示出区别
2、每种类型风可以根据按下独立按键次数分为4个档的风力调节。
3、设计风扇的过热保护,用继电器实现。即当风扇运行一段时间后,暂停10秒。
4、其他创新内容(如报警提示)
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit EA1=P1^4;
sbit motor_r=P1^5;
sbit motor_l=P1^6;
sbit LM298_State=P3^3;
sbit LED_D1=P3^2;
sbit LED_D2=P3^1;
sbit LED_D3=P3^0;
sbit key0=P3^4;
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
sbit BEEP=P1^3;
bit Flag_Time=0,Flag_Motor_Start=1;
uchar Sec=0,Min=0;
uint Sec_Timer0=0;
uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9
//PWMμç»úμ÷Ëù3õê¼Öμ
#define PWM 10
uchar speed_set=1;
uchar Fan_Mode=0;
//uchar Time_Set=1;
bit flag_1s=0;
void delay_ms(uint ms)
{
uint a,b;
for(a=ms;a>0;a--)
for(b=125;b>0;b--);
}
void time_init()
{
TMOD=0x01;
EA=1;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
TR0=1;
}
void Clear()
{
P2 = 0Xff;
P0 = 0X00;
}
void dispaly(uchar Min)
{
Clear();
P2=0xfd;
P0=table[Min%10]
delay_ms(1);
Clear();
P2=0xfe;
P0=table[Min/10];
delay_ms(1);
}
uchar speed_Num=0;
void key_scan()
{
if(key0==0)
{
delay_ms(10);
if(key0==0)
{
speed_Num++;
if(speed_Num>3)
{
speed_Num=0;
}
switch(speed_Num)
{
case 0:speed_set=2;break;
case 1:speed_set=5;break;
case 2:speed_set=7;break;
case 3:speed_set=10;break;
default:break;
}
}
while(!key0)
{
dispaly(speed_Num+1);
}
}
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
Fan_Mode=0;
switch(Fan_Mode)
{
case 0:LED_D1=0;LED_D2=1;LED_D3=1;break;
case 1:LED_D1=1;LED_D2=0;LED_D3=1;break;
case 2:LED_D1=1;LED_D2=1;LED_D3=0;break;
default:break;
}
Sec_Timer0=0;
}
while(!key1)
{
dispaly(speed_Num+1);
}
}
if(key2==0) //ê±¼ä¼ó
{
delay_ms(10);
if(key2==0)
{
Fan_Mode=1;
switch(Fan_Mode)
{
case 0:LED_D1=0;LED_D2=1;LED_D3=1;break;
case 1:LED_D1=1;LED_D2=0;LED_D3=1;break;
case 2:LED_D1=1;LED_D2=1;LED_D3=0;break;
default:break;
}
Sec_Timer0=0;
}
while(!key2)
{
dispaly(speed_Num+1);
}
}
if(key3==0) // ê±¼ä¼õ
{
delay_ms(10);
if(key3==0)
{
Fan_Mode=2;
switch(Fan_Mode)
{
case 0:LED_D1=0;LED_D2=1;LED_D3=1;break;
case 1:LED_D1=1;LED_D2=0;LED_D3=1;break;
case 2:LED_D1=1;LED_D2=1;LED_D3=0;break;
default:break;
}
Sec_Timer0=0;
}
while(!key3)
{
dispaly(speed_Num+1);
}
}
}
void main()
{
motor_r=0;
motor_l=1;
EA1=0;
time_init();
LED_D1=0;LED_D2=1;LED_D3=1;
while(1)
{
key_scan();
dispaly(speed_Num+1);
}
}void time0()interrupt 1
{
static uchar count1=0;
static uint count2=0;
TH0=(65536-1000)/256; //¶¨ê±1ms
TL0=(65536-1000)%256;
if(Flag_Motor_Start)
{
count1++;
if(count1>PWM) //ÖüÆúêÇ10ms
count1=0;
if(count1<=speed_set) //μç»ú1 PWMμ÷Ëù
EA1=1;
else
EA1=0;
}
else
{
EA1=0;
}
count2++;
if(count2>=1000)
{
count2=0;
Sec++;
if(Sec==60)
{
Flag_Motor_Start=0;
LM298_State=0;
EA1=0;
motor_r=0;
motor_l=0;
BEEP=0;
// TR0=0;
}
if(Sec==70)
{
Sec=0;
Flag_Motor_Start=1;
LM298_State=1;
motor_r=0;
motor_l=1;
EA1=1;
BEEP=1;
}
Sec_Timer0++;
if(Fan_Mode==0)
{
if(Sec_Timer0>100)
Sec_Timer0=0;
Flag_Motor_Start=1;
}
else if(Fan_Mode==1)
{
if(Sec_Timer0<=4)
Flag_Motor_Start=1;
else
Flag_Motor_Start=0;
if(Sec_Timer0>8)
Sec_Timer0=0;
}
else if(Fan_Mode==2)
{
if(Sec_Timer0<=8)
Flag_Motor_Start=1;
else
Flag_Motor_Start=0;
if(Sec_Timer0>16)
Sec_Timer0=0;
}
else
{}
}
}
|