电源管理特殊功能寄存器 PCON
介绍:
CMOS 型的MCS-51单片机 具有空闲和掉电两种低功耗方式,其中空闲状态也称作cpu睡眠状态
PCON 字节地址是0x87
有6个功能位:SMOD X X X GF1 GF0 PD IDL
SMOD:波特率加倍位
GF1,GF0:通用标志位
PD,IDL:低功耗工作方式选择控制位
PD |
PD |
单片机状态 |
特点 |
0 |
0 |
正常工作状态 |
cpu正常工作 |
0 |
1 |
空闲状态(cpu睡眠状态) |
cpu停止工作睡眠,其他都正常 |
1 |
0 |
掉电方式 |
其他都停止工作,变量,特殊功能寄存器值不变,P0-P3口输出状态不变 |
注意点:
1.单片机复位后为0x00,单片机处于正常工作
2.PCON的位是无位状态,不能用位访问方式将PCON某个位置1或0清0,只能用按位操作置1,清0或者取反
睡眠cpu:PCON = PCON|0X01 或者 PCON |=0X01
掉电状态:PCON = PCON|0X02 或者 PCON |=0X02
最好不要用赋值等号,可能会导致串行口不正常
解除方法:不能使用软件解除,只能依赖硬件
(1)解决掉电方式-》硬件复位 //全部初始化
(2)退出空闲状态方式-》1.用中断唤醒cpu 2.复位单片机
代码实现: 进入cpu睡眠方式
1.查询方式
//任务7 睡眠CPU(查询方式) #include <reg51.h> //1 将特殊功能寄存器定义头文件reg51.h包含至本程序中 #define uchar unsigned char //2 宏定义:uchar代表unsigned char #define ledport P2 //3 宏定义:ledport代表P2 uchar idata keycnt; //4 在idata区定义全局变量keycnt(按键计数器) void main(void) //5 main函数 { keycnt=0; //6 按键计数器初始化:初值为0 IT0=1; //7 外部中断0的触发方式为下降沿触发 while(1) //8 while死循环,语句9~14是while的循环体 { if(IE0) //9 有键按下吗? { IE0=0; //10 IE0位清0。 keycnt++; //11 按键计数值加1 } //12 if语句块结束 ledport=~keycnt; //13 计数值按位取反后送led控制口显示 //------------------相对任务6查询方式增加的语句------------------- PCON|=0x01; //14 睡眠CPU //----------------------------------------------------------------- } //15 while循环体结束 } //16 main函数结束
2.中断方式
//任务7 睡眠CPU(中断方式) #include <reg51.h> //1 包含特殊功能寄存器定义头文件reg51.h #define ledport P2 //2 宏定义:ledport代表P2(发光二极管接P2口) #define uchar unsigned char //3 宏定义:uchar代表unsigned char uchar idata keycnt; //4 定义全局变量,keycnt在中断服务函数和main中均可使 void count() interrupt 0 using 1//5 定义中断服务函数:中断号为0,用第1组寄存器组 { keycnt++; //6 按键计数值加1 ledport=~keycnt; //7 按键计数值送led口显示 } //8 中断服务函数结束 void main(void) //9 main函数 { keycnt=0; //10 按键计数值初始化:赋初值0 IT0=1; //11 设置外部中断0的触发方式:下降沿触发 EX0=1; //12 开外部中断0 EA=1; //13 开全局中断 while(1); //14 死循环,语句15为循环体 //------------------相对任务6中断方式增加的语句------------------ { PCON|=0x01; } //15 睡眠CPU //---------------------------------------------------------------- } //16 main函数结束
c51中的存储类型
code :程序存储区(64KB),
data :可直接寻址的内部数据存储区(128B)
idata:不可直接寻址的内部数据存储区(256B)
bdata:可位寻址内部数据存储区(16B)
xdata:外部数据存储区(64KB)
pdata:分页的外部数据存储区