标题: STC8H2K12U单片机制作电风扇遥控器 [打印本页]

作者: lclbf    时间: 2024-9-22 11:33
标题: STC8H2K12U单片机制作电风扇遥控器
利用STC8H2K12U单片机制作电风扇遥控器,遇到问题求助大家帮助。

1、遥控不能控制,遥控头输入口P32口和P10口共用,要把P10口设置为高阻输入。
2、遥控定时功能不正常,
原理图和PCB图如下:


问题2,遥控定时关机问题,现在遥控定时按键按下,到时不能关机,要再次按下关机键才能关机。
程序代码如下:
中断定时处理程序如下:
void Intimer1() interrupt 3
{
        static unsigned char cnt = 0;
        static unsigned int cnt1s = 0;
      
        TH1 = 0XFC;  //12MHz 1ms
        TL1 = 0X18;
      
        cnt++;
        if(cnt>=20)
        {
                cnt = 0;
                flag20ms = 1; //20ms
        }
        cnt1s++;
        if(cnt1s>=1000)
        {
                cnt1s = 0;
                if(flag1s<65535)
                {
                        flag1s++;         //1s++
                }
        }
}

遥控对应按键处理程序如下:
else if((ircode[2] == 0x02)&&(1==LEDflag)) //+ 遥控定时关机按键
                        {
//                                if(flag1s>=10)
//                                {
                                        LEDflag = 0;
                                        LEDSta = 1;               
//                                }                                       
                        }     

作者: yejin007    时间: 2024-9-22 17:17
学习了
作者: lkc8210    时间: 2024-9-22 21:07
代码不全
定时关机按键使能定时关机标志位
定时关机标志位使能后才开始计时
时间到,关机,清零计时及定时关机标志位
作者: lclbf    时间: 2024-9-23 07:44
lkc8210 发表于 2024-9-22 21:07
代码不全
定时关机按键使能定时关机标志位
定时关机标志位使能后才开始计时

