标题: 哪位老师帮忙加一个掉电模式及唤醒 [打印本页]

作者: 1qaz2wsx77    时间: 2017-6-1 20:43
标题: 哪位老师帮忙加一个掉电模式及唤醒
用STC15F104W做了一个红外摇控的开关,其输出可控制继电器或双向晶闸管。程序已调试,好用。但工作时耗电为7mA左右,想加一个掉电模式,用红外唤醒,这样平时工作电流就可以到0.1μA。但不知道如何加入掉电模式并唤醒,红外接收还能好用。整了好几天了,我是整不明白了。哪位大侠帮忙。程序如下:

  1. /*

  2. 控制器引脚定义:
  3. 1 P3.4
  4. 2 VCC  3.8--5.5V
  5. 3 P3.5
  6. 4 GND
  7. 5 P3.0 接烧录器的TXD
  8. 6 P3.1 接烧录器的RXD
  9. 7 P3.2
  10. 8 P3.3
  11. */



  12. /*-----------------------------------------------
  13.   名称:遥控器红外控制MAC97A8

  14.   内容:三种遥控器控制三个晶闸管
  15. ------------------------------------------------*/
  16. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  17. #include <INTRINS.h>
  18. sbit IR=P3^2;  //红外接口标志
  19. sbit jd1=P3^5;
  20. sbit jd2=P3^4;
  21. sbit jd3=P3^3;
  22. /*----------------------------------------------
  23.                 全局变量声明
  24. ------------------------------------------------*/

  25. unsigned char  irtime;//红外用全局变量
  26. unsigned int a=0;
  27. bit irpro_ok,irok;
  28. unsigned char IRcord[4];
  29. unsigned char irdata[33];

  30. /*------------------------------------------------
  31.                   函数声明
  32. ------------------------------------------------*/

  33. void Ir_work(void);
  34. void Ircordpro(void);

  35. /*------------------------------------------------
  36.                 定时器0初始化
  37. ------------------------------------------------*/
  38. void TIM0init(void)//定时器0初始化
  39. {

  40.   TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  41.   TH0=0x00; //重载值
  42.   TL0=0x00; //初始化值
  43.   ET0=1;    //开中断
  44.   TR0=1;   
  45. }

  46. /*------------------------------------------------
  47.                   定时器0中断处理
  48. ------------------------------------------------*/

  49. void tim0_isr (void) interrupt 1 using 1
  50. {
  51.   irtime++;  //用于计数2个下降沿之间的时间
  52. }

  53. /*------------------------------------------------
  54.                   外部中断0初始化
  55. ------------------------------------------------*/
  56. void EX0init(void)
  57. {
  58. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  59. EX0 = 1;   //使能外部中断
  60. EA = 1;    //开总中断
  61. }

  62. /*------------------------------------------------
  63.                   外部中断0中断处理
  64. ------------------------------------------------*/
  65. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  66. {
  67.           static unsigned char  i;             //接收红外信号处理
  68.           static bit startflag;                //是否开始处理标志位
  69.          
  70.           if(startflag)                        
  71.            {

  72.             if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  73.                                 i=0;
  74.                             irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  75.                             irtime=0;
  76.                             i++;
  77.                                     if(i==33)
  78.                                       {
  79.                                            irok=1;
  80.                                          i=0;
  81.                                           }
  82.            }
  83.           else
  84.            {
  85.                 irtime=0;
  86.                 startflag=1;
  87.        
  88.            }
  89.           
  90. }
  91. /*------------------------------------------------
  92.                 红外码值处理
  93. ------------------------------------------------*/
  94. void Ircordpro(void)//红外码值处理函数
  95. {
  96.   unsigned char i, j, k;
  97.   unsigned char cord,value;
  98.   k=1;
  99.   for(i=0;i<4;i++)      //处理4个字节
  100.      {
  101.       for(j=1;j<=8;j++) //处理1个字节8位
  102.          {
  103.           cord=irdata[k];
  104.           if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  105.              value|=0x80;
  106.           if(j<8)
  107.                     {
  108.                          value>>=1;
  109.                         }
  110.            k++;
  111.          }
  112.      IRcord[i]=value;
  113.      value=0;     
  114.      }
  115.          irpro_ok=1;//处理完毕标志位置1

  116. }
  117. /*------------------------------------------------
  118.                   键值处理
  119. ------------------------------------------------*/

  120. void Ir_work(void)//红外键值散转程序
  121. {

  122.        switch(IRcord[3])//判断第三个数码值 可 根 据        自 己 的 摇        控 器 填 写        码 值                  {


  123.                          case 0xf3:jd1=~jd1;break; //摇控器一1230
  124.                          case 0xe7:jd2=~jd2;break;
  125.                          case 0xa1:jd3=~jd3;break;
  126.                          case 0xe9:jd1=1;jd2=1;jd3=1;break;

  127.                          case 0x6d:jd1=~jd1;break;//摇控器二1230
  128.                          case 0x6c:jd2=~jd2;break;
  129.                          case 0x33:jd3=~jd3;break;
  130.                          case 0x78:jd1=1;jd2=1;jd3=1;break;


  131.                          case 0x0f:jd1=~jd1;break; //摇控器三1230
  132.                          case 0x13:jd2=~jd2;break;
  133.                          case 0x17:jd3=~jd3;break;
  134.                          case 0x3f:jd1=1;jd2=1;jd3=1;FLAG=1;break;



  135.              default:break;
  136.                          }
  137.                   irpro_ok=0;//处理完成标志

  138. }
  139. /*------------------------------------------------
  140.                     主函数
  141. ------------------------------------------------*/
  142. void main(void)
  143. {
  144. EX0init(); //初始化外部中断
  145. TIM0init();//初始化定时器

  146. jd1=0;
  147. jd2=0;
  148. jd3=0;

  149. while(1)//主循环
  150.    {

  151.             if(irok)                        //如果接收好了进行红外处理
  152.                   {   
  153.                    Ircordpro();
  154.                     irok=0;
  155.                   }
  156.        
  157.             if(irpro_ok)                   //如果处理好后进行工作处理
  158.                   {
  159.                    Ir_work();
  160.                     }

  161.    }
  162. }
复制代码




作者: yzwzfyz    时间: 2017-6-2 16:34
请查阅单片机,省电模式部分。
一条指令即可解决问题。
作者: 1qaz2wsx77    时间: 2017-6-2 17:38
加入PCON |=0x02;就进入了掉电模式,然后有红外触发时就唤醒,然后就执行外部中断程序.过程是这样的,我也知道.但如何加?如何不影响红外部分的接收和处理呀?我现在做到了能进入掉电模式,有红外时就会唤醒,但唤醒后就不能进入掉电模式了,要不就是在掉电模式,而不能执行红外摇控的功能.
作者: zl2168    时间: 2017-6-2 21:30
按单片机掉电模式处理就可以了,至于红外唤醒,接中断就行。
作者: 1qaz2wsx77    时间: 2017-6-3 07:46
是那样做了,但一直处于正常工作状态。后红过我的观察,估计是红外有干扰,所以单片机一直处于唤醒状态。
作者: ljhyjx    时间: 2020-3-13 21:35
你这个不能进入掉电模式,因为进入后定时器关闭,irtime得不到正确的计数无法正确解码。也不能进入空闲模式,定时器中断会不断唤醒。
作者: ljhyjx    时间: 2020-3-13 22:07
但在主循环里最后加上   PCON=0x01;     _nop_();      _nop_();也许能多少省一些电。




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