要求設計一個智能風扇的控制電路,可以控制風扇的轉速、工作時間等 用5V電源供電,設計四個按鈕K1為全速,K2為停止,K3為半速,K4為自然風(剛開始每4S的時間內有1S在轉動,并過8S后每4S的時間內有2S在轉動,再過8S后每4S的時間內有3S在轉動,再過8S后全速轉動,再過8S后4S中又只有1S在轉動,如此循環復始)。并分別用四個指導燈指示這四種狀態,要用LED指示風扇的轉速(每秒)。//現在出現的問題是,K1到K3的功能可以隨意切換,到了K4就必須等24秒才可以和其他功能按鍵切換。。。。。我想任意切換功能的。。。 - #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define led_wx P2
- #define led_dx P0
- /*-------------定義數碼管的字型碼與字位碼----------------------*/
- uchar code no[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數字0~9
- uchar code wex[]={0x01,0x02,0x04,0x08}; //字位碼
- /*-------------定義變量------------------*/
- uchar ledplay[4];
- uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;
- /*-------------定義端口-----------------*/
- sbit K1=P1^0; //占空比為100(全速)
- sbit K2=P1^1; //占空比為0(停止)
- sbit K3=P1^2; //占空比為50(半速)
- sbit K4=P1^3;
- sbit D8=P1^4;//指示燈
- sbit D7=P1^5;
- sbit D6=P1^6;
- sbit D5=P1^7; //自然風
- sbit out=P3^4;
- sbit out1=P3^7;
- /*----------------延時1ms函數-------------------*/
- void delay(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- /*------------自然風模式----------------*/
- void naturemode()
- {
- m=100;
- delay(1000);
- m=0;
- delay(3000);
- m=100;
- delay(1000);
- m=0;
- delay(3000); //前8秒
- m=100;
- delay(2000);
- m=0;
- delay(2000);
- m=100;
- delay(2000);
- m=0;
- delay(2000); //又8秒
- m=100;
- delay(3000);
- m=0;
- delay(1000);
- m=100;
- delay(3000);
- m=0;
- delay(1000); //又8秒
- m=100;
- delay(8000);
- }
- /*----------初始化函數-------------------*/
- void init()
- {
- TMOD=0x01; //定時器方式1
- TH0=0xd8;
- TL0=0xf0; //定時器0裝入初值(10ms)
- EA=1; //開總中斷
- ET0=1; //定時器0中斷允許
- TR0=1; //
- EX1=1; //外部中斷1允許
- IT1=1; //外部中斷1下降沿觸發
- TH1=0xff;
- TL1=0x9c; //定時100us
- ET1=1; //定時器1開中斷
- TR1=1; //定時器1啟動
- }
- /*----------鍵盤掃描函數----------------*/
- void keyscan()
- {
- if(K1==0)
- {
- delay(5); //消除抖動
- if(K1==0)
- { D8=0;
- D7=1;
- D6=1;
- D5=1;
- m=100;
-
- }
- }
- if(K2==0)
- {
- delay(5);
- if(K2==0)
- { D8=1;
- D7=0;
- D6=1;
- D5=1;
- m=0;
- }
- }
- if(K3==0)
- {
- delay(5);
- if(K3==0)
- { D8=1;
- D7=1;
- D6=0;
- D5=1;
- m=50;
-
- }
- }
- if(K4==0)
- {
- delay(5);
- if(K4==0)
- { D8=1;
- D7=1;
- D6=1;
- D5=0;
- while(K1&&K2&&K3==1)
- { naturemode();} //自然風模式
-
-
-
- }
- }
- }
- /*-----------數碼管顯示函數--------------*/
- void putin() //向led緩沖區填充數據
- {zhuansu=zhuansu*20;
- ledplay[0]=no[zhuansu/1000]; //千位
- ledplay[1]=no[zhuansu/100%10];//百位
- ledplay[2]=no[zhuansu/10%10];//十位
- ledplay[3]=no[zhuansu%10];//個位
- }
- void display() //將緩沖區的數據顯示到數碼管上
- {
- uchar i;
- putin();
- for(i=0;i<4;i++)
- {
- led_wx=wex[i];
- led_dx=ledplay[i];
- delay(2);
- }
- }
- void main()
- {
- flag_1=0;
- m=0; //占空比為100
- zhuansu=0; //轉速初值0
- flag=0;
- zheng=1; //初始化電機正轉動
- fan=0;
- init(); //初始化
- while(1)
- {
- keyscan(); //鍵盤掃描程序
-
-
- }
- }
- void int1()interrupt 2 //外部中斷1脈沖技術記錄電機的轉速 電機轉一圈zhuansu加一
- {
- zhuansu++;
- }
- void int2()interrupt 1 //定時器0顯示轉速
- {
-
- TH0=0xd8;
- TL0=0xf0;//定時10ms
- flag++;
-
- if(flag==5) //計時到達0.05s
- {
- display(); //顯示轉速
- zhuansu=0; //轉速置0
- flag=0;
- }
- }
- void int3()interrupt 3 //定時器1產生PWM
- {
-
- TH1=0xff;
- TL1=0x9c;//定時100us
- flag_1++;
- if(flag_1>99)
- flag_1=1;
- if(flag_1<m) //小于占空比m輸出PWM=0輸出電壓為1
- {out=0;
- out1=1;
- }
- else //大于占空比輸出電壓為0
- {
- out=1;
- out1=1;
- }
- }
復制代碼 |