单片机的电源选项

发布者:科技奇思最新更新时间:2017-01-09 来源: eefocus关键字:单片机  电源选项 手机看文章 扫描二维码
随时随地手机看文章

单片机的空闲和掉电模式的应用

注意:电源管理寄存器PCON,它的最低两位IDL和PD分别用来设定是否单片机进入空闲模式和掉电模式

因此,单片机进入掉电模式只需要PCON= 0x01;进入空闲模式只需要PCON = 0x02;

空闲模式:

单片机进入空闲模式的时候,除了cpu处于休眠状态外,其余的硬件全部处于活动状态,芯片中未涉及的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值

单片机在空闲模式下可由任何一个中断或者是硬件复位唤醒,值得注意的是,使用中断唤醒单片机,程序将从原来的停止的地方继续运行,当使用硬件复位时,程序将从头开始执行

 

掉电模式:

当单片机进入掉电模式(也叫休眠模式)外部晶振停止震动,cpu,定时器,串口全部停止工作,只有外部中断继续工作,使单片机进入掉电模式的指令将成为休眠前单片机工作的最后一条指令,值得注意的是,使用中断唤醒单片机,程序将从原来的停止的地方继续运行,当使用硬件复位时,程序将从头开始执行

示例代码:(此代码实现,在单片机上开启两个外部中断,设置为低电平触发,用定时器计数并且显示在数码管的前两位,当计数到5时,单片机进入空闲或者是休眠模式,当单片机响应外部中断时,从休眠模式(空闲模式)返回 ,并同时启动定时器

错误代码:


#include

#define uint unsigned int

#define uchar unsigned char 


sbit dula = P2^6;

sbit wela = P2^7;

uchar num ,gw,sw,aa;

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

                    0x7f,0x6f,0x77,0x7c,

                    0x39,0x5e,0x79,0x71};


void init()//初始化函数

{

    TMOD = 0x01;

    TH0 = (65535-50000)/256;

    TL0 = (65535-50000)%256;


    EA = 1;

    ET0 = 1;

    

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

//    IT0 = 0;//电平触发方式

    

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

//    IT1 = 0;

    TR0 = 1;



}


void delayms(uint x)//延时函数

{

    uint i,j;

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

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

}


void display(uchar gw,uchar sw)//显示函数

{

    dula = 1;

    P0 = table[sw];

    dula = 0;


    P0 = 0xff;

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    delayms(5);


    P0 = 0x0;//消影

    dula = 1;

    P0 = table[gw];

    dula = 0;


    P0 = 0xff;

    wela = 1;

    P0 = 0xfd;

    wela = 0;

    delayms(5);


}


void main()

{

    init();

    while(1)

    {

        

        display(gw,sw);

    }

}


void timer0()interrupt 1

{

    TH0 = (65536-50000)/256;

    TL0 = (65536-50000)%256;

    aa ++;

    if(aa ==20)

        {

            aa =0;

            num++;

            if(num == 99)

                num =0;

            gw = num%10;

            sw = num/10;

            if(num == 6)

                {

                

                    ET0 = 0;//关闭定时器

                    PCON = 0x01;//单片机进入空闲模式

                }

        }


}


void ex_int0()interrupt 0

{

//    PCON = 0;//可要可不要

    ET0 =1;

}


void ex_int1()interrupt 2

{

//    PCON = 0;//可要可不要

    ET0 = 1;

}

正确代码:

#include

#define uint unsigned int

#define uchar unsigned char 


sbit dula = P2^6;

sbit wela = P2^7;

uchar num ,gw,sw,aa;

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

                    0x7f,0x6f,0x77,0x7c,

                    0x39,0x5e,0x79,0x71};


void init()//初始化函数

{

    TMOD = 0x01;

    TH0 = (65535-50000)/256;

    TL0 = (65535-50000)%256;


    EA = 1;

    ET0 = 1;

    

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

//    IT0 = 0;//电平触发方式

    

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

//    IT1 = 0;

    TR0 = 1;



}


void delayms(uint x)//延时函数

{

    uint i,j;

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

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

}


void display(uchar gw,uchar sw)//显示函数

