找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21652|回复: 66
打印 上一主题 下一主题
收起左侧

电风扇增加红外遥控、定时及睡眠功能 附单片机程序与电路

  [复制链接]
跳转到指定楼层
楼主
小伙伴们家里是不是还是手动按键式电扇?是的话就跟我改起来,改过之后手动按键不影响,还是可以用哟,增加红外遥控功能,定时增加到8小时(你的是不是还只有1小时定时呀,呵呵!),还有哟!再加个睡眠功能:如果打开睡眠功能,定时时间到之后自动跳到1档,不然下半夜冻坏罗,不打开睡眠功能,定时时间到之后自动关闭。是不是很贴心啦!本来还想加个仿自然风,就是扇一会停一会再扇一会…………,网友们都说那样太伤电机,于是取消了。废话少说,上图:
二档走起,中间小灯为电源指示灯,左边有三个小灯,为风量档位指示灯,一档亮一个,二档亮两个,三档亮三个。手动按键的话也一样,会亮指示灯,手动过后再用遥控也是可以的。不按机械按键直接遥控也是可以的,遥控后再按钮也是可以的,如果没按机械按键直接遥控打开的,此时想要按机械按键关闭要先按三档中任一键再按0键关闭。



定时设置状态,数码管亮起,右边一个数码管为小写h,左边一个数码管表示1到8小时设置。



已经确定为6小时,后面的h变为大写的H,100秒之前为剩余小时显示,之后为剩余分钟的倒计时


看到定时数码管下面的小灯了吧,那是睡眠指示小灯,表示打开了睡眠模式。



三个并排的键依次为1档、2档、3档,上翻键下翻键为档位的加减,档位加到三档时上翻不再增加,档位减到1档时,再减就关闭了。
OK为关闭。
V-为定时设置键,定时设置状态时,上翻下翻键为定时时间的加减,OK键为确认。
右翻键为睡眠模式开关切换键。V+是管我们家电灯的啦~~

看看我的万能板


