5--51单片机的休眠模式(又叫掉电模式、停机模式)的应用

5--51单片机的休眠模式(又叫掉电模式、停机模式)的应用

1、个人总结单片机省电的两个模式的使用:

单片机正常工作时的功耗通常是4mA~7mA,进入空闲模式是其功耗降至2mA,进入掉电模式是的功耗可降至0.1uA以下。

当单片机进入空闲模式时,只有CPU处于休眠状态,其他硬件全部都处于活动状态,芯片内部程序所设计的寄存器都保持原值。

当单片机进入掉电模式时,外部晶振停振,CPU,定时器、串行口全部停止工作,只有外部中断继续工作。同样芯片内部程序所设计的寄存器都保持原值。

值得注意的是,两者使用中断唤醒单片机时,程序从原来停止处继续运行;当使用硬件复位唤醒单片机时,程序将从头开始执行。

2、怎样退出休眠模式?

a.可将CPU从休眠模式唤醒的外部管脚有:外部中断0、外部中断1、定时器0、定时器1、RxD、PWM0/PCA0/P3.7、PWM2/PCA2/P2.0、PWM3/PCA3/P2.4

b.外部复位也可以将MCU从掉电模式中唤醒,复位唤醒后的MCU将从用户程序的0000H处开始正常工作。

控制单片机进入空闲模式和休眠模式的是电源管理寄存器PCON,这个寄存器的最低两位,IDL和PD这两位分别用来设定是否使单片机进入空闲模式和掉电模式。

将IDL/PCON.0置为1,则单片机就进入了空闲(IDLE)模式

将PD/PCON.1置为1,则单片机将进入掉电(Power Down)模式

运行效果图:

运行视频:(当数码管走到5时,就自动停止,需要外部中断0才能激活程序,数码管继续运行下去)

http://v.youku.com/v_show/id_XMjA4NjM0NTky.html

【例】:开启两个外部中断,设置低电平触发中断,用定时器计数并且显示在数码管的前两位,当计到5时,使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启定时器。

程序代码如下:

/************************************************************************

作者:小齐~

说明:开启两个外部中断,设置低电平触发中断,

用定时器计数并且显示在数码管的前两位,当计到5时,

使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,

从空闲(休眠)模式返回,同时开启定时器

************************************************************************/

/*************头文件专区*************/

#include //单片机52头文件,存放着单片机的寄存器

/*************宏定义专区*************/

#define uint unsigned int

#define uchar unsigned char

/*************变量定义专区*************/

uchar code table0[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管字型码

uchar code table1[6]={0xf8,0xf4,0xec,0xdc,0xbc,0x7c}; //位选数码管数组

uchar num;//定时计数

/*************函数申明专区*************/

void delay_ms(uint z); //1ms延时

void timer0_init(void); //定时器初始化函数

void EX_init(void); //外部中断初始化函数

void display(uchar shi,uchar ge); //数码管显示

/********************************

*函数名称:main

*输入:无

*输出:无

*功能说明:主函数

*********************************/

void main(void)

{

uchar num1,a,b; //定义局部变量

timer0_init(); //定时器初始化

EX_init(); //外部中断初始化

EA=1; //开总中断

while(1)

{

if(++num>=100)

{

num=0;

num1++;

if(num1==6)

{

ET0=0; //关定时器

PCON=0X02; //PD=1,进入掉电模式

//或 PCON=0X01;//IDL=1,进入空闲模式

}

a=num1/10; //十位

b=num1%10; //个位

}

display(a,b); //显示

}

}

/********************************

*函数名称:delay_ms

*输入:uint z延时时间

*输出:无

*功能说明:毫秒级延时

*********************************/

void delay_ms(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

/********************************

*函数名称:display

*输入:shi 十位,ge 个位

*输出:无

*功能说明:数码管显示计数值

*********************************/

void display(uchar shi,uchar ge)

{

P2=table1[1]; //显示位

P0=table0[shi]; //显示百位

delay_ms(3);

P2=table1[0]; //显示位

P0=table0[ge]; //显示百位

delay_ms(3);

}

/********************************

*函数名称:time0_int

*输入:无

*输出:无

*功能说明:定时器0初始化,50ms

*********************************/

void timer0_init(void)

{

TMOD=0X01; //定时器工作方式设置为,定时器0,方式1

TH0=(65536-50000)/256; //计数寄存器高8位

TL0=(65536-50000)%256; //计数寄存器低8位

TR0=1; //开启定时器0运行

ET0=1; //开定时器0中断

}

/********************************

*函数名称:EX_init

*输入:无

*输出:无

*功能说明:外部中断初始化

*********************************/

void EX_init(void)

{

EX0=1; //开外部中断0

EX1=1; //开外部中断1

}

/********************************

*函数名称:EX0_IRQ

*输入:无

*输出:无

*功能说明:外部中断0中断服务程序

*********************************/

void EX0_IRQ(void) interrupt 0

{

PCON=0;//清除之前的掉电(空闲)模式

ET0=1; //开定时器0

}

/********************************

*函数名称:EX1_IRQ

*输入:无

*输出:无

*功能说明:外部中断1中断服务程序

*********************************/

void EX1_IRQ(void) interrupt 2

{

PCON=0; //清除之前的掉电(空闲)模式

ET0=1; //开定时器0

}

/********************************

*函数名称:Time0_IRQ

*输入:无

*输出:无

*功能说明:定时器0中断服务程序

*********************************/

void Time0_IRQ(void) interrupt 1

{

TH0=(65536-50000)/256; //计数寄存器高8位重载

TL0=(65536-50000)%256; //计数寄存器低8位重载

num++;

}

说明:用万用表串接入电路中,可发现:正常工作电流>空闲模式电流>掉电模式电流

相关文章

怎么在手机上查车辆违章查询
365骑士版app下载

怎么在手机上查车辆违章查询

⌛ 07-17 👁️‍🗨️ 877
欹湖原文、翻译及赏析、拼音版及朗读
365骑士版app下载

欹湖原文、翻译及赏析、拼音版及朗读

⌛ 07-21 👁️‍🗨️ 7160
如何去接软件开发项目
bat365台湾入口

如何去接软件开发项目

⌛ 07-09 👁️‍🗨️ 9565
三星GALAXY On7怎么样 三星On7全方位手机评测
365骑士版app下载

三星GALAXY On7怎么样 三星On7全方位手机评测

⌛ 07-04 👁️‍🗨️ 4631
明日之后采矿机怎么开采 明日之后采矿机任务完成技巧
步步高怎么下载游戏?这份教程新手一看就会!
365骑士版app下载

步步高怎么下载游戏?这份教程新手一看就会!

⌛ 06-30 👁️‍🗨️ 6270