非常感谢以上几位朋友能在百忙中看一下我目前遇到的问题,并给出宝贵的意见。今天由于早下班有时间将程序修改了一下,改用一个按键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在何种情形下,才能被唤醒呢? 弄清以上两个问题,就解了。 |