电源部分直接用的旧手机充电器,

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /******************************************************************
  2. /* STC89C52单片机                                                 *
  3. /* 11.0592M晶振                                                         *
  4. /*程序用了外部中断0接收红外信号,IO口为P32                        *
  5. /*遥控OK键为关闭,在定时设置状态时为确认                          *
  6. /*遥控上、下翻键为档位加、减,在设置定时状态时为定时时间加、减,  *
  7. /*遥控V-键为进入设置定时模式                                      *
  8. /*右翻键为睡眠模式的开启与关闭,睡眠模式指定时时间到后自动切为1档 *
  9. /*遥控返回键为1档,遥控主页键为2档,遥控菜单键为3档,             *
  10. /*定时设置状态时,第二个数码管为小写H,设置完成后为大写H.          *
  11. /*最多定时8小时,99分钟内显示分钟倒计时                            *
  12. /******************************************************************/

  13. #include <reg52.h>
  14. #include <intrins.h>

  15. #define uchar unsigned char
  16. #define uint  unsigned int
  17. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  18. #define const_key_time1  20    //按键去抖延时的时间
  19. #define const_1s  440   //大概1秒钟所需要的中断数

  20. void delay_long(unsigned int uiDelaylong);
  21. void delay(uchar x);  //x*0.14MS
  22. void delay1(int ms);
  23. void T0_time();  //定时器0中断函数
  24. void key_service(); //按键服务的应用程序
  25. void key_scan(); //按键扫描函数,放在定时中断里
  26. void key_service1(); //关闭的应用程序
  27. void initial_myself(); //初始化单片机
  28. void initial_peripheral();//初始化外围
  29. void LCD_XSservice(); //数码管显示程序
  30. void display_drive(); //数码管字模驱动函数

  31. sfr ISP_CONTR=0xe7;       //软复位地址
  32. sbit IRIN = P3^2;         //红外接收器数据线,外部中断0
  33. sbit K1 = P2^0;           //按键1   
  34. sbit K2 = P2^1;           //按键2
  35. sbit K3 = P2^2;           //按键3
  36.                           //风量1档最小,3档最大
  37. sbit SC1 = P2^3;          //1档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  38. sbit SC2 = P2^4;          //2档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  39. sbit SC3 = P2^5;          //3档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  40. sbit LED1 = P1^0;         //档位指示小灯1
  41. sbit LED2 = P1^1;         //档位指示小灯2
  42. sbit LED3 = P1^2;         //档位指示小灯3
  43. sbit LED4 = P1^3;         //睡眠模式指示小灯
  44. sbit LCD1 = P2^6;         //接PNP三极管控制定时显示数码管1的阳极(显示数码管为共阳管)
  45. sbit LCD2 = P2^7;         //接PNP三极管控制定时显示数码管2的阳极(显示数码管为共阳管)
  46.                           //定时显示数码管的八个阴极接P0



  47. uchar IRCOM[7];                 //定义红外接收数组
  48. uchar code Tab0[]=             //定义数码管数组,没有小数点
  49.       {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89
  50.              };//0,1,2,3,4,5,6,7,8,9,h
  51. uint code Dingshi0[]=             //定义定时数组
  52.     {0,60,120,180,240,300,360,420,480
  53.                 };
  54. unsigned char ly_dis1;//定义显示缓冲区
  55. unsigned char ly_dis2;//定义显示缓冲区                                
  56. unsigned char ucKeySec=0;   //被触发的按键编号
  57. unsigned int uiKeyTimeCnt1=0; //按键1去抖延时计数器
  58. unsigned char ucKeyLock1=0; //按键1触发后自锁的变量标志
  59. unsigned int uiKeyTimeCnt2=0; //按键2去抖延时计数器
  60. unsigned char ucKeyLock2=0; //按键2触发后自锁的变量标志
  61. unsigned int uiKeyTimeCnt3=0; //按键3去抖延时计数器
  62. unsigned char ucKeyLock3=0; //按键3触发后自锁的变量标志
  63. unsigned char anjiank=0;   //有按键被触发
  64. unsigned char hw_anjiank=0;   //红外按键被触发
  65. unsigned char LCDSec=0;   //定时设置状态
  66. unsigned char LCDszxs=0;   //数码管定时的变量
  67. unsigned int DSSJ=0; //定时的时间
  68. unsigned char DSBZ=0;   //定时标志
  69. unsigned char iii=0;  //动态数码管定时显示变量
  70. unsigned char posit=0;//动态数码管扫描步骤
  71. unsigned int uiTimeCnt=0;  //倒计时的时间计数器
  72. unsigned int js1m=0;//计时秒
  73. unsigned char Guanbi=0;   //关闭标志
  74. unsigned char SMMS=0;   //睡眠模式标志
  75. unsigned char SMMSJK=0;   //睡眠模式监控
  76. /*******************************************************************/
  77. main()
  78. {   
  79.           initial_myself(); //初始化
  80.           delay_long(100);
  81.     initial_peripheral();//初始化外围
  82.   
  83.   while(1)        
  84.   {
  85.                   key_service1(); //关闭的应用程序
  86.       key_service();//按键服务的应用程序
  87.                   LCD_XSservice(); //数码管显示程序
  88.          }
  89.   }

  90. //end main
  91. /**********************************************************/
  92. void LCD_XSservice() //数码管显示程序
  93. {
  94.         if (DSBZ==1)
  95.         {
  96.                 if (DSSJ>60)
  97.                 {
  98.                         if (DSSJ>99) {iii=2;}
  99.                         if (DSSJ>120) {iii=3;}
  100.                         if (DSSJ>180) {iii=4;}
  101.                         if (DSSJ>240) {iii=5;}
  102.                         if (DSSJ>300) {iii=6;}
  103.                         if (DSSJ>360) {iii=7;}
  104.                         if (DSSJ>420) {iii=8;}
  105.                         ly_dis1=iii;//P0口驱动数码管2到8的定时显示
  106.                         ly_dis2=10;        //显示个位值
  107.                 }
  108.         
  109.          if (DSSJ<=99)
  110.                 {
  111.                         if (DSSJ>0)
  112.                         {
  113.                                 ly_dis1=DSSJ/10;        //显示十位值
  114.                                 ly_dis2=DSSJ%10;        //显示个位值
  115.                         }
  116.           }
  117.         if (DSSJ==0)
  118.         {
  119.                
  120.                 if (SMMS==1)
  121.                 {
  122.                  LCD1=1;
  123.                  LCD2=1;
  124.                  DSBZ=0;
  125.                  LED4=1;
  126.                  SMMSJK=0;
  127.                  hw_anjiank=1;     //表明由红外按键触发
  128.                  ucKeySec=1;//触发1档按键
  129.                 }
  130.                 if (SMMS==0)
  131.                 {
  132.                         if (DSBZ==1)
  133.                         {
  134.                     ISP_CONTR=0x20;  //关闭所有,所有变量清零,软复位
  135.                         }
  136.                 }
  137.                
  138.         }
  139. }
  140. }
  141. /**********************************************************/
  142. void key_scan()//按键扫描函数,放在定时中断里
  143. {
  144.   if (LCDSec!=1)
  145. {
  146.         if(K1==1)//IO口是高电平,说明按键1一直没有按下,这时要及时清零一些标志位
  147.          {
  148.            ucKeyLock1=0; //按键自锁标志清零
  149.                  uiKeyTimeCnt1=0;//按键去抖延时计数器清零
  150.          }
  151.    else if(ucKeyLock1==0)//有按键按下,且是第一次按下
  152.          {
  153.           uiKeyTimeCnt1++; //累计定时中断次数
  154.                  if(uiKeyTimeCnt1>const_key_time1)
  155.                  {
  156.                          uiKeyTimeCnt1=0;
  157.                          ucKeyLock1=1;  //自锁按键置位,避免一直触发
  158.                          hw_anjiank=0;  //表明解除由红外按键触发
  159.                          anjiank=1;     //表明由按键触发
  160.                          ucKeySec=1;    //触发1档按键
  161.                  }
  162.          }
  163.          
  164.          if(K2==1)//IO口是高电平,说明按键2一直没有按下,这时要及时清零一些标志位
  165.          {
  166.            ucKeyLock2=0; //按键自锁标志清零
  167.                  uiKeyTimeCnt2=0;//按键去抖延时计数器清零
  168.          }
  169.    else if(ucKeyLock2==0)//有按键按下,且是第一次按下
  170.          {
  171.           uiKeyTimeCnt2++; //累计定时中断次数
  172.                  if(uiKeyTimeCnt2>const_key_time1)
  173.                  {
  174.                          uiKeyTimeCnt2=0;
  175.                          ucKeyLock2=1;  //自锁按键置位,避免一直触发
  176.                          hw_anjiank=0;  //表明解除由红外按键触发
  177.                          anjiank=1;     //表明由按键触发
  178.                          ucKeySec=2;    //触发2档按键
  179.                  }
  180.          }
  181.                
  182.    if(K3==1)//IO口是高电平,说明按键3一直没有按下,这时要及时清零一些标志位
  183.          {
  184.            ucKeyLock3=0; //按键自锁标志清零
  185.                  uiKeyTimeCnt3=0;//按键去抖延时计数器清零
  186.          }
  187.    else if(ucKeyLock3==0)//有按键按下,且是第一次按下
  188.          {
  189.           uiKeyTimeCnt3++; //累计定时中断次数
  190.                  if(uiKeyTimeCnt3>const_key_time1)
  191.                  {
  192.                          uiKeyTimeCnt3=0;
  193.                          ucKeyLock3=1;  //自锁按键置位,避免一直触发
  194.                          hw_anjiank=0;  //表明解除由红外按键触发
  195.                          anjiank=1;     //表明由按键触发
  196.                          ucKeySec=3;    //触发3档按键
  197.                  }
  198.          }         
  199.   }
  200. }



  201. /**********************************************************/
  202. void key_service1() //关闭的应用程序
  203. {
  204.         if(anjiank==1)  //判断按键是否有按下,如果按键触发,但三个按键都为高电平,那么表示按了按键关按键
  205.                  {
  206.                          if(K1&K2&K3==1)
  207.                          {
  208.                                  ISP_CONTR=0x20;  //关闭所有,所有变量清零,软复位
  209.                          }
  210.                  }
  211.                  
  212.          if(hw_anjiank==1)//判断红外关按键是否按下
  213.                  {
  214.                          if(Guanbi==1)   //关闭标志
  215.                          {     
  216.                                   //关闭所有,所有变量清零,软位
  217.                                 initial_myself(); //初始化
  218.                                 delay_long(100);
  219.                                 initial_peripheral();//初始化外围
  220.                                 Guanbi=0;   //关闭标志清零
  221.                                  
  222.                          }
  223.                  }
  224.          
  225.                  
  226. }
  227. /**********************************************************/
  228. void key_service() //按键服务的应用程序
  229. {
  230.   switch(ucKeySec) //按键的切换
  231.         {  
  232.                
  233.         case 1:       //按键1--1档
  234.             LED1 = 1;
  235.       LED2 = 1;
  236.       LED3 = 1;
  237.       LED1 = 0;        
  238.       SC2 = 1;
  239.             SC3 = 1;
  240.             delay(300);        
  241.             if (SC2&SC3)
  242.                         {
  243.       SC1 = 0;
  244.                                 }
  245.                         ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  246.        break;
  247.         case 2:       //按键2--2档
  248.             LED1 = 1;
  249.       LED2 = 1;
  250.       LED3 = 1;        
  251.             LED1 = 0;
  252.       LED2 = 0;
  253.       SC1 = 1;
  254.             SC3 = 1;
  255.       delay(300);        
  256.       if (SC1&SC3)
  257.                         {
  258.       SC2 = 0;
  259.                                 }
  260.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  261.        break;
  262.         case 3:       //按键3--3档
  263.             LED1 = 1;
  264.       LED2 = 1;
  265.       LED3 = 1;        
  266.             LED1 = 0;
  267.       LED2 = 0;
  268.             LED3 = 0;
  269.       SC1 = 1;
  270.             SC2 = 1;
  271.       delay(300);        
  272.       if (SC1&SC2)
  273.                         {
  274.       SC3 = 0;
  275.                                 }
  276.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  277.        break;
  278.   case 4:       //OK按键短按
  279.             
  280.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  281.        break;
  282.         
  283.         }
  284. }

  285. /**********************************************************/
  286. void IR_IN() interrupt 0 //using 0    接收红外信号
  287. {
  288.   unsigned char j,k,N=0;
  289.          EX0 = 0;   
  290.          delay(15);
  291.          if (IRIN==1)
  292.      { EX0 =1;
  293.            return;
  294.           }
  295.                            //确认IR信号出现
  296.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  297.     {delay(1);}

  298. for (j=0;j<4;j++)         //收集四组数据
  299. {
  300.   for (k=0;k<8;k++)        //每组数据有8位
  301.   {
  302.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  303.      {delay(1);}
  304.     while (!IRIN)          //等 IR 变为高电平
  305.      {delay(1);}
  306.      while (IRIN)           //计算IR高电平时长
  307.       {
  308.     delay(1);
  309.     N++;           
  310.     if (N>=30)
  311.          { EX0=1;
  312.          return;}                  //0.14ms计数过长自动离开。
  313.       }                        //高电平计数完毕               
  314.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  315.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  316.      N=0;
  317.                                 
  318.   }//end for k
  319. }//end for j


  320.    
  321.    if (IRCOM[2]!=~IRCOM[3])
  322.    { EX0=1;
  323.                  return; }
  324.                  
  325. if (LCDSec!=1)
  326. {
  327.         if (IRCOM[2]==0xC5)//返回键  这一步就是判断,如果对应按键,则执行下面动作!
  328.                         {
  329.                          anjiank=0;  //表明解除由按键触发
  330.                          hw_anjiank=1;     //表明由红外按键触发
  331.                          ucKeySec=1;//触发1档按键
  332.                         
  333.                         }
  334.         if (IRCOM[2]==0x88)// 主页键  这一步就是判断,如果对应按键,则执行下面动作!
  335.                         {
  336.                          anjiank=0;  //表明解除由按键触发
  337.                          hw_anjiank=1;     //表明由红外按键触发
  338.                          ucKeySec=2;//触发2档按键
  339.                         
  340.                         }         
  341.         if (IRCOM[2]==0x82)//菜单键   这一步就是判断,如果对应按键,则执行下面动作!
  342.                         {
  343.                          anjiank=0;  //表明解除由按键触发
  344.                          hw_anjiank=1;     //表明由红外按键触发
  345.                          ucKeySec=3;//触发3档按键
  346.                         
  347.                         }
  348.         }                        

  349. if (IRCOM[2]==0xCA)//上翻键,这一步就是判断,如果对应按键,则执行下面动作!
  350.                 {
  351.                  if (LCDSec==1)//如果在时间设置状态,就是设置时间的加
  352.                  {
  353.                          LCDszxs++;
  354.                          if (LCDszxs>8)
  355.                          {
  356.                          LCDszxs=0;
  357.                          }
  358.                         }
  359.            else    //除了时间设置状态,为风量档位加
  360.                  {
  361.                   if (SC1&SC2&SC3)
  362.                          {
  363.                                  ucKeySec=1;
  364.                                 }
  365.                  if (SC1==0)
  366.                          {
  367.                                  ucKeySec=2;
  368.                          }
  369.                         if (SC2==0)
  370.                          {
  371.                                  ucKeySec=3;
  372.                          }
  373.                   anjiank=0;  //表明解除由按键触发
  374.                   hw_anjiank=1;     //表明由红外按键触发
  375.                   }
  376.                 }                        
  377. if (IRCOM[2]==0xD2)//下翻键,这一步就是判断,如果对应按键,则执行下面动作!
  378.                 {
  379.                  if (LCDSec==1)//如果在时间设置状态,就是设置时间的减
  380.                  {
  381.                          if (LCDszxs>0)
  382.                          {
  383.                          LCDszxs--;
  384.                          }
  385.                          if (LCDszxs==0)
  386.                          {
  387.                          LCDszxs=8;
  388.                          }
  389.                   }
  390.           else   //除了时间设置状态,为风量档位减
  391.                  {
  392.                   if (SC1==0)
  393.                          {
  394.                                 Guanbi=1;   //关闭标志打开
  395.        }
  396.                         if (SC2==0)
  397.                          {
  398.                                  ucKeySec=1;
  399.                          }
  400.                          if (SC3==0)
  401.                          {
  402.                                  ucKeySec=2;
  403.                          }
  404.                  anjiank=0;  //表明解除由按键触发
  405.                  hw_anjiank=1;     //表明由红外按键触发
  406.                  }
  407.                 }
  408.                
  409. if (IRCOM[2]==0x81)// V-键  这一步就是判断,如果对应按键,则执行下面动作!定时设置
  410.    {
  411.     if ((SC1&SC2&SC3)==0)
  412.                  {
  413.                  LCDSec=1;  //定时设置状态,数码管闪动
  414.                  LCDszxs=0;   //数码管定时的变量
  415.                  LCD1=0;
  416.                  LCD2=0;
  417.                 }
  418.          }                 
  419.                
  420.         if (IRCOM[2]==0xce)//OK键  这一步就是判断,如果对应按键,则执行下面动作!确认并退出定时设置
  421.                 {
  422.                  if (LCDSec==1)
  423.                  {
  424.                          if (LCDszxs>0)
  425.                          {
  426.                                  DSSJ=Dingshi0[LCDszxs];
  427.                                  DSBZ=1;
  428.                                  LCDSec=0;
  429.                                  SMMSJK=0;
  430.                          }
  431.                         else
  432.       {
  433.                                 LCD1=0;
  434.                     LCD2=0;
  435.                                 LCDSec=0;
  436.                         }                                
  437.                  }
  438.                  else
  439.                 {
  440.       initial_myself(); //初始化
  441.                         delay_long(100);
  442.                         initial_peripheral();//初始化外围
  443.                         Guanbi=0;   //关闭标志清零
  444.                 }               
  445.                 }        
  446.   
  447. if (IRCOM[2]==0xC1)//右翻键,这一步就是判断,如果对应按键,则执行下面动作!
  448. {
  449.         if ((SC1&SC2&SC3)==0)
  450.         {
  451.         if (LCDSec==0)
  452.         {
  453.         LED4=!LED4;                 //LED4取反
  454.         
  455.                 if (LED4==0)
  456.                 {
  457.                         SMMS=1;
  458.                          if (DSBZ==0)
  459.            {
  460.                         if(SMMSJK==0)
  461.                                         {
  462.                                         LCD1=0;
  463.                       LCD2=0;
  464.                                         LCDszxs=3;
  465.                                         DSSJ=Dingshi0[LCDszxs];
  466.                                         DSBZ=1;
  467.                                         SMMSJK=1;
  468.                                         }
  469.                    }
  470.                  }
  471.                 if (LED4==1)
  472.                 {
  473.                         SMMS=0;
  474.                
  475.                 if (DSBZ==1)
  476.                 {
  477.                         if(SMMSJK==1)
  478.                          {
  479.                                 LCD1=1;
  480.                     LCD2=1;
  481.                                 DSBZ=0;
  482.                                 LCDszxs=0;
  483.                                 DSSJ=Dingshi0[LCDszxs];
  484.                                 SMMSJK=0;
  485.                                 }
  486.                         }
  487.                 }
  488.         }
  489. }
  490. }
  491.         
  492.                  
  493.      EX0 = 1;
  494. }
  495. /**********************************************************/
  496. void display_drive()  //数码管字模驱动函数
  497. {
  498.         if (DSBZ|LCDSec)
  499. {
  500.         switch(posit)
  501.                         {
  502.                                 case 1:
  503.                                         LCD1=0;
  504.                                         LCD2=1;
  505.                                  if (LCDSec==1)
  506.                                  {
  507.                                         P0=Tab0[LCDszxs];//P0口驱动数码管0到8的定时显示
  508.                                  }
  509.                                  else
  510.                                  {
  511.                                         P0=Tab0[ly_dis1];//P0口驱动数码管1到8的定时显示
  512.                                  }
  513.                                         break;        
  514.                                 case 2:
  515.                                         LCD1=1;
  516.                                         LCD2=0;
  517.                                 if (LCDSec==1)
  518.                                  {
  519.                                         P0=0X8b;//显示H
  520.                                  }
  521.                                  else
  522.                                  {
  523.                                         P0=Tab0[ly_dis2];//P0口驱动数码管1到8的定时显示
  524.                                  }
  525.                                         break;                                
  526.                         }
  527.                         posit++;
  528.                         if(posit>2)
  529.                         {
  530.                                 posit=1;
  531.                         }
  532.                 }
  533. else
  534. {
  535.         LCD1=1;
  536.         LCD2=1;
  537. }
  538. }
  539. /**********************************************************/
  540. void T0_time() interrupt 1  //定时器0函数
  541. {
  542.         TF0=0;  //清除中断标志
  543.         TR0=0; //关中断
  544.         key_scan(); //按键扫描函数
  545.         
  546.          if(DSBZ==1)  //启动定时倒计时计数器
  547.   {
  548.      uiTimeCnt++;
  549.      if(uiTimeCnt>=const_1s)    //1秒时间到
  550.      {
  551.                          js1m++;
  552.                          if (js1m==210)
  553.                          {
  554.             if(DSSJ!=0) //防止倒计时到0秒
  555.             {
  556.                DSSJ--;  //倒计时值减1
  557.             }
  558.                                         js1m=0;        
  559.                                 }
  560.    
  561.         uiTimeCnt=0;   //计时器清零,准备重新开始
  562.      }
  563.   }

  564.         display_drive();  //数码管字模驱动函数
  565.         TH0=0xfe;   //重装初始值(65535-500)=635035=0xfe0b
  566.         TL0=0x0b;
  567.         TR0=1;  //开中断
  568. }

  569. /*******************************************************/
  570. void initial_myself()  //初始化单片机
  571. {
  572.    
  573.    
  574.         //I/O口初始化
  575.     IRIN=1;           //红外接收器数据线,外部中断0                  
  576.           K1 = 1;           //按键1
  577.           K2 = 1;           //按键2
  578.           K3 = 1;           //按键3
  579.     SC1 = 1;          //1档输出
  580.     SC2 = 1;          //2档输出
  581.     SC3 = 1;          //3档输出
  582.     LED4 = 1;         //仿自然风指示小灯
  583. ……………………

  584. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
接下来是重点
所有资料51hei提供下载:
遥控风扇程序.rar (122.38 KB, 下载次数: 359)
风扇电路仿真图.rar (42.08 KB, 下载次数: 264)


评分

参与人数 4黑币 +132 收起 理由
51yzq + 6
yousunny + 20 很给力!
张小帅1126 + 6
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏33 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:102702 发表于 2017-8-5 23:32 | 只看该作者
楼主如果能做成一张PCB就完美了
回复

使用道具 举报

板凳
ID:105804 发表于 2017-8-6 07:35 | 只看该作者
正合我意
回复

使用道具 举报

地板
ID:105804 发表于 2017-8-6 07:39 | 只看该作者
那个A1015可不可以用其他PNP三极管代替吗?
回复

使用道具 举报

5#
ID:129855 发表于 2017-8-6 13:02 来自手机 | 只看该作者
奥斯特洛夫斯基 发表于 2017-8-6 07:39
那个A1015可不可以用其他PNP三极管代替吗?

参数相符即可,只是起开关作用
回复

使用道具 举报

6#
ID:147518 发表于 2017-8-15 15:52 来自手机 | 只看该作者
用个小点的单片机嘛
回复

使用道具 举报

7#
ID:82765 发表于 2017-8-15 22:07 | 只看该作者
好资料,强烈支持大家 diy,赞一个
回复

使用道具 举报

8#
ID:227313 发表于 2017-8-17 09:40 | 只看该作者
也想把家里的电扇改造一下 学习学习 谢谢
回复

使用道具 举报

9#
ID:164850 发表于 2017-9-5 13:59 | 只看该作者
把家里的电扇改造一下 学习学习 谢谢

IMG_20170905_134753.jpg (2.51 MB, 下载次数: 147)

IMG_20170905_134753.jpg

IMG_20170905_134805.jpg (2.77 MB, 下载次数: 143)

IMG_20170905_134805.jpg

IMG_20170905_134840.jpg (744.6 KB, 下载次数: 147)

IMG_20170905_134840.jpg

IMG_20170905_134853.jpg (2.57 MB, 下载次数: 145)

IMG_20170905_134853.jpg
回复

使用道具 举报

10#
ID:164850 发表于 2017-9-5 16:34 | 只看该作者
回复

使用道具 举报

11#
ID:209789 发表于 2017-9-6 19:37 | 只看该作者
谢谢分享
回复

使用道具 举报

12#
ID:129855 发表于 2017-9-15 22:07 来自手机 | 只看该作者
luxianjun 发表于 2017-9-5 13:59
把家里的电扇改造一下 学习学习 谢谢

能帮到你我很高兴!下载回贴是你们给我的最大动力。继续努力,再发新贴!
回复

使用道具 举报

13#
ID:232280 发表于 2017-9-23 11:45 来自手机 | 只看该作者
好东西,能发一下需要哪些材料吗?你这个好像不是用继电器的
回复

使用道具 举报

14#
ID:248377 发表于 2017-11-11 16:06 来自手机 | 只看该作者
不错的资料,真是羡慕
回复

使用道具 举报

15#
ID:194149 发表于 2017-12-4 21:54 | 只看该作者
proteus仿真数码管怎么不亮
回复

使用道具 举报

16#
ID:129855 发表于 2018-1-24 23:23 | 只看该作者
863903579 发表于 2017-12-4 21:54
proteus仿真数码管怎么不亮

不好意思,仿真图我随便找的元器件,我没有仿真。仿真图只是我的电路图,电路是正确的!
回复

使用道具 举报

17#
ID:46999 发表于 2018-2-26 09:37 | 只看该作者
谢谢分享,今年必须改个来用
回复

使用道具 举报

18#
ID:282091 发表于 2018-3-12 02:20 | 只看该作者
马上就热了,刚好可以搞来用
回复

使用道具 举报

19#
ID:272625 发表于 2018-4-7 20:29 来自手机 | 只看该作者
感谢楼主共享,现在正需要了!
回复

使用道具 举报

20#
ID:272625 发表于 2018-4-11 10:09 来自手机 | 只看该作者
楼主程序发现有问题,显示100分钟以下,段码有暗影。如显示:95分钟,看到的是88分钟。消暗影不知怎么改?哪个大神改好了传上来!
回复

使用道具 举报

21#
ID:76497 发表于 2018-5-25 11:13 | 只看该作者
我也把我的风扇改造一下。
回复

使用道具 举报

22#
ID:129855 发表于 2018-5-26 11:26 | 只看该作者
都市郎 发表于 2018-4-11 10:09
楼主程序发现有问题,显示100分钟以下,段码有暗影。如显示:95分钟,看到的是88分钟。消暗影不知怎么改?哪 ...

已经加了消隐,由于未拆风扇所以未测试,你可以测试下,如果测试ok请回复一下
回复

使用道具 举报

23#
ID:129855 发表于 2018-5-26 11:31 | 只看该作者
加了消隐,用过OK请回复!

遥控风扇.rar

143.26 KB, 下载次数: 88, 下载积分: 黑币 -5

回复

使用道具 举报

24#
ID:129855 发表于 2018-5-26 11:42 来自手机 | 只看该作者
fyhhtgq 发表于 2018-5-26 11:31
加了消隐,用过OK请回复!

忘了编译,请下载后编译下再使用!也就是说文件里的HEX文件还是没加消隐的。特此声明!
回复

使用道具 举报

25#
ID:272625 发表于 2018-6-2 23:27 来自手机 | 只看该作者
最近工作挺忙的,没时间逛论坛。程序经过请教大神早就改好了!
回复

使用道具 举报

26#
ID:272625 发表于 2018-6-3 10:50 | 只看该作者
      楼主真是不好意思!我的开发板模块拆了,风扇早装好了,天气热不想拆。我改的程序跟楼主不一样!
我的是加P0=0XFF;,楼主的是加LCD1=1;LCD2=1;。
      另外有一点不明白P0=0X8b;//显示H,改成共阴数码管H不能正常显示。为什么H是0X8b?
共阴数码管H是:0X76,共阳数码管H是:0X89,对不上呀?
回复

使用道具 举报

27#
ID:129855 发表于 2018-6-3 13:22 来自手机 | 只看该作者
都市郎 发表于 2018-6-3 10:50
楼主真是不好意思!我的开发板模块拆了,风扇早装好了,天气热不想拆。我改的程序跟楼主不一样!
我 ...

建议学习一下,这是最基本的东西!
回复

使用道具 举报

28#
ID:346921 发表于 2018-6-7 14:27 | 只看该作者
想下载学习下,可就是。。。。。
回复

使用道具 举报

29#
ID:346921 发表于 2018-6-8 11:41 | 只看该作者
楼主不能把图和程序放一个压缩包里吗?分两次下扣两次黑币啊!
回复

使用道具 举报

30#
ID:129855 发表于 2018-6-8 20:20 来自手机 | 只看该作者
zfeng 发表于 2018-6-8 11:41
楼主不能把图和程序放一个压缩包里吗?分两次下扣两次黑币啊!

请直接下13楼的就可以了,编译一下,忘了编译,里面的hex文件是没加消隐的。
回复

使用道具 举报

31#
ID:164850 发表于 2018-6-9 14:57 | 只看该作者
下23楼的就可以了,编译一下,忘了编译,里面的hex文件是没加消隐的。
回复

使用道具 举报

32#
ID:348234 发表于 2018-6-9 15:33 来自手机 | 只看该作者
马上就热了,刚好可以搞来用
回复

使用道具 举报

33#
ID:346921 发表于 2018-6-15 12:45 | 只看该作者
三个机械按键加的电容有什么作用,可不加吗?
回复

使用道具 举报

34#
ID:129855 发表于 2018-6-15 14:55 来自手机 | 只看该作者
zfeng 发表于 2018-6-15 12:45
三个机械按键加的电容有什么作用,可不加吗?

起消抖作用,但程序里己经作了消抖处理,加只是我的习惯问题,可以不加!
回复

使用道具 举报

35#
ID:346921 发表于 2018-7-12 09:19 | 只看该作者
做是做好了,最近发现老是开一会自动关了,也没定时,不知什么原因,有遇到过的吗?
回复

使用道具 举报

36#
ID:89072 发表于 2018-7-15 17:32 | 只看该作者
编译时出现警告不通过,下载后不显示,仿真也不显示,不知道哪里出问题,下了两个压缩包,没黑币啦
回复

使用道具 举报

37#
ID:120628 发表于 2018-7-17 12:26 来自手机 | 只看该作者
哈哈,刚好想改家里风扇
回复

使用道具 举报

38#
ID:346921 发表于 2018-7-23 09:24 | 只看该作者
发现红外中断里的程序比较多,对系统运行有影响的吧?
回复

使用道具 举报

39#
ID:129855 发表于 2018-7-26 21:32 来自手机 | 只看该作者
zfeng 发表于 2018-7-23 09:24
发现红外中断里的程序比较多,对系统运行有影响的吧?

两年多了,没出现过问题!
回复

使用道具 举报

40#
ID:346921 发表于 2018-7-30 08:57 | 只看该作者
本帖最后由 zfeng 于 2018-7-30 09:08 编辑

楼主百忙之中还回帖,赞一下。顺便再回答我个问题吧:我把这个程序加在STC8F2K08S2。这个没打完不小心回车了,请管理员删了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表