欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
哪位老師幫忙加一個掉電模式及喚醒
[打印本頁]
作者:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1