{

    dula = 1;

    P0 = table[sw];

    dula = 0;


    P0 = 0xff;

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    delayms(5);


    P0 = 0x0;//消影

    dula = 1;

    P0 = table[gw];

    dula = 0;


    P0 = 0xff;

    wela = 1;

    P0 = 0xfd;

    wela = 0;

    delayms(5);


}


void main()

{

    init();

    while(1)

    {

        if(aa ==20)

        {

            aa =0;

            num++;

            if(num == 99)

                num =0;

            gw = num%10;

            sw = num/10;

            if(num == 6)

                {

                

                    ET0 = 0;//关闭定时器

                    PCON = 0x01;//单片机进入空闲模式

                }

        }

        display(gw,sw);

    }

}


void timer0()interrupt 1

{

    TH0 = (65536-50000)/256;

    TL0 = (65536-50000)%256;

    aa ++;


}


void ex_int0()interrupt 0

{

//    PCON = 0;//可要可不要

    ET0 =1;

}


void ex_int1()interrupt 2

{

//    PCON = 0;//可要可不要

    ET0 = 1;

}

错误代码中,把

if(aa ==20)

        {

            aa =0;

            num++;

            if(num == 99)

                num =0;

            gw = num%10;

            sw = num/10;

            if(num == 6)

                {

                

                    ET0 = 0;//关闭定时器

                    PCON = 0x01;//单片机进入空闲模式

                }

        }


这部分代码放在了定时器0的中断函数中,没有放在主函数中,导致外部中断无法响应,单片机无法从掉电模式或者是休眠模式中醒来

实验现象:数码管从00计数到05,之后进入休眠,数码管显示5,之后来一个外部中断,从5继续计数


关键字:单片机  电源选项 引用地址:单片机的电源选项

上一篇:STC51系列单片机免掉电下载(热启动下载)
下一篇:代码调试之串口调试2

推荐阅读最新更新时间:2024-03-16 15:29

逻辑门数要求更高的嵌入式应用是FPGA定位的主战场
        据Semico Reserch资深分析师Tony Massimini介绍,2010年,微逻辑组件(微处理器、微控制器和DSP)的销售额劲升了24.9%。但这是因为相比于2009年的灾难性的衰退所致。在相对稳定的销售环境下,预计2011年有望再成长12%。   出货量方面,微逻辑组件2010年将增长36.3%,而2009年下降了10.4%。微逻辑营业额由微处理器和计算市场主导,数量上来看,主要来自MCU。2010年,MCU营业额增长了32%左右,数量增长40%左右。增长涵盖所有微控制器部分—8、16和32位。这比一年前所预测的增长更快,这是由于一些领域的复苏和增长,例如汽车方面有新增长,工业控制也在持续增长,虽然
[嵌入式]
基于单片机数字转速计的设计
引 言    在工业控制中经常要进行转速测量,一般采用的是接触式转速计,这种转速计必须顶在转轴中心才能进行测量,使用起来不方便,而且局限性很大,安全性也不是很好。因此,我们设计了采用光电传感器的非接触式转速计,测量范围从1.0~9999转/分钟,四位数码管显示,当被测转速小于1000转/分钟时,精确到0.1转/分钟。 1 测量原理 在被测旋转轴上贴一片铝箔作为反光体,当反光体转到光电传感器的正前方时,光电传感器发出的红外光束被反射回来,同时被光电传感器上的红外接收管接收,产生一个脉冲信号,我们利用这个信号的边沿触发单片机内部的高精度定时器进行计时,精度可达1μs,当反光体再次转到光电传感器的正前方时,利用光反射信号的边
[单片机]
基于<font color='red'>单片机</font>数字转速计的设计
飞思卡尔推最新32位动力总成MCU,优化燃料经济性
  油价又涨了!26日零时起,93号汽油涨至6.63元,而97号汽油突破7元大关。这是今年以来油价的第三次变动。节能减排越来越成为购车一族所考虑的重要因素之一。   正是在这样节能环保趋势下,汽车电子市场也将迎来日益严苛的挑战:新兴市场为汽车工业带来更大机会,尤其在摩托车和小型发动机领域,具有价格优势的MCU能帮助客户在激烈竞争中保持成本优势。因而,汽车电子厂商将开发更强大的引擎管理系统来处理复杂运算任务、更加环保的技术来应对排放法规的要求以及新一代的传动系统以降低油耗。随着技术的不断进步,控制功能越来越复杂,为了满足不断增加的内存空间和性能要求,据飞思卡尔汽车电子部市场经理杨斌介绍,现有的16位/32位平台需方便向高性能的3
