2
14
46
新手上路
使用道具 举报 送花
22
422
1906
金牌会员
DIY玩家
1363
7384
论坛元老
狂热*** 发表于 2026-3-31 13:43 常见应用 定时进入休眠 无操作进入休眠
angm*** 发表于 2026-3-31 13:57 //11.5.5 INT2 中断(下降沿) ,只支持下降沿中断 //C 语言代码 //测试工作频率为 11.0592MHz
3
115
561
高级会员
//测试功能:加电即睡眠,按键即外部中断2唤醒,短按LED亮灭演示操作,长按进入睡眠。 //适合STC15/STC8系列 //#include <STC15F2K60S2.H> #include <STC8G.H> #include "intrins.h" #define uchar unsigned char #define uint unsigned int sbit key = P5^4; sbit LED = P5^5; uchar Key_value; //键值 uint keyTim; //按键时长 bit flag1ms; //1ms中断标志 bit on_off; //开关标志 bit allow; //允许关机标志 void Timer0Init(void)//1毫秒@11.0592MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器自动重载模式 TL0 = 0xCD; //设置定时初始值 TH0 = 0xD4; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //允许T0中断 // EA = 1; //开总中断 } void Delay20ms() //@11.0592MHz { unsigned char i, j; i = 216; j = 37; do { while (--j); } while (--i); } void key_scan() //按键扫描函数 { if(flag1ms) //1ms时间标志 { flag1ms = 0;//1ms时间标志清0 if(!key && !on_off) { if(++keyTim>1000)keyTim=1001;//防止溢出 if(keyTim==20) //大于20ms小于1s算短按 { Key_value=0x01; } if(keyTim==1000) //达到1s算长按 { Key_value|=0x10; } } else { keyTim=0; //按键松手keyTim清0 } } } void key_service()//按键服务函数 {//短按等松手响应,长按达1s不论是否松手即响应 if((keyTim==0||keyTim==1000) && Key_value!=0x00) { if(Key_value==0x01)//短按任务 { LED=~LED; } if(Key_value==0x11)//长按关机 { allow=1;//允许休眠 } Key_value=0x00;//任务完成后键值清0 } } void Shutdown()//掉电模式函数 { if(allow) { //关闭所有在用硬件,减小能耗 while(!key);//等待按键松手 Delay20ms();//消抖防止误动作 INTCLKO |= 0x10;//使能INT2中断 PCON = 0x02;//MCU进入掉电模式 /************************************************/ _nop_(); //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序 _nop_(); //中断服务程序执行完再接着此句继续执行 while(!key);//等待按键松手,防止按键扫描程序误读 Delay20ms();//消抖防止误动作 //打开所有在用硬件,恢复正常运行 allow=0; //清0 on_off=0; //开关标志清0 LED=0; //恢复LED显示 } } void main() { P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; INTCLKO |= 0x10;//使能INT2中断 Timer0Init();//定时器0初始化函数 EA = 1; //使能总中断 PCON = 0x02; //MCU进入掉电模式 _nop_(); _nop_(); _nop_(); _nop_(); while (1) { key_scan(); //按键扫描函数 key_service(); //按键服务函数 Shutdown(); //掉电模式函数 } } //INT2中断服务程序 void INT2_Isr() interrupt 10 { INTCLKO &= 0xef; //关闭INT2中断 on_off=1; //开关标志置1 } //T0中断服务程序 void interruptTimer0() interrupt 1 { flag1ms = 1; //1ms标志 } 复制代码
wul*** 发表于 2026-4-5 13:44 将INT0中断唤醒程序改成INT2中断唤醒
hao*** 发表于 2026-4-7 14:00 进去就是灯长亮,按下P54键没没变呢
#include <STC8G.H> sbit LED=P5^5; void INT2_Isr() interrupt 10 { } void main() { P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; INTCLKO = 0x10;//使能INT2下降沿中断 EA = 1; while (1) { LED = ~LED; PCON = 0x02;//MCU进入掉电模式 _nop_(); _nop_(); _nop_(); _nop_(); } } 复制代码
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2026-5-9 05:41 , Processed in 0.123654 second(s), 85 queries .
Powered by Discuz! X3.5
© 2001-2026 Discuz! Team.