先看芯片手册吧
这对电源及睡眠模式的一个简述,并介绍了进入模式时和唤醒之后的处理(第二段一定好好吸收哦)。
这是控制寄存器的设定进入不同模式的设定,根据需要进入不同的模式。
看到这里,也算了解了。
下面发段代码:
/**********************************************************
* 文 件 名 : main.c
* 描 述 : 低功耗模式的探究
* 创 建 人 : 夏玉峰
* 单 位 : 佳木斯大学 信息电子技术学院 电子协会
* 日 期 : 2012.12.9
* 开 发 环 境: 开发环境:ICCAVR 7.22
硬件平台:ATmega8
晶 振:8MHZ
* 邮 箱 : xiayufeng90520@163.com
* 版 本 号 : 1.00
**********************************************************/
#include
#include
#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指令后面的程序。
有很多不足,也为有兴趣的朋友,做个例子吧,一起学习一下吧。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』