[汽车电子]
内嵌UHFASK/FSK发射器的8位微控制器
    摘要: 8位CMOS微控制器rfPIC12C509AF具有TISC中央处理器、1024×12bit可编程EPROM、41字节数据RAM、8位可编程定时/计数器、看门狗定时器、5个通用I/O等电路,内嵌UHF ASK/FSK发射器的射频频率范围为310~480MHz,输出功率+2~-12dBm,ASK数据发射速率0~40Kbps,FSK数据发射速率0~20Kbps,PLL锁相。本文简要介绍rfPIC12C509AF的特性及应用电路。     关键词: 微控制器 无线发射器 无线数据传输 1 概述 tfPIC12C509AF是Microchip公司推出的单片集成内嵌射频无线数据发射器的8位CMO
[应用]
51单片机16位与13位定时器的比较
对MCS-51单片机,很多教材都有写关于定时器的使用,有时花很多时间学了13位和16位定时器的使用,但为什么不直接使用规则的16位计数?13位有优点吗?下面作出评述: 方式0:13位定时计数方式,最大计数值为2^13=8192,定时8192个机器周期。此方式已经不再用了,是为了和以前的单片机兼容,学初者不用掌握。 方式1:16位定时计数方式,最大计数值为2^16=65536,定时65536个机器周期。此方式可实现最大的定时时间和最大计数次数。是最常用方式之一。 方式2:8位自动重装计数方式,最大计数值为2^8=256,定时256个机器周期。此方式工作时定时或计数到了不用重装初值,精度较高。另外在串口通讯时常用此方式。是最常用方式
[单片机]
【STC单片机学习】第十六课:AD和DA转换
第一部分、章节目录 1.16.1.AD转换及其相关背景知识 1.16.2.原理图和数据手册 1.16.3.结合例程分析时序 1.16.4.代码实践 1.16.5.串口直接显示电压值 1.16.6.DA转换 第二部分、章节介绍 1.16.1.AD转换及其相关背景知识1 本节对整个课程做介绍,并且主要讲了模拟量和数字量这两个概念以及AD转换相关概念, 主要是量程、精确度、分辨率、位数、转换速度等,并且举例说明了这些课程的联系。 1.16.2.原理图和数据手册 本节看原理图、确定接线,并且对照数据手册查看其中的关键点。 1.16.3.结合例程分析时序 本节重点分析数据手册中的时序图,并且通过对照官
[单片机]
【STC<font color='red'>单片机</font>学习】第十六课:AD和DA转换
PIC单片机让一个灯闪烁程序
具体介绍:让一个灯闪烁,亮500ms后关闭500ms 流程图: 仿真图: 源代码: //----------------------------------------------------------------- // 名称: 闪烁的LED //----------------------------------------------------------------- // 说明: LED按设定的时间间隔闪烁 //----------------------------------------------------------------- #include pic.h #define _XTAL
[单片机]
PIC<font color='red'>单片机</font>让一个灯闪烁程序
TUV莱茵与极海半导体启动车规级MCU功能安全流程及产品认证项目
9月27日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(简称“TUV莱茵”)与珠海极海半导体有限公司(简称“极海半导体”)在杭州举行了车规级MCU芯片功能安全流程及产品认证项目启动仪式。极海半导体CEO汪栋杰、首席科学家黄凯、副总经理曾豪,TUV莱茵中华区工业服务与信息安全副总经理张云禧等双方代表出席了启动仪式。 TUV莱茵与极海半导体启动车规级MCU功能安全流程及产品认证项目 TUV莱茵与极海半导体启动车规级MCU功能安全流程及产品认证项目 汪栋杰在致辞中表示:“很高兴与TUV莱茵合作,启动车规级MCU芯片的功能安全流程及产品认证项目,希望在TUV莱茵的专业指导下,极海半导体能够不断提升产品性能
[汽车电子]
TUV莱茵与极海半导体启动车规级<font color='red'>MCU</font>功能安全流程及产品认证项目
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved