AVR单片机电源管理_睡眠模式(低功耗模式)实验(基于ATmega8)

本文通过一个具体的ATmega8单片机实例,详细介绍了如何设置芯片进入低功耗模式并利用外部中断唤醒的方法。文章包括了必要的初始化代码、不同模式下的LED闪烁状态以及外部中断服务函数等内容。

先看芯片手册吧

这对电源及睡眠模式的一个简述,并介绍了进入模式时和唤醒之后的处理(第二段一定好好吸收哦)。

这是控制寄存器的设定进入不同模式的设定,根据需要进入不同的模式。

看到这里,也算了解了。

下面发段代码:

 

/**********************************************************
* 文  件  名 : main.c 
* 描      述 : 低功耗模式的探究
* 创  建  人 : 夏玉峰  
* 单      位 : 佳木斯大学 信息电子技术学院 电子协会 
* 日      期 : 2012.12.9
* 开 发 环 境: 开发环境:ICCAVR 7.22 
			   硬件平台:ATmega8
			   晶    振:8MHZ
* 邮      箱 : xiayufeng90520@163.com
* 版  本  号 : 1.00
**********************************************************/
#include<iom8v.h>
#include<macros.h>
#include"xiaofeng_delay.h"

/*******************************************
函数 名称: Port_Init
功     能: IO初始化
参     数: 无
返 回 值 : 无
/********************************************/
void Port_Init(void)
{
    PORTB = 0xFF;
    DDRB  = 0xFF;
	
	DDRD=0X00;
	PORTD=0XFF;
}

/*******************************************
函数 名称: Port_Init
功     能: IO初始化
参     数: 无
返 回 值 : 无
/********************************************/
void Power_Init(void)
{
	MCUCR |= 0X20;//掉电模式,外部中断0低电平触发
	GICR |= 0X40; //外部中断0使能
	SREG |= 0X80;//使能总中断
}
/*******************************************
函数 名称: Device_Init
功     能: 器件初始化
参     数: 无
返 回 值 : 无
/********************************************/
void Device_Init(void)
{
	Port_Init();       //IO端口初始化
	Power_Init();      //外部中断,省电模式,初始化
}

/*******************************************
函数 名称: main
功     能: 主函数
参     数: 无
返 回 值 : 无
/********************************************/
void main(void)
{
	unsigned char i;
	Device_Init();
	
	while(1)
	{
		 for (i=0;i<10;i++)
		{
			PORTB &= ~BIT(1);
			delay_nms(300);
			PORTB |= BIT(1);
			delay_nms(300);
		}
		 MCUCR |= 0x80;       //使能休眠
		 asm("sleep");
		 for (i=0;i<10;i++)
		{
			PORTB &= ~BIT(2);
			delay_nms(300);
			PORTB |= BIT(2);
			delay_nms(300);
		}
	}
}
/*******************************************
函数名称: void int0_isr(void)
功    能: 外部中断0的服务函数
参    数: 无
返 回 值: 无
/********************************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
	unsigned char i;
	for (i=0;i<10;i++)
	{
		PORTB &= ~BIT(0);
		delay_nms(300);
		PORTB |= BIT(0);
		delay_nms(300);
	}
}


进入程序首先执行第二个灯闪烁,

闪烁停止,说明进入睡眠模式,

摁下按键,第一个灯开始闪烁,说明单片机被唤醒,进入外部中断服务函数,

第三个灯开始闪烁,说明中断服务函数执行完毕,执行SLEEP指令后面的程序。

有很多不足,也为有兴趣的朋友,做个例子吧,一起学习一下吧。

 

 

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值