家里的遙控電風扇主板主控燒壞了,閑著沒事用多年沒有玩的51單片機進行編制程序,將原來的主板上的單片機拆除,各個功能按鍵和指示燈不動,把51單片機對應各個功能管腳用飛線接上,再用502膠水給固定住,防止松動。下來用KELL軟件編程。經測試一切正常帶自然風、睡眠風、定時功能;取消原來的遙控功能(因個人愛好,很少用遙控)。待源碼需要的朋友隨意下。單片機為89C51或52都行,注意時鐘:11.0592,不同時鐘定時時間差異大。
單片機源程序如下:
- /************************************************************************
- 家里的遙控電風扇主板燒壞了,閑著沒事用閑置的STC89C51單片機做了一個控制板
- 不帶遙控,利用原來的按鍵進行設計一個控制板,經測試一切運行正常。
- **********************************************************************/
- #include <reg52.h>
- #define uint unsigned int //宏定義
- #define uchar unsigned char
- uint second, second1, tcount, tcount1,miao;
- uchar anjian,jishu,jishu1,dingshi;
- uchar m,n,a,b,c;
- /*===================關機特殊功能定義======================*/
- sfr ISP_CONTR=0xe7; //特殊功能寄存器定義
- /*=============================按鍵功能定義=================*/
- sbit s1=P3^7; //開機、關機與 風類選擇
- sbit s2=P3^3; // 關機
- sbit s3=P3^5; //搖頭
- sbit s4=P3^6; //定時開關
- /*==========================輸出功能IO口定義==================*/
- sbit sui_mian_feng =P0^0; //睡眠風指示
- sbit zi_ran_feng= P0^1; //自然風指示
- sbit gao_su=P2^5; //高速指示
- sbit zhong_su=P2^6; //中速指示
- sbit di_su=P2^7; //低速指示
- sbit beep_out=P2^4; //蜂鳴輸出
- sbit yao_tou_out=P2^3; //搖頭 輸出
- sbit gao_su_out=P2^0; //高速 輸出
- sbit zhong_su_out=P2^1;//中速輸出
- sbit di_su_out=P2^2; //低速輸出
- /*============工作時間狀態指示LED燈的IO口定義===================*/
- sbit timer_30=P1^0; //定時30分鐘LED指示
- sbit timer_1h=P1^1; //定時1小時LED指示
- sbit timer_2h=P1^2; // 定時2小時LED指示
- sbit timer_4h=P1^3; // 定時4小時LED指示
- /*=========================延時時間函數=======================*/
- void delay_1 (char sum) //按鍵消抖延時
- { char x,y;
- for (x=sum;x>0;x--)
- for (y=0;y<100;y++);
- }
- void delay_2 (char sum) //蜂鳴頻率延時時間(82us)
- { char x,y;
- for (x=sum;x>0;x--)
- for (y=0;y<20;y++);
- }
- void delay_3 (uint sum) //風速延時時間 25.3 毫秒
- { uint x,y;
- for (x=sum;x>0;x--)
- for (y=0;y<5000;y++);
- }
- void feng_min (char sum) //蜂鳴器聲音
- { char i;
- for (i=sum;i<100;i++)
- { beep_out=0;
- delay_2 (10); //10*20 時間
- beep_out=1;
- delay_2 (10);
- }
- }
- /*=================定時器0初始化=====================*/
- void timer1_int (void) //定時器中斷0 初始化
- { TMOD|=0x01; // 定時器0工作模式 1
- TH0=0x16; //放定時初值
- TL0=0xf6; //放定時初值
- TR0=0; //關閉定時器(暫時未開啟)
- ET0=0; //開啟中斷
- PT0=1; //中斷優先級1
- EA =1;
- }
- /*=================定時器1初始化=====================*/
- void timer2_int (void) //風類定時器中斷 1 初始化
- { TMOD|=0x20; //工作模式2
- TH1=0x06; // 設定初始值 50ms
- TL1=0x06; //設定初始值
- TR1=0; //開啟定時器
- ET1=0; //開啟外部中斷
- PT1=0; //中斷優先級0
- EA =1; //開啟總中斷開關
- }
- /*====================外部中斷1初始化=====================*/
- void guan_ji_int(void) //外部中斷 1
- {
- EA =1; //中斷總開關
- EX1=1; //中斷開關
- IT1=0; // 觸發方式0,低電平觸發
- PX1=1; //中斷優先級 最高
- }
- /*======================外部中斷1程序======================*/
- void guan_ji(void) interrupt 2 using 2 //關機的外部中斷 2
- {
- if (s2==0&&s3!=0&&anjian>=1) // 關機
- {
- delay_1(100);
- if (s2==0&&s3!=0&&anjian>=1)
- { while (s2==0) ; //按鍵松手檢測
- switch (1)
- { case (1): feng_min (1);ISP_CONTR=0x20;break;}//蜂鳴后、關機、整機復位
- }
- }
- if (s3==0&&anjian>=1 )
- { delay_1(100);
- if (s3==0&&anjian>=1)
- { while (s3==0) ;
- jishu++;
- switch (1)
- { case (1): feng_min (1); yao_tou_out=0; break;
- default: feng_min (1);yao_tou_out=1; jishu=0 ;break;
- }
- }
- }
- if (s4==0&&anjian>=1) //風扇定時工作時間程序
- { delay_1(100); // 100*100 時間
- if (s4==0)
- { dingshi++;
- while (s4==0);
- switch (dingshi)
- { case (1):
- feng_min (1); TR0=1;ET0=1;miao=1800;timer_30=0; break; //0.5 小時
- case (2):
- feng_min (1); TR0=1;ET0=1;miao=3600;timer_30=1;timer_1h=0; break; //1 小時
- case (3):
- feng_min (1); TR0=1;ET0=1;miao=5400;timer_30=0;timer_1h=0; break; //1.5 小時
- case (4):
- feng_min (1); TR0=1;ET0=1;miao=7200;timer_30=1;timer_1h=1;timer_2h=0;break; //2 小時
- case (5):
- feng_min (1); TR0=1;ET0=1;miao=9000;timer_30=0;timer_2h=0;break; //2.5 小時
- case (6):
- feng_min (1); TR0=1;ET0=1;miao=10800;timer_30=1;timer_2h=0; timer_1h=0;gao_su=1; break; //3小時
- case (7):
- feng_min (1); TR0=1;ET0=1;miao=14400;timer_2h=1;timer_1h=1; timer_4h=0;gao_su=1; break; //4 小時
- case (8):
- feng_min (1); TR0=1;ET0=1;miao=28800;timer_1h=0;timer_4h=0; gao_su=1; break; //5 小時
- case (9):
- feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=1; timer_2h=0;timer_4h=0; break; //6 小時
- case (10):
- feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=0;timer_2h=0;timer_4h=0; break; //7 小時
- case (11):
- feng_min (1);TR0=1;ET0=1;miao=28800;timer_30=0;timer_1h=0;timer_2h=0;timer_4h=0; break; //7.5小時
- default: feng_min (1);TR0=0;ET0=0;dingshi=0; miao=0; timer_2h=1; timer_1h=1; timer_4h=1;timer_30=1;break;
- }
- }
- }
- }
- /*===========================定時器中斷0(關機)程序==============================*/
- void timer1(void) interrupt 1 using 1 //定時器(0)控制
- { tcount1++;
- TH0=0X16;
- TL0=0Xf6; //50ms
- if(tcount1==20) //1秒時間
- { tcount1=0;
- second1++;
- timer_30=~timer_30; //定時閃亮指示
- if(second1>=miao) //設定的定時時間等于當前時間
- { second1=0;
- for (a;a<10;a++)
- { feng_min (1) ;
- beep_out=1;
- delay_3(20); //間隔1 秒 60*5000 時間
- }
- ISP_CONTR=0x20; // 整機復位關機(由軟件)
- }
- }
- }
- /*==============================定時器1中斷(風類選擇)工作程序====================================*/
- void timer2(void) interrupt 3 using 3 // 模擬風與自然風選擇控制
- {
- tcount++;
- TH1=0x06; // 初始數 50ms
- TL1=0x06; //0.25毫秒
- if(tcount==2386) //0.5 秒
- {
- tcount=0;
- second++;
- zi_ran_feng=~zi_ran_feng;
- if (second>=m&&n==1) // 進行設定的自然風程序 180秒 6 次
- { second=0;gao_su = 1; zhong_su = 1; di_su=1;gao_su_out = 1; zhong_su_out = 1; di_su_out=1;
- delay_3(60); // 5 *10000
- for (b;b<2;b++)
- {
- gao_su_out = 0;
- gao_su=0;
- delay_3(700); //工作17秒 1200*10000
- gao_su_out = 1;
- gao_su=1; //停機
- delay_2(100); // 100*20
- zhong_su_out = 0; // 關2 檔
- zhong_su=0;
- delay_3(400); // 工作 10秒
- zhong_su_out = 1;
- zhong_su =1; //停機
- delay_2(100); //
- di_su_out = 0;
- di_su=0; //工作 5秒
- delay_3(200);
- di_su_out = 1;
- di_su=1;
- delay_2(100);
- }
- b=0;
- }
- if (second>=n&&m==1) //進行設定的睡眠風程序360秒 4 次
- { second=0; gao_su = 1; zhong_su = 1; di_su=1;gao_su_out = 1; zhong_su_out = 1; di_su=1;
- delay_3(60);
- for (c;c<4;c++)
- {
- gao_su_out = 0;
- gao_su=0;
- delay_3(200);
- gao_su_out = 1;
- gao_su=1;
- delay_2(100);
- zhong_su_out = 0;
- zhong_su=0;
- delay_3(600); //工作 15秒
- zhong_su_out = 1;
- zhong_su =1; //停機
- delay_2(100);
- di_su_out = 0;
- di_su=0;
- delay_3(400); //工作 10秒
- di_su_out = 1;
- di_su=1;
- delay_3(400); //停機 10秒
- }
- c=0;
- }
- }
- }
- /*===================================風扇運行主程序==================================*/
- void main()
- { timer1_int (); //定時器0初始化
- timer2_int (); //定時器1初始化
- guan_ji_int(); //外部中斷1初始化
- delay_3 (1); //緩沖25.3毫秒
- while(1) //無條件永遠執行大循環
- {
-
- if(!s1) //開機和進行速度選擇 ;睡眠風和自然風選擇
- {
- delay_1(100); //按鍵消抖延時
- if (s1==0)
- {
- anjian++;
- while (s1==0) ; //松手檢測
- }
- if (anjian>5)
- anjian=1;
- switch (anjian)
- {
- case (1):
- feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 0;di_su_out=0; zhong_su = 1;zhong_su_out = 1;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng =1;break; //工作在低速
- case (2):
- feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 1;di_su_out=1; zhong_su = 0;zhong_su_out = 0;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng =1;break; //工作在中速
- case (3):
- feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 1;di_su_out=1; zhong_su = 1;zhong_su_out = 1;gao_su = 0;gao_su_out = 0;zi_ran_feng=1;sui_mian_feng =1;break; //工作在高速
- case (4):
- feng_min (1); TR1=1;ET1 =1;di_su_out=1; di_su=1;zhong_su = 0;zhong_su_out = 0;gao_su = 1;gao_su_out = 1;zi_ran_feng=0;sui_mian_feng =1; m=15;n=1; break; //開啟自然風模式
- case (5):
- feng_min (1); TR1=1;ET1 =1;di_su_out=0;di_su=0; zhong_su = 1;zhong_su_out = 1;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng=0; n=120;m=1; break; // 開啟在睡眠風模式
- }
- }
- if (s2==0&&anjian>=1) // 關機
- {
- delay_1(100); //按鍵消抖
- if (s2==0)
- { while (s2==0) ; //松手檢測
- /* jishu1++; */
- switch (1)
- {
- case (1): feng_min (1); dingshi=0;tcount=0;second=0;tcount1=0;second1=0;anjian=0;TR0=0;ET0 =0; TR1=0;ET1 =0;timer_2h=1;timer_1h=1; timer_4h=1;timer_30=1;zi_ran_feng=1;sui_mian_feng=1;gao_su=1;gao_su_out=1;zhong_su=1;zhong_su_out=1;di_su=1;di_su_out=1; break; //進行關機
- }
- }
- }
- if (s3==0&&anjian!=0) //風扇搖頭開和關
- {
- delay_1(100); // 按鍵消抖
- if (s3==0)
- {
- jishu++;
- while (s3==0) ; //松手檢測
- switch (jishu)
- { case (1): feng_min (1); yao_tou_out=0; break;
- default: feng_min (1);yao_tou_out=1; jishu=0; break;
- }
- }
- }
- if (s4==0&&anjian>=1) //風扇定時工作時間選擇程序
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
多功能電風扇修復程序.rar
(1.86 KB, 下載次數: 56)
2017-9-23 17:00 上傳
點擊文件名下載附件
HEX輸出文件 下載積分: 黑幣 -5
電風扇程序序.rar
(3.18 KB, 下載次數: 69)
2017-9-23 16:59 上傳
點擊文件名下載附件
KELL的源碼 下載積分: 黑幣 -5
|