專利名稱:基于單片機的電視機低功耗待機控制方法
技術領域:
本發(fā)明屬于電視機技術領域,更明確地說涉及基于單片機的電視機低功耗待機控制方法的改進。
背景技術:
為給電視用戶提供方便、同時又盡最太限度降低電視機地待機功耗,原有的依靠主芯片實現待機控制功能的情況并不理想。不理想的原因在于原有待機電源本身的功耗相對太大,而改用功耗小的又滿足不了主芯片的工作要求。解決的方法只能是在改用小功耗的待機電源的同時,增加合適的控制電路,實現電視機的低功耗待機。
發(fā)明內容
本發(fā)明的目的,就在于克服上述缺點和不足,提供一種基于單片機的電視機低功耗待機控制方法。它是在使用小功耗的待機電源的同時,采用一種行之有效的低功耗待機控制方法,在不增加成本的前提下,實現更低的待機功耗。其節(jié)能效果好,可廣泛應用于各種電視機中。
為了達到上述目的,本發(fā)明以單片機控制待機電源的繼電器,包括以下步驟
(1)單片機上電復位后,通過其GP0口檢測主芯片指定I/O口輸入電平狀態(tài),同時通過程序讀取E2PROM,檢測電視機在上次電源關閉時是處于“開機”還是“待機”狀態(tài);
(2)若為“待機”狀態(tài),則通過GP1口輸出高電平,驅動紅色指示燈亮,并執(zhí)行以下分步驟
①通過COUT口監(jiān)控來自遙控接收器的輸出信號,接收到“開機”信號后,通過GP4口輸出高電平,同時將GP1口電平拉低用以驅動藍色指示燈亮,并將當前開機狀態(tài)存儲到E2PROM;
②通過GP3口監(jiān)控來自按鍵的輸出信號,接收到“開機”信號后,執(zhí)行上述①步驟;
(3)若為“開機”狀態(tài),則通過GP1口輸出低電平驅動藍色指示燈亮,并執(zhí)行以下分步驟
①通過GP2口檢測來自遙控接收器的輸出信號,接收到“待機”信號后,同時讀取GP0口的輸入電平兩次,其間隔時間為10ms,若第一次為高電平,第二次為低電平,則通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM;
②同時調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應;
③對其它情況,程序不執(zhí)行任何操作;
④通過GP3口檢測來自按鍵的輸出信號,接收到“待機”信號后,執(zhí)行上述①~③步驟;
(4)在單片機工作的全過程中,GP0口一旦檢測到一個下降沿信號,無論有無來自遙控或按鍵的控制信號,都通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM,同時要調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應。
單片機為PIC12F675型。
單片機的GP4口輸出低電平時,控制主電源的繼電器處于斷開狀態(tài),主電源不工作。單片機的GP4口輸出高電平時,控制主電源的繼電器處于閉合狀態(tài),主電源工作。
上電后此低功耗待機控制電路即開始工作,不掉電不停止工作。正常工作時程序一直處于循環(huán)中。電視機所處的“待機”或“開機”狀態(tài)存儲于E2PROM中,掉電也不丟失。
本發(fā)明的任務就是這樣完成的。
本發(fā)明是在使用小功耗的待機電源的同時,采用一種行之有效的低功耗待機控制方法,在不增加成本的前提下,實現更低的待機功耗。其節(jié)能效果好,待機功耗可降低至0.3W左右??蓮V泛應用于各種電視機中。
圖1為本發(fā)明單片機PIC12F675的電路連接圖。
圖2為本方法的流程圖。
具體實施例方式
實施例1。一種基于單片機的電視機低功耗待機控制方法,如圖1~圖2所示。本方法以單片機控制待機電源的繼電器,包括以下步驟
(1)單片機上電復位后,通過其GP0口檢測主芯片某腳(I/O口)的輸入電平狀態(tài),同時通過程序讀取E2PROM,檢測電視機在上次電源關閉時是處于“開機”還是“待機”狀態(tài);
(2)若為“待機”狀態(tài),則通過GP1口輸出高電平,驅動紅色指示燈亮,并執(zhí)行以下分步驟
①通過COUT口監(jiān)控來自遙控接收器的輸出信號,接收到“開機”信號后,通過GP4口輸出高電平,同時將GP1口電平拉低用以驅動藍色指示燈亮,并將當前開機狀態(tài)存儲到E2PROM;
②通過GP3口監(jiān)控來自按鍵的輸出信號,接收到“開機”信號后,執(zhí)行上述①步驟;
(3)若為“開機”狀態(tài),則通過GP1口輸出低電平驅動藍色指示燈亮,并執(zhí)行以下分步驟
①通過GP2口檢測來自遙控接收器的輸出信號,接收到“待機”信號后,同時讀取GP0口的輸入電平兩次,其間隔時間為10ms,若第一次為高電平,第二次為低電平,則通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM;
②同時調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應;
③對其它情況,程序不執(zhí)行任何操作;
④通過GP3口檢測來自按鍵的輸出信號,接收到“待機”信號后,執(zhí)行上述①~③步驟;
(4)在單片機工作的全過程中,GP0口一旦檢測到一個下降沿信號,無論有無來自遙控或按鍵的控制信號,都通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM,同時要調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應。
單片機為PIC12F675型。
實施例1是在使用小功耗的待機電源的同時,采用一種行之有效的低功耗待機控制方法,在不增加成本的前提下,實現更低的待機功耗。其節(jié)能效果好,待機功耗可降低至0.3W左右??蓮V泛應用于各種電視機中。
本實施例的源代碼如下
lcd_pwrctr_1216[4]/********************************************************************Hisense LCD Power Controller**Author:Glenn Fan****Filename: PowerController.c **Date: 29/11/05**File Version: 1.00****Tools used: Hitech PICC 8.05********************************************************************//* PIC12F629-I/P |///////| |////////| | / | VDD ---|-1 VDD VSS 8 - | -- VSS NC <--|-2 GP5GP0 7-| <-- T_INT RLY_ON <--|-3 GP4 GP1 6 - | --> LED KEY_PWR -->|-4 GP3 GP2 5 - | <-- REMOTE | | |///////////////////|*/#include <pic.h>__CONFIG(WDTEN & PWRTEN & BORDIS & MCLRDIS & UNPROTECT & INTIO);//----------------PORT Defination------------------------#define T_INT_PORT GPI00#define LED_PORT GPI01#define REMOTE_PORTGPI02#define KEY_PWR_PORTGPI03#define RLY_ON_PORTGPI04//-----------------Constant Defination-------------------#define T_BASE 56//-----------------Variable Defination-------------------volatile unsigned char SysStatus;volatile unsigned char t_4ms;volatile unsigned char t1_4ms;volatile unsigned char t2_4ms;volatile unsigned char t_Sec;volatile unsigned char remoteByteCnt;volatile unsigned char remoteBitCnt;volatile unsigned char remoteStep;volatile union{ unsigned int remoteTW; struct { unsigned char remoteTL; unsigned char remoteTH; }remoteTD;}remoteTU;#define remoteTime_LremoteTU.remoteTD.remoteTL#define remoteTime_HremoteTU.remoteTD.remoteTH#define remoteTime remoteTU.remoteTWvolatile unsigned char remoteData[4];volatile union{ unsigned char mSysStatus; struct { unsigned RUNON:1; unsigned POWER:1;<!-- SIPO <DP n="4"> --><dp n="d4"/> lcd_ pwrctr_1216[4] unsigned IR_RC5_START :1; unsigned EN_REMOTE_DECODE :1; unsigned T_HIGH :1; unsigned :3; }sysStatusBits;}uSysStatus;#define bRUNON uSysStatus.sysStatusBits.RUNON#define bPOWER uSysStatus.sysStatusBits.POWER#define bIR_RC5_STARTuSysStatus.sysStatusBits.IR_RC5_START#define bEN_REMOTE_DECODEuSysStatus.sysStatusBits.EN_REMOTE_DECODE#define bT_HIGH uSysStatus.sysStatusBits.T_HIGH#define sysStatusuSysStatus.mSysStatus//----------------Function Defination--------------------void Initial_RAM(void);void Initial_FSR(void);void Enhance_Immunity(void);void Remote_Receive(void);void Re_Start_Receive_Remote(void);void Remote_Decode(void);void Key_Detect(void);void T_INT_Detect(void);void PowerOn(void);void Standby(void);void Delay(unsigned char x,unsigned char y);//-----------------Initial RAM-------------------------//-----------------------------------------------------void Initial RAM(void){ for(FSR=0x20;FSR<=0x5f;FSR++) { asm("CLRF 0"); }} .//-----------------Initial FSR-------------------//------------------------------------------------void Initial FSR(void){//Clear INT OPTION=0b00000011;//PORTA pull-ups is enabled,TMRO 1:16 prescaler TRISIO=0b00001101; WPU=0b00000000; IOCB=0b00000000; VRCON=0b00000000; INTCON=0b01100000;//Enable PEIE.TOIE TMR0=0; PIR1=0; TMR1L=0; TMR1H=0; T1CON=0; CMCON=0b00000111;//all digital IO// ADRESH=0;// ADCON0=0b00000000;//Initial PORT// GPIO=0b00000010; GPIO=0b00000000;// ANSEL=0b10000000;//AN7->AD// ADCON1=0b0101000;//FOSC/16}//-------------------Enhance Immunity-------------------//------------------------------------------------------void Enhance_Immunity(void){ OPTION=0b00000011;//PORTA pull-ups is enabled,TMRO 1:16 prescaler TRISIO=0b00001101; TOIE=1;<!-- SIPO <DP n="5"> --><dp n="d5"/> lcd_pwrctr_1216[4] PEIE=1; GIE=1;}//------------------Interrupt------------------------//---------------------------------------------------void interrupt Int_Serve(void){ if(TOIF) { TOIF=0; t_4ms++; t1_4ms++; t2_4ms++; if(t_4ms>=250) { t_4ms=0; t_Sec++; } } else if(TMR1IF) { TMR1IF=0; }}//------------------Remote Data Receive-----------------//------------------------------------------------------void Remote_Receive(void){unsigned char remoteDataTmp=0; if(bPOWER) { Re_Start_Receive_Remote(); return; } if(!bIR_RC5_START) { if(REMOTE_PORT)return; TMR1L=0; TMR1H=0; TMR1IF=0; TMR1IE=1; TMR1ON=1; t1_4ms=0; CLRWDT(); while(!REMOTE_PORT)//等待高電平 { if(t1_4ms>=4) { Re_Start_Receive_Remote(); return; } } remoteTime_L=TMR1L; remoteTime_H=TMR1H; if(remoteTime>150*T_BASE && remoteTime<170*T_BASE)//17T>高電平時間>15T數據頭可能有效 { CLRWDT(); while(REMOTE_PORT) //等待低電平 { if(t1_4ms>=4) { Re_Start_Receive_Remote(); return; } } remoteTime_L=TMR1L; remoteTime_H=TMR1H; if(remoteTime>225*T_BASE && remoteTime<255*T_BASE)//25.5T>高電平時間>22.5T數據頭有效 {<!-- SIPO <DP n="6"> --><dp n="d6"/> lcd_pwrctr_1216[4] //添加開始接收效據程序 for(remoteByteCnt=0;remoteByteCnt<4;remoteByteCnt++) { for(remoteBitCnt=0;remoteBitCnt<8;remoteBitCnt++) { TMR1L=0; TMR1H=0;//重新開始計時 CLRWDT(); t1_4ms=0; while(lREMOTE_PORT) //等待高電平 { if(t1_4ms>=4) { Re_Start_Receive_Remote(); return; } } while(REMOTE_PORT) //等待低電平 { if(t1_4ms>=4) { Re_Start_Receive_Remote(); return; } } remoteTime_L=TMR1L; remoteTime_H=TMR1H; if(remoteTime>34*T_BASE && remoteTime<46*T_BASE)//為1 { CARRY=0; remoteDataTmp>>=1; remoteDataTmp+=0x80; } else if(remoteTime>14*T_BASE && remoteTime<24*T_BASE)//為0 { CARRY=0; remoteDataTmp>>=1; } } remoteData[remoteByteCnt]=remoteDataTmp; remoteBitCnt=0; } bEN_REMOTE_DECODE=1; //接收數據完畢允許解碼 } else //可能為重碼,不接收數據 { Re_Start_Receive_Remote(); } } else if((remoteTime<=1300)&&(remoteTime>=500))//RC5數據頭 { CLRWDT(); bIR_RC5_START=1; //開始遙控接收RC5碼 TMR1IF=0; TMR1L=0; TMR1H=0; remoteStep=1; } else //數據頭不正確繼續(xù)重新開始 { Re_Start_Receive_Remote(); }}else{ switch(remoteStep) { case 1; case 3: case 5: case 7: case 9: case 11:case 13:case 15:case 17:case 19: case 21: t1_4ms=0; while(REMOTE_PORT) {<!-- SIPO <DP n="7"> --><dp n="d7"/> lcd_pwrctr_1216[4] if(t1_4ms>=4) { Re_Start_Receive_Remote(); return; } } remoteTime_L=TMR1L; remoteTime_H=TMR1H; TMR1L=0; TMR1H=0; if(remoteStep==17) {if((remoteTime<=2200)&&(remoteTime>=1400)) { remoteStep++; } else{ Re_Start_Receive_Remote(); } } else { if((remoteTime<=1300)&&(remoteTime>=500)) { remoteStep++; } else { Re_Start_Receive_Remote(); } } break;case 2:case 4: case 6:case 8: case 10:case 12: case 14: case 16: case 18: case 20:case 22: t1_4ms=0; while(!REMOTE_PORT) { if(t1_4ms>=4) { Re_Start_Receive_emote(); return; } } remoteTime_L=TMR1L; remoteTime_H=TMR1H; TMR1L=0; TMR1H=0; if(remoteStep==20) { if((remoteTime<=2200)&&(remoteTime>=1400)) { remoteStep++; } else { Re_Start_Receive_Remote(); } } else if((remoteStep==2)||(remoteStep==4)) { remoteStep++; } else { if((remoteTime<=1300)&&(remoteTimo>=500)) { remoteStep++; } else { Re_Start_Receive_Remote(); } } <!-- SIPO <DP n="8"> --><dp n="d8"/> lcd_pwrctr_1216[4] break; default: bPOWER=1; Re_Start_Receive_Remote(); break; } }}//-----------------Re Start Receive Remote-------------------//----------------------------------------------------------------void Re_Start_Receive_Remote(void){ bIR_RC5_START=0; TMR1ON=0; //停止TMR1 TMR1L=0; TMR1H=0; TMR1IF=0; TMR1IE=0;}//----------------Remote_Decode---------------------------//---------------------------------------------------------void Remote_Decode(void){ if(!bEN_REMOT_DECODE) return; bEN_REMOTE_DECODE=0; if((remoteData[1]==0xBF||remoteData
==0xFC)&&remoteData
==0x00)//用戶碼正確 { if(remoteData[2]==0x10&&remoteData[3]==0xEF)//是電源鍵 { bPOWER=1; } } remoteData[3]=0; remoteData[2]=0; remoteData[1]=0; remoteData
=0;}//------------------Key Detect----------------------------//--------------------------------------------------------void Key_Detect(void){ if(bPOWER)return; if(!KEY_PWR_PORT) { if(t_4ms>9) { t_4ms=0; bPOWER=1; } } else t_4ms=0;}//--------------------T_INT Detect-----------------------------------//-------------------------------------------------------------------void T_INT_Detect(void){ if(!bRUNON) return; if(T_INT_PORT) {bT_HIGH=1;t2_4ms=0;} else { if(bT_HIGH) { while(!T_INT_PORT) { CLRWDT(); if(t2_4ms>1) {<!-- SIPO <DP n="9"> --><dp n="d9"/> lcd_pwrctr_1216[4] t2_4ms=0; bT_HIGH=0; bPOWER=1; return; } } } }}//---------------------Read EEPROM------------------------------//--------------------------------------------------------------void ReadEEPROM(void){ EEADR=0; RD=1;}//------------------Write EEPROM-----------------------//-----------------------------------------------------void WriteEEPROM(unsigned char value){ EEADR=0; EEDATA=value; WREN=1; GIE=0; EECON2=0x55; EECON2=0xaa; WR=1; GIE=1; while(WR)continue; WREN=0;}//---------------Power On------------------------//-----------------------------------------------void PowerOn(void){ bPOWER=0; RLY_ON_PORT=1; LED_PORT=0; GPIO5=1; bRUNON=1; WriteEEPROM(0xa5);}//------------ ----Standby-----------------------//------------------------------------------------void Standby(void){ bPOWER=0; RLY_ON_PORT=0; LED_PORT=1; GPIO5=0; bRUNON=0; WriteEEPROM(0);}//------------------Delay-----------------------------//----------------------------------------------------void Delay(unsigned char x,unsigned char y){ //delay time=14+(3*(Y-1)+7)*(X-1)unsigned char z; do { z=y; do{;} while(--z); } while(--x);<!-- SIPO <DP n="10"> --><dp n="d10"/> lcd_pwrctr_1216[4]}//----------------------Main Function----------------------------//---------------------------------------------------------------void main(void){ OSCCAL=READ_OSCCAL_DATA(); Init ial_RAM(); Initial_FSR(); CLRWDT(); ReadEEPROM(); if(EEDATA==0xa5) { RLY ON PORT=1; LED_PORT=0;<!-- SIPO <DP n="11"> --><dp n="d11"/> lcd_pwrctr_1216[4] while(t_Sec<3){CLRWDT();} //delay 3 second t_4ms=0; } }*/ goto Loop;}
權利要求
1.一種基于單片機的電視機低功耗待機控制方法,它以單片機控制待機電源的繼電器,其特征在于包括以下步驟
(1)單片機上電復位后,通過其GP0口檢測主芯片某腳的輸入電平狀態(tài),同時通過程序讀取E2PROM,檢測電視機在上次電源關閉時是處于“開機”還是“待機”狀態(tài);
(2)若為“待機”狀態(tài),則通過GP1口輸出高電平,驅動紅色指示燈亮,并執(zhí)行以下分步驟
①通過COUT口監(jiān)控來自遙控接收器的輸出信號,接收到“開機”信號后,通過GP4口輸出高電平,同時將GP1口電平拉低用以驅動藍色指示燈亮,并將當前開機狀態(tài)存儲到E2PROM;
②通過GP3口監(jiān)控來自按鍵的輸出信號,接收到“開機”信號后,執(zhí)行上述①步驟;
(3)若為“開機”狀態(tài),則通過GP1口輸出低電平驅動藍色指示燈亮,并執(zhí)行以下分步驟
①通過GP2口檢測來自遙控接收器的輸出信號,接收到“待機”信號后,同時讀取GP0口的輸入電平兩次,其間隔時間為10ms,若第一次為高電平,第二次為低電平,則通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM;
②同時調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應;
③對其它情況,程序不執(zhí)行任何操作;
④通過GP3口檢測來自按鍵的輸出信號,接收到“待機”信號后,執(zhí)行①~③步驟;
(4)在單片機工作的全過程中,GP0口一旦檢測到一個下降沿信號,無論有無來自遙控或按鍵的控制信號,都通過GP4口輸出低電平,同時將GP1口電平拉高驅動紅色指示燈亮,并將當前待機狀態(tài)存儲到E2PROM,同時要調用延時程序實現3秒鐘的延時,延時期間不對按鍵及遙控信號響應。
2.按照權利要求1所述的基于單片機的電視機低功耗待機控制方法,其特征在于所說的單片機為PIC12F675型。
全文摘要
一種基于單片機的電視機低功耗待機控制方法。包括檢測上次關閉時是“開機”還是“待機”;若為“待機”,通過COUT口監(jiān)控來自遙控接收器的輸出信號;接收到“開機”信號后,GP4口輸出高電平,藍色指示燈亮,并將當前開機狀態(tài)存儲;監(jiān)控來自按鍵的輸出信號;若為“開機”狀態(tài),則藍色指示燈亮,檢測來自遙控接收器的輸出信號,接收到“待機”信號后,間隔10ms讀取GP0口的輸入電平兩次,若兩次分別為高、低電平,驅動紅色指示燈亮,將當前待機狀態(tài)存儲;同時延時3秒;全過程中GP0口一旦檢測到下降沿信號,都通過GP4口輸出低電平,將當前待機狀態(tài)存儲、延時3秒等步驟。它待機電源功耗小,控制方法可將待機功耗降至0.3W。
文檔編號H04N5/63GK1885931SQ20061004478
公開日2006年12月27日 申請日期2006年6月12日 優(yōu)先權日2006年6月12日
發(fā)明者王立平, 施志峰, 徐愛臣, 孫有新 申請人:海信集團有限公司, 青島海信電器股份有限公司