谢谢你的回答,我直接先试试,再把全部代码传上来。
作者: lclbf    时间: 2024-9-23 07:49
lkc8210 发表于 2024-9-22 21:07
代码不全
定时关机按键使能定时关机标志位
定时关机标志位使能后才开始计时
  1. /***********************
  2. OUT(低电平可控硅导通) P54 1     8 P33 P11(蜂鸣器输出,高电平有效)
  3.                                                                                         VCC 2     7 P32 P10 INTN0(遥控输入)
  4.                       CAP 3     6 P31
  5.                       GND 4     5 P30(按键)

  6. 遥控器键码值
  7.                         01
  8.                        
  9.                         00
  10.                        
  11.                         01                        09
  12.                        
  13.                                         05
  14.                                        
  15.                         02        06        0A
  16.                        
  17.                                         04
  18.                                        
  19.                         03        07        0B
  20.                        
  21.                         40      48
  22.                        
  23.                                         44
  24. ***********************/
  25. #include <STC8h.h>
  26. #include <intrins.h>

  27. /* IO引脚分配定义 */
  28. sbit LED = P5^4;
  29. sbit BUZZ = P3^3;
  30. sbit KEY = P3^0;
  31. bit LEDflag = 0; //0关闭风扇,1打开风扇
  32. unsigned  char LEDSta = 1; //1,关闭风扇
  33. unsigned char i = 0;

  34. bit flag20ms = 0;
  35. unsigned int flag1s;

  36. extern bit irflag;
  37. extern unsigned char ircode[4];
  38. extern void InitInfrared();

  39. void kongzhi();
  40. void Intimer1Init(); //12MHZ12T 1US
  41. void myInit();

  42. void main()
  43. {
  44.         unsigned int cnt = 0;
  45.        
  46.         myInit();
  47.                
  48.         EA = 1;      //开总中断       
  49.        
  50.         Intimer1Init();
  51.         InitInfrared();   //初始化红外功能

  52.         LED = 1;
  53.         while (1)
  54.         {
  55.                 if(flag20ms==1)
  56.                 {
  57.                         flag20ms = 0;
  58.                         kongzhi();                       
  59.                 }               
  60.         }
  61. }

  62. void myInit()
  63. {
  64.         P_SW2 |= 0X80;
  65.        
  66.         P0M0 = 0XFF;
  67.         P0M1 = 0X00;
  68.         P1M0 = 0x00;
  69.         P1M1 = 0x03;
  70.         P2M0 = 0XFF;
  71.         P2M1 = 0X00;
  72.         P3M0 = 0XFB;
  73.         P3M1 = 0X00;
  74.         P4M0 = 0XFF;
  75.         P4M1 = 0X00;
  76.         P5M0 = 0XFF;
  77.         P5M1 = 0X00;
  78.        
  79.         LED = 1;
  80. }


  81. void Delay20ms(void)        //@11.0592MHz
  82. {
  83.         unsigned char data i, j, k;

  84.         i = 2;
  85.         j = 32;
  86.         k = 60;
  87.         do
  88.         {
  89.                 do
  90.                 {
  91.                         while (--k);
  92.                 } while (--j);
  93.         } while (--i);
  94. }

  95. void kongzhi()
  96. {       
  97.         if (irflag)  //接收到红外数据时刷新显示
  98.                 {
  99.                         irflag = 0;
  100.                         if (ircode[2] == 0x01)  //0x01为+键码ON,开风扇
  101.                         {
  102.                                 LEDflag = 1;
  103.                                 LEDSta = 0;
  104.                         }

  105.                         else if (ircode[2] == 0x09)  //0x09为-键码OFF,关风扇
  106.                         {
  107.                                 LEDflag = 0;
  108.                                 LEDSta = 1;
  109.                         }
  110.                         else if ((ircode[2] == 0x40)&&(1==LEDflag))  //0x40为-键码3H,风扇1档风,最大
  111.                         {
  112.                                 LEDflag = 1;
  113.                                 LEDSta = 2;
  114.                         }
  115.                         else if ((ircode[2] == 0x48)&&(1==LEDflag))  //0x48为-键码5H,风扇2档风,最次大
  116.                         {
  117.                                 LEDflag = 1;
  118.                                 LEDSta = 3;
  119.                         }
  120.                         else if ((ircode[2] == 0x44)&&(1==LEDflag))  //0x44为-键码8H,风扇3档风,最小
  121.                         {
  122.                                 LEDflag = 1;
  123.                                 LEDSta = 4;                                                                                               
  124.                         }
  125.                         else if((ircode[2] == 0x02)&&(1==LEDflag)) //+ 遥控定时关机按键
  126.                         {
  127.                                 if(flag1s>=10)
  128.                                 {
  129.                                         LEDflag = 0;
  130.                                         LEDSta = 1;               
  131.                                 }                                       
  132.                         }                                       
  133.         }
  134.        
  135.         switch(LEDSta)
  136.         {

  137.                 case 0:LED = 0;break;
  138.                 case 1:LED = 1;break;
  139.                 case 2:LED = 0;break;
  140.                 case 3:LED = 0;
  141.                                         Delay20ms();Delay20ms();Delay20ms();
  142.                                         Delay20ms();Delay20ms();Delay20ms();
  143.                                         Delay20ms();Delay20ms();Delay20ms();
  144.                                         Delay20ms();Delay20ms();Delay20ms();
  145.                                         Delay20ms();
  146.                                         LED = 1;
  147.                                         Delay20ms();break;
  148.                 case 4:LED = 0;
  149.                                         Delay20ms();Delay20ms();Delay20ms();
  150.                                         Delay20ms();Delay20ms();Delay20ms();
  151.                                         Delay20ms();
  152.                                         LED = 1;                                                       
  153.                                         Delay20ms();
  154.                                         break;
  155.                 default:break;
  156.         }
  157. }

  158. void Intimer1Init() //12MHZ12T 1mS
  159. {
  160.         TMOD &= 0X0F;
  161.         TMOD |= 0X10;
  162.         TH1 = 0XFC;
  163.         TL1 = 0X18;
  164.         ET1 = 1;
  165.         TR1 = 1;
  166. }


  167. void Intimer1() interrupt 3
  168. {
  169.         static unsigned char cnt = 0;
  170.         static unsigned int cnt1s = 0;
  171.        
  172.         TH1 = 0XFC;
  173.         TL1 = 0X18;
  174.        
  175.         cnt++;
  176.         if(cnt>=20)
  177.         {
  178.                 cnt = 0;
  179.                 flag20ms = 1;
  180.         }
  181.         cnt1s++;
  182.         if(cnt1s>=1000)
  183.         {
  184.                 cnt1s = 0;
  185.                 if(flag1s<65535)
  186.                 {
  187.                         flag1s++;       
  188.                 }
  189.         }
  190. }

复制代码

作者: lkc8210    时间: 2024-9-23 09:35


作者: lclbf    时间: 2024-9-23 19:19
lkc8210 发表于 2024-9-23 09:35

谢谢你的帮助,可以实现定时了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1