请选择 进入手机版 | 继续访问电脑版

930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 6624|回复: 2

STC15W4K32S4系列电源管理之程序设计1

[复制链接]

101

主题

329

帖子

7412

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7412
发表于 2019-8-3 09:21:43 | 显示全部楼层 |阅读模式
本帖最后由 正是河豚 于 2019-8-3 09:23 编辑
    1、STC15W4K32S4系列MCU进入掉电模式后,外部中断可以唤醒,下面介绍外部中断0如何唤醒掉电模式下的单片机的程序设计。

    2、该实验以艾克姆科技进取者STC15开发板为载体,实验连接图如下。



    3、外部中断0的程序设计部分代码如下。


  • /***********************************************************
  • 功能描述:外部中断0初始化
  • 入口参数:无
  • 返回值:无
  • ************************************************************/  
  • void INT0_Init(void)  
  • {  
  •     IE0  = 0;        //将INT0中断请求标志位清"0"  
  •     EX0 = 1;         //使能INT0中断允许位  
  •     IT0 = 1;           //选择INT0为下降沿触发方式  
  • }  
  • /***********************************************************
  • 功能描述:外部中断服务程序
  • 入口参数:无
  • 返回值:无
  • ************************************************************/  
  • void INT0_Isr (void) interrupt INT0_VECTOR        
  • {  
  •     ;         //无任务  
  • }

    注:外部中断0的中断服务函数里面没有实际执行的代码,只是借助触发外部中断0的事件来唤醒单片机。


    4、main文件程序设计部分代码如下。


  • #define  TRUE     1   
  •   
  • /*************  本地变量声明  **************/  
  • uint16  msecond;                    //1000ms计数  
  • uint8     SleepDelay;               //睡眠延时用时间变量  
  • /***************************************************************************
  • * 描  述 : 主函数
  • * 入  参 : 无
  • * 返回值 : 无
  • **************************************************************************/  
  • int main()  
  • {  
  • /////////////////////////////////////////////////  
  • //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为  
  • //      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用  
  • //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2  
  • //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5  
  • /////////////////////////////////////////////////  
  •     P0M1 &= 0x3F;   P0M0 &= 0x3F;     //设置P0.6、P0.7为准双向口  
  •       
  •     SleepDelay = 0;               //初始清零  
  •     EA = 1;                         //允许总中断  
  •       
  •     while(1)  
  •     {  
  •         delay_ms(1);                  //延时1ms         
  •         if(++msecond >= 1000)          //约1秒到  
  •         {  
  •             msecond = 0;                  //清1000ms计数  
  •       led_on(LED_2);              //点亮红色指示灯DS2  
  •             led_off(LED_1);           //熄灭蓝色指示灯DS1  
  •          
  •             if(++SleepDelay >= 5)        //约5秒到  
  •             {  
  •                 SleepDelay = 0;         //清零延时用时间变量  
  •                 if(TRUE)      
  •                 {  
  •                     SleepDelay = 0;       //清零延时用时间变量  
  •           led_on(LED_1);          //点亮蓝色指示灯DS1  
  •                     led_off(LED_2);       //熄灭红色指示灯DS2  
  •             INT0_Init();          //外部中断0初始化  
  •                     PCON |= 0x02;         //单片机进入掉电模式  
  •                     _nop_();  
  •                     _nop_();  
  •                     _nop_();  
  •                 }  
  •             }  
  •         }  
  •     }  
  • }



    5、下载程序后的实验现象是:
    1)下载程序后,红灯亮蓝灯灭,约5s后红灯灭蓝灯亮,单片机进入掉电模式。
    2)按下触摸按键在P32上产生上升沿,单片机依然处于掉电模式,红灯灭蓝灯亮。
    3)触摸按键由按下到松开,在P32上产生下降沿,唤醒单片机,程序从设置单片机进入掉电模式的下一条语句开始执行,进主循环,红灯亮蓝灯灭,约5s后红灯灭蓝灯亮,单片机再次进入掉电模式。

















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

2

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2019-8-16 19:44:21 | 显示全部楼层
msecond >= 1000,怎样确定他的时间就是1秒,

回复 支持 反对

使用道具 举报

101

主题

329

帖子

7412

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7412
 楼主| 发表于 2019-8-16 21:58:39 | 显示全部楼层
因为前面有个delay_ms(1);  满足上述条件,则这个1ms的延时就执行了1000次,那正好1s啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表