咱们知道单片机内部有一个电源办理寄存器PCON,这个寄存器的最低两位,IDL和PD这两位别离用来设定是否使单片机进入闲暇形式和掉电形式。
1.闲暇形式
当单片机进入闲暇形式时,除CPU处于休眠状况外,其他硬件悉数处于活动状况,芯片中程序未涉及到的数据存储器和特别功用寄存器中的数据在闲暇形式期间都将坚持原值。但假若定时器正在运转,那么计数器寄存器中的值还将会添加。单片机在闲暇形式下可由任一个中止或硬件复位唤醒,需求留意的是,运用中止唤醒单片机时,程序从本来中止处持续运转,当运用硬件复位唤醒单片机时,程序将从头开端履行。
让单片机进入闲暇形式的意图一般是为了下降体系的功耗,举个很简单的比如,咱们都用过数字万用表,在正常运用的时分表内部的单片机处于正常作业形式,当不用时,又忘记了关掉万用表的电源,大多数表在等候数分钟后,若没有人为操作,它便会主动将液晶显现封闭,以下降体系功耗,一般相似这种功用的完结便是运用了单片机的闲暇形式或是掉电形式。以STC89系列单片机为例,当单片机正常作业时的功耗一般为4mA~7mA,进入闲暇形式时其功耗降至2mA,当进入掉电形式时功耗可降至0.1μA以下。
2.休眠形式
当单片机进入掉电形式时,外部晶振停振、CPU、定时器、串行口悉数中止作业,只要外部中止持续作业。使单片机进入休眠形式的指令将成为休眠前单片机履行的最终一条指令,进入休眠形式后,芯片中程序未涉及到的数据存储器和特别功用寄存器中的数据都将坚持原值。可由外部中止低电平触发或由下降沿触发中止或许硬件复位形式换醒单片机,需求留意的是,运用中止唤醒单片机时,程序从本来中止处持续运转,当运用硬件复位唤醒单片机时,程序将从头开端履行。
下面的比如演示单片机进入闲暇和休眠形式,而且演示出从闲暇和休眠形式中唤醒的进程。
【例】:在TX-1C试验板上完结如下描绘,敞开两个外部中止,设置低电平触发中止,用定时器计数而且显现在数码管的前两位,当计到5时,使单片机进入闲暇(休眠)形式,一起封闭定时器,当单片机呼应外部中止后,从闲暇(休眠)形式回来,一起敞开定时器。
新建文件part3.4.1.c,程序代码如下:
#include//52系列单片机头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//声明U1锁存器的锁存端
sbitwela=P2^7;//声明U2锁存器的锁存端
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
ucharnum;
voiddelayms(uint);
voiddisplay(ucharshi,ucharge)//显现子函数
{
dula=1;
P0=table[shi];//送十位段选数据
dula=0;
P0=0xff;//送位选数据前封闭一切显现,避免翻开位选锁存时
wela=1;//本来段选数据通过位选锁存器形成紊乱
P0=0xfe;//送位选数据
wela=0;
delayms(5);//延时
dula=1;
P0=table[ge];//送个位段选数据
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
voiddelayms(uintxms)
{
uinTI,j;
for(i=xms;i》0;i–)//i=xms即延时约xms毫秒
for(j=110;j》0;j–);
}
voidmain()
{
uchara,b,num1;
TMOD=0x01;//设置定时器0为作业方式1(00000001)
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
EX0=1;
EX1=1;
TR0=1;
while(1)
{
if(num》=20)
{
num=0;
num1++;
if(num1==6)
{
ET0=0;
PCON=0x02;(或PCON=0x01;)
}
a=num1/10;
b=num1%10;
}
display(a,b);
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
voidex_int0()interrupt0
{
PCON=0;
ET0=1;
}
voidex_int1()interrupt2
{
PCON=0;
ET0=1;
}
剖析:
(1)EA=1;开总中止
ET0=1;开定时器0中止
EX0=1;开外部中止0
EX1=1;开外部中止1
TR0=1;发动定时器0
(2)主程序中有“ET0=0;”下句是“PCON=0x02;”意思是在进入休眠形式之前要先把定时器封闭,这样方可一向等候外部中止的发生,假如不封闭定时器,定时器的中止相同也会唤醒单片机,使其退出休眠形式,这样咱们便看不出进入休眠形式和回来的进程。
(3)voidex_int0()interrupt0
{
PCON=0;
ET0=1;
}
这是外部中止0服务程序,当进入外部中止服务程序后,首先将PCON中原先设定的休眠操控位铲除(假如不铲除,程序也能够正常运转,咱们最好亲身做试验验证),接下来再从头敞开定时器0。
(4)下载程序后,试验现象如下:数码管从“00”开端递加显现,到“05”后,再过一秒后,数码管变成只显现一个“5”,单片机进入休眠或闲暇形式,用导线一端连接地,另一端触摸P3.2或P3.3,数码管从头从“06”开端显现,递加下去。整个进程演示了单片机从正常作业形式进入休眠形式或闲暇形式,然后再从休眠形式或闲暇形式回来到正常作业形式。
(5)测验进程咱们可将数字万用表调理到电流档,然后串接入电路中,调查单片机在正常作业形式、休眠形式、闲暇形式下流过体系的总电流改变状况,经测验可发现成果如下:正常作业电流》闲暇形式电流》休眠形式电流。