找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1139|回复: 7
收起左侧

STC8H2K12U单片机制作电风扇遥控器

[复制链接]
ID:237797 发表于 2024-9-22 11:33 | 显示全部楼层 |阅读模式
利用STC8H2K12U单片机制作电风扇遥控器,遇到问题求助大家帮助。

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

问题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;               
//                                }                                       
                        }     
回复

使用道具 举报

ID:237797 发表于 2024-9-23 19:19 | 显示全部楼层

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

使用道具 举报

ID:161164 发表于 2024-9-23 09:35 | 显示全部楼层
2024-09-23_093459.png
回复

使用道具 举报

ID:237797 发表于 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. }

复制代码
回复

使用道具 举报

ID:237797 发表于 2024-9-23 07:44 | 显示全部楼层
lkc8210 发表于 2024-9-22 21:07
代码不全
定时关机按键使能定时关机标志位
定时关机标志位使能后才开始计时

谢谢你的回答,我直接先试试,再把全部代码传上来。
回复

使用道具 举报

ID:161164 发表于 2024-9-22 21:07 | 显示全部楼层
代码不全
定时关机按键使能定时关机标志位
定时关机标志位使能后才开始计时
时间到,关机,清零计时及定时关机标志位
回复

使用道具 举报

ID:688428 发表于 2024-9-22 17:17 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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