×
单片机 > 单片机程序设计 > 详情

AVR单片机电源管理_睡眠模式(低功耗模式)实验

发布时间:2020-08-24 发布时间:
|

先看芯片手册吧

这对电源及睡眠模式的一个简述,并介绍了进入模式时和唤醒之后的处理(第二段一定好好吸收哦)。

这是控制寄存器的设定进入不同模式的设定,根据需要进入不同的模式。

看到这里,也算了解了。

下面发段代码:

  1. /********************************************************** 

  2. * 文  件  名 : main.c  

  3. * 描      述 : 低功耗模式的探究 

  4. * 创  建  人 : 夏玉峰   

  5. * 单      位 : 佳木斯大学 信息电子技术学院 电子协会  

  6. * 日      期 : 2012.12.9 

  7. * 开 发 环 境: 开发环境:ICCAVR 7.22  

  8.                硬件平台:ATmega8 

  9.                晶    振:8MHZ 

  10. * 邮      箱 : xiayufeng90520@163.com 

  11. * 版  本  号 : 1.00 

  12. **********************************************************/  

  13. #include  

  14. #include  

  15. #include"xiaofeng_delay.h"  

  16.   

  17. /******************************************* 

  18. 函数 名称: Port_Init 

  19. 功     能: IO初始化 

  20. 参     数: 无 

  21. 返 回 值 : 无 

  22. /********************************************/  

  23. void Port_Init(void)  

  24. {  

  25.     PORTB = 0xFF;  

  26.     DDRB  = 0xFF;  

  27.       

  28.     DDRD=0X00;  

  29.     PORTD=0XFF;  

  30. }  

  31.   

  32. /******************************************* 

  33. 函数 名称: Port_Init 

  34. 功     能: IO初始化 

  35. 参     数: 无 

  36. 返 回 值 : 无 

  37. /********************************************/  

  38. void Power_Init(void)  

  39. {  

  40.     MCUCR |= 0X20;//掉电模式,外部中断0低电平触发  

  41.     GICR |= 0X40; //外部中断0使能  

  42.     SREG |= 0X80;//使能总中断  

  43. }  

  44. /******************************************* 

  45. 函数 名称: Device_Init 

  46. 功     能: 器件初始化 

  47. 参     数: 无 

  48. 返 回 值 : 无 

  49. /********************************************/  

  50. void Device_Init(void)  

  51. {  

  52.     Port_Init();       //IO端口初始化  

  53.     Power_Init();      //外部中断,省电模式,初始化  

  54. }  

  55.   

  56. /******************************************* 

  57. 函数 名称: main 

  58. 功     能: 主函数 

  59. 参     数: 无 

  60. 返 回 值 : 无 

  61. /********************************************/  

  62. void main(void)  

  63. {  

  64.     unsigned char i;  

  65.     Device_Init();  

  66.       

  67.     while(1)  

  68.     {  

  69.          for (i=0;i<10;i++)  

  70.         {  

  71.             PORTB &= ~BIT(1);  

  72.             delay_nms(300);  

  73.             PORTB |= BIT(1);  

  74.             delay_nms(300);  

  75.         }  

  76.          MCUCR |= 0x80;       //使能休眠  

  77.          asm("sleep");  

  78.          for (i=0;i<10;i++)  

  79.         {  

  80.             PORTB &= ~BIT(2);  

  81.             delay_nms(300);  

  82.             PORTB |= BIT(2);  

  83.             delay_nms(300);  

  84.         }  

  85.     }  

  86. }  

  87. /******************************************* 

  88. 函数名称: void int0_isr(void) 

  89. 功    能: 外部中断0的服务函数 

  90. 参    数: 无 

  91. 返 回 值: 无 

  92. /********************************************/  

  93. #pragma interrupt_handler int0_isr:2  

  94. void int0_isr(void)  

  95. {  

  96.     unsigned char i;  

  97.     for (i=0;i<10;i++)  

  98.     {  

  99.         PORTB &= ~BIT(0);  

  100.         delay_nms(300);  

  101.         PORTB |= BIT(0);  

  102.         delay_nms(300);  

  103.     }  

  104. }  


进入程序首先执行第二个灯闪烁,

闪烁停止,说明进入睡眠模式,

摁下按键,第一个灯开始闪烁,说明单片机被唤醒,进入外部中断服务函数,

第三个灯开始闪烁,说明中断服务函数执行完毕,执行SLEEP指令后面的程序。

有很多不足,也为有兴趣的朋友,做个例子吧,一起学习一下吧。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会