家里的遥控电风扇主板主控烧坏了,闲着没事用多年没有玩的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, 下载次数: 55)
|