|
發布時間: 2022-11-17 15:28
正文摘要:最近有空剛學習掉電喚醒這一塊,用遙控器能讓單片機進入掉電模式,此時能控制P54腳輸出的PWM停止不輸出,但P54腳有時為高電平,有時也為低電平。P32腳(P32腳接接收頭IR)在進入掉電模式時 ... |
|
非常感謝以上幾位朋友能在百忙中看一下我目前遇到的問題,并給出寶貴的意見。今天由于早下班有時間將程序修改了一下,改用一個按鍵K1接P32來控制(按鍵K1一腳按P32,另一腳接地)進入掉電模式和喚醒。長按進入掉電模式,短按喚醒單片機。功能現在是能實現了,短按喚醒單片機沒有問題,一按就立馬實現。長按進入掉電模式有一點小問題,有1/3的時候不能實現,也就是3次有可能有1次不能進入掉電模式,看波形情況是按下去P54腳沒有波形,松開就有波形,再按1到2次就可以了。搞了一個多小時還沒有好,請朋友們看下問題出在哪里? #include "STC8xxxx.H" #include "pwm.h" #include "38KHZ.h" //#include "IR.h" #define IDL 0x01 //PCON.0 IDLE(空閑)模式控制位 #define PD 0x02 //PCON.1 時鐘停振模式/掉電模式/停電模式 控制位 sbit k1 =P3^2;//STC8G1K08A此腳為外部中斷INT0,在非掉電模式下做按鍵用,按一次改變一次狀態。 u16 jishu=0,ksj=0; //void IR_RX_NEC(void); void INT0_Isr() interrupt 0 { //P32 = !P32; //測試端口 EA=1; IT0=1; EX0=1; PCON=0x00; } void timer0 (void) interrupt 1 { TL0 = 0xE0; //設置定時初始值 TH0 = 0xB1; //設置定時初始值 jishu++; } void main(void) { P3M0 = 0x00; P3M1 = 0x00; P3PU |= 0x04; P5M0 = 0x00; P5M1 = 0x00; pwm_int() ; hwKHZ_int(); AUXR |= 0x80; //定時器時鐘1T模式 TMOD &= 0xF0; //設置定時器模式 TL0 = 0xE0; //設置定時初始值 TH0 = 0xB1; //設置定時初始值 TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 ET0 = 1; EA = 1; while(1) { if(jishu==10) //如果到了10次,說明10ms秒時間 { if(k1==0) { // ksj++; if(1000>ksj>200) //長按按鍵標志 ksj=0; IE0 = 0; //將INT0中斷請求標志位清"0" IT0 = 1; //使能INT1 0 上升沿和下降沿中斷 1下降沿中斷 EX0 = 1; //使能INT1中斷 EA = 1; PCON = 0x02; //MCU進入掉電模式 _nop_(); //掉電模式被喚醒后,MCU首先會執行此語句 //手冊中寫到,喚醒會執行中斷命令后一條語句之后轉向中斷 //然后再進入中斷服務 _nop_(); _nop_(); _nop_(); _nop_();// _nop_(); _nop_(); } jishu=0; //重新計數 } if (P5^5==0) { pwm = PWM_DUTY *4.4/ 10; //給PWM一個初值,這里為44%占空比 LoadPWM(pwm); } else { pwm = PWM_DUTY *8.3/ 10; //給PWM一個初值,這里為83%占空比 LoadPWM(pwm); //計算PWM重裝值 } } } |
| 目前我覺得還可以,可以接雙探頭,測PWM波形,遙控器波形還是很方便的,可以保存波形,目前我只用到這些,也很方便攜帶。 |
| 請教一下樓主,這個示波器用起來怎樣? |
|
進入睡眠(掉電)模式前,先關閉PWM,并將IO輸出確定的電平,否則睡眠時關閉時鐘,PWM會停止,此時可能高也可能低。 睡眠不會影響任何IO的狀態,也不影響內存,所以睡眠前一定要處理好IO。 |
|
|
CPU掉電喚醒與遙控器控制無關! 何為【掉電】先說一說?CPU在何種情形下,是你所說的【掉電】呢? 何為【喚醒】再說一說?CPU在何種情形下,才能被喚醒呢? 弄清以上兩個問題,就解了。 |