标题:
哪位老师帮忙加一个掉电模式及唤醒
[打印本页]
作者:
1qaz2wsx77
时间:
2017-6-1 20:43
标题:
哪位老师帮忙加一个掉电模式及唤醒
用STC15F104W做了一个红外摇控的开关,其输出可控制继电器或双向晶闸管。程序已调试,好用。但工作时耗电为7mA左右,想加一个掉电模式,用红外唤醒,这样平时工作电流就可以到0.1μA。但不知道如何加入掉电模式并唤醒,红外接收还能好用。整了好几天了,我是整不明白了。哪位大侠帮忙。程序如下:
/*
控制器引脚定义:
1 P3.4
2 VCC 3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3
*/
/*-----------------------------------------------
名称:遥控器红外控制MAC97A8
内容:三种遥控器控制三个晶闸管
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <INTRINS.h>
sbit IR=P3^2; //红外接口标志
sbit jd1=P3^5;
sbit jd2=P3^4;
sbit jd3=P3^3;
/*----------------------------------------------
全局变量声明
------------------------------------------------*/
unsigned char irtime;//红外用全局变量
unsigned int a=0;
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
/*------------------------------------------------
函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*------------------------------------------------
红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
/*------------------------------------------------
键值处理
------------------------------------------------*/
void Ir_work(void)//红外键值散转程序
{
switch(IRcord[3])//判断第三个数码值 可 根 据 自 己 的 摇 控 器 填 写 码 值 {
case 0xf3:jd1=~jd1;break; //摇控器一1230
case 0xe7:jd2=~jd2;break;
case 0xa1:jd3=~jd3;break;
case 0xe9:jd1=1;jd2=1;jd3=1;break;
case 0x6d:jd1=~jd1;break;//摇控器二1230
case 0x6c:jd2=~jd2;break;
case 0x33:jd3=~jd3;break;
case 0x78:jd1=1;jd2=1;jd3=1;break;
case 0x0f:jd1=~jd1;break; //摇控器三1230
case 0x13:jd2=~jd2;break;
case 0x17:jd3=~jd3;break;
case 0x3f:jd1=1;jd2=1;jd3=1;FLAG=1;break;
default:break;
}
irpro_ok=0;//处理完成标志
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器
jd1=0;
jd2=0;
jd3=0;
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理
{
Ir_work();
}
}
}
复制代码
作者:
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