STC8A8K64D4低功耗,外部中断唤醒测试

LVDF:低压检测标志位.当系统检测到低压事件时,硬件自动将此位置 1,并向 CPU 提出中断请求. 此位需要用户软件清零.

POF:上电复位标志位.MCU 每次重新上电后,硬件自动将此位置 1,可软件将此位清零.

PD:时钟停振模式/掉电模式/停电模式控制位

        0:无影响

        1:单片机进入时钟停振模式/掉电模式/停电模式,CPU 以及全部外设均停止工作.唤醒后硬件自动 清零.(注:时钟停振模式下,CPU 和全部的外设均停止工作,但 SRAM 和 XRAM 中的数据是 一直维持不变的)

IDL:IDLE(空闲)模式控制位

        0:无影响

        1:单片机进入 IDLE 模式,只有 CPU 停止工作,其他外设依然在运行.唤醒后硬件自动清零

注:虽然 LVD 和比较器均可唤醒时钟停振模式化,但时钟停振省电模式下,不建议启动 LVD 和比 较器,否则硬件系统还会自动启动内部 1.19V 的高精准参考源,这个高精准参考源有有相应的抗温漂和 调校线路,大约会额外增加 300uA 的耗电,而 MCU 进入时钟停振模式后,3.3V 工作电压时只耗约 0.4uA 的电流,所以进入时钟停振模式时不建议开 LVD 和比较器.如果确实需要用,建议开启掉电唤醒定时器, 掉电唤醒定时器只会增加约 1.4uA 的耗电,这个耗电一般系统是可以接受的.让掉电唤醒定时器每 5 秒 唤醒一次 MCU,唤醒后可用 LVD,比较器, ADC 检测外部电池电压,检测工作约耗时 1mS 后再进入 时钟停振/省电模式,这样增加的平均电流小于 1uA,则整体功耗大约为 2.8uA(0.4uA + 1.4uA + 1uA).

#include "reg51.h"
#include "intrins.h"

//测试工作频率为11.0592MHz

sfr INTCLKO = 0x8f; 
#define EX2 0x10 
#define EX3 0x20 
#define EX4 0x40 

sbit P10 = P1^0; 
sbit P11 = P1^1; 

sfr P0M1 = 0x93; 
sfr P0M0 = 0x94; 
sfr P1M1 = 0x91; 
sfr P1M0 = 0x92; 
sfr P2M1 = 0x95; 
sfr P2M0 = 0x96; 
sfr P3M1 = 0xb1; 
sfr P3M0 = 0xb2; 
sfr P4M1 = 0xb3; 
sfr P4M0 = 0xb4; 
sfr P5M1 = 0xc9; 
sfr P5M0 = 0xca;

//中断触发后会自动唤醒,需要用哪个中断唤醒就开启哪个中断,不需要的删掉即可
void INT0_Isr() interrupt 0  
{ 
	P10 = ! P10; 

} 
void INT1_Isr () interrupt 2 
{
	P10 =! P10;
	
} 
void INT2_Isr () interrupt 10 
{
	P10 =! P10; 
} 
void INT3_Isr () interrupt 11 
{
	P10 =! P10;
	
} 
void INT4_Isr () interrupt 16 
{
	P10 =! P10; 
}

void main() 
{ 
	static unsigned long msecond=0;
	
	
	P0M0 = 0x00; 
	P0M1 = 0x00; 
	P1M0 = 0x00; 
	P1M1 = 0x00; 
	P2M0 = 0x00; 
	P2M1 = 0x00; 
	P3M0 = 0x00; 
	P3M1 = 0x00; 
	P4M0 = 0x00; 
	P4M1 = 0x00; 
	P5M0 = 0x00; 
	P5M1 = 0x00; 
	
	IT0 = 0; //使能 INT0 上升沿和下降沿中断 
	//IT0 = 1; //使能 INT0 下降沿中断 
	EX0 = 1; //使能 INT0 中断 
	
	IT1 = 0; //使能 INT1 上升沿和下降沿中断 
	//IT1 = 1; //使能 INT1 下降沿中断 
	EX1 = 1; //使能 INT1 中断 
	
	INTCLKO = EX2; //使能 INT2 下降沿中断 
	INTCLKO |= EX3; //使能 INT3 下降沿中断 
	INTCLKO |= EX4; //使能 INT4 下降沿中断 
	
	EA = 1; 
	
	 P10 =0;
	
	PCON = 0x02; //MCU 进入掉电模式 
	
	_nop_(); //掉电模式被唤醒后,MCU 首先会执行此语句 
			 //然后再进入中断服务程序 
	_nop_();
	
	_nop_();
	
	_nop_();
	
	while(1) 
	{ 
		 P11 =0;//进入程序后常亮绿灯
		
		 if(++msecond >= 500000)//5S后进入休眠
		 {
			 P11 =1;
			 P10 =1;
			 msecond=0;
			  
			 PCON = 0x02; //MCU 进入掉电模式 
			
		 }			 
	}
	
}

现象效果:初始化完成后进入休眠,按下按键触发中断后唤醒灯常亮,5S灯会熄灭再次进入休眠

video(5)

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值