找回密码
 立即注册
楼主: vb2002

手电的待机功耗太高了.2ma .设置了掉电模式, 尴尬,不会唤醒

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:353
  • 最近打卡:2025-05-04 01:05:06
已绑定手机

130

主题

1522

回帖

1871

积分

金牌会员

积分
1871
发表于 2024-7-4 11:53:38 | 显示全部楼层
御坂美*** 发表于 2024-7-4 10:10
啊这,是不会再次休眠还是?

现在弄好了. 但是又有新问题了
不是手册上说的 掉电模式 0.4UA   而是 105UA
  1. #include <STC8G.H>
  2. #include "intrins.h"
  3.   
  4. #define MAIN_Fosc 11059200UL
  5. unsigned int pwm_levels[] = {5,15 ,80,255 };
  6. unsigned char PWM_SAVE;
  7. sbit KEY1 = P3^2;
  8. bit key_flag;
  9. unsigned char PWM_MODE;
  10. unsigned char time_out;
  11. void PWM_init(void)
  12. {
  13.     CCON = 0x00;
  14.     CMOD = 0x08;
  15.     CL = 0x00;
  16.     CH = 0x00;
  17.     CCAPM1 = 0x42;
  18.     PCA_PWM1 = 0x00;
  19.     CCAP1L = 0x00;                  
  20.     CCAP1H = 0x00;
  21.         CR=1;       
  22. }
  23. //void pwm_init(void);
  24. //void delayms(u16 ms);       
  25. //void pwm_init(void)
  26. //{
  27. //       
  28. //    CCON = 0x00;
  29. //    CMOD = 0x08;
  30. //    CL = 0x00;
  31. //    CH = 0x00;
  32. //    CCAPM1 = 0x42;
  33. //    PCA_PWM1 = 0x00;
  34. //    CCAP1L = ld;                  
  35. //    CCAP1H = ld;
  36. //        CR=1;       
  37. ////        while(1);
  38. //}
  39. void PWM_updata(unsigned int duty) {
  40.     if(duty > 0) {                              // 如果占空比大于0
  41.         CCAP1L = duty;                       // 更新CCR4计数值
  42.           CCAP1H = duty;  
  43.         CCAPM1 = 0x42;                         // 使能PWM输出
  44.         
  45.     } else {
  46.         CCAP1L = 0x00;                       
  47.           CCAP1H = 0x00;  
  48.         CCAPM1 = 0x00;                     
  49. //        P33 = 1; P34 = 1;                       // 将P3.3和P3.4设置为高电平
  50.     }
  51. }
  52. // 定时器0中断服务程序
  53. void Timer0_Isr(void) interrupt 1 {
  54.   
  55.         static unsigned char key_sta;               // 按键状态机变量
  56.     // 按键状态机
  57.     switch(key_sta) {
  58.         case 0:                                 // 状态0:等待按键
  59.             if (KEY1 == 0) key_sta++;            // 如果按键按下,进入状态1
  60.             break;
  61.         case 1:                                 // 状态1:确认按键
  62.             if (KEY1 == 0) key_sta++;            // 如果按键持续按下,进入状态2
  63.             else key_sta = 0;                   // 否则返回状态0
  64.             break;
  65.         case 2:                                 // 状态2:等待按键释放
  66.             if (KEY1 == 1) key_sta++;            // 如果按键释放,进入状态3
  67.             break;
  68.         case 3:                                 // 状态3:按键完成
  69.             key_flag = 1;                       // 设置按键标志位
  70.             key_sta = 0;                        // 重置状态机
  71.             break;
  72.         default:                                // 默认状态,重置状态机
  73.             key_sta = 0;
  74.             break;
  75.     }
  76.    
  77.     if (time_out < 30) time_out++;              // 如果未超时,增加超时计数器
  78. }
  79. void Timer0_Init(void) {
  80.     AUXR &= 0x7F;                               // 设置定时器时钟为12T模式
  81.     TMOD &= 0xF0;                               // 设置定时器模式
  82.     TL0 = 0x00;                                 // 设置定时初值低字节
  83.     TH0 = 0x4C;                                 // 设置定时初值高字节
  84.     TF0 = 0;                                    // 清除TF0标志
  85.     TR0 = 1;                                    // 开始定时器0计时
  86.     IE = 0x02;                                  // 开启定时器0中断
  87. }
  88.   
  89. void delayms(unsigned int ms)
  90. {
  91.         unsigned int i;
  92.         do{
  93.                 i = MAIN_Fosc /10000;
  94.                 while(--i);
  95.         }while(--ms);
  96. }
  97. void INT0_Isr() interrupt 0
  98. {
  99.     P10 = !P10;                                 //测试端口
  100. }
  101. void main()
  102. {
  103.    P_SW2=0x80;                                   // 初始化扩展寄存器
  104.      P3M0 = P3M1 =  0x00;
  105.                          
  106.         PWM_init();  
  107.         Timer0_Init();                              // 初始化定时器0
  108.         IT0=1;EX0=1;
  109.         EA=1;
  110.         _nop_();_nop_();_nop_();_nop_();
  111.         PCON=0x02;_nop_();_nop_();_nop_();_nop_();
  112.        
  113. while(1)
  114. {            
  115.          if(key_flag) {                          // 如果有按键事件
  116.             key_flag = 0;                       // 清除按键标志位
  117.             if (time_out < 30) {                // 如果按键没有超时
  118.                 PWM_MODE++;                     // 增加PWM模式
  119.                 if(PWM_MODE > (sizeof(pwm_levels)/sizeof(pwm_levels[0]))) // 防止超出数组范围
  120.                     PWM_MODE = 1;               // 循环回第一个模式
  121.                
  122.                 PWM_updata(pwm_levels[PWM_MODE - 1]); // 更新PWM占空比
  123.                 time_out = 0;                   // 重置超时计数器
  124.             } else {                            // 如果按键超时
  125.                 if(PWM_MODE) {                  // 如果有输出状态
  126.                     PWM_SAVE = PWM_MODE;        // 保存当前PWM模式
  127.                     PWM_MODE = 0;               // 清空PWM模式
  128.                     PWM_updata(0);              // 关闭PWM输出
  129.                 } else {                        // 如果处于关闭状态
  130.                     if(PWM_SAVE == 0) PWM_SAVE = 1; // 首次按键启动最低亮度
  131.                     PWM_MODE = PWM_SAVE;        // 恢复之前的PWM模式
  132.                     time_out = 0;               // 重置超时计数器
  133.                    PWM_updata(pwm_levels[PWM_MODE - 1]);    // 更新PWM占空比(此处的PWM_MODE*20可能是错误的,应该使用pwm_levels数组)
  134.                
  135.         PCON=0x02;_nop_();_nop_();_nop_();_nop_();
  136.                     }
  137.             }
  138.         }
  139.     }
  140. }
  141.          
  142. //      if (KEY1 == 0) {
  143. //            delayms(10);
  144. //            if (KEY1 == 0) {
  145. //                      if (noShiftTime >= 3000 ) {
  146. //                    ld = 0; // 关闭LED  
  147. //                        }
  148. //                       
  149. //                gear = (gear + 1) % 5; // 切换档位,循环回到0  
  150. //                while (!KEY1); // 等待按钮释放  
  151. //                 noShiftTime = 0;        
  152. //            }  
  153. //        }  
  154. //       
  155. //                 // 检查是否长时间未换挡  
  156. //        if (noShiftTime >= 3000) { // 如果3秒(或3000毫秒)未换挡  
  157. //            gear = 0; // 可以选择将档位重置为0或其他默认档位  
  158. //            ld = 0; // 关闭LED  
  159. //            noShiftTime = 0; // 重置计时器  
  160. //        }  
  161. //          
  162. //          
  163. //         
  164. //        switch (gear) {  
  165. //            case 0:  
  166. //                        ld=0;
  167. //                break;  
  168. //            case 1:  
  169. //                ld=2;  
  170. //                break;  
  171. //            case 2:  
  172. //                ld=15;  
  173. //                break;  
  174. //            case 3:  
  175. //   
  176. //                ld=30;  
  177. //                break;  
  178. //                          case 4:  
  179. //   
  180. //                ld=255;  
  181. //                break;  
  182. //        }  
  183. //  delayms(10);
  184. //    }  
  185. //}
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:353
  • 最近打卡:2025-05-04 01:05:06
已绑定手机

130

主题

1522

回帖

1871

积分

金牌会员

积分
1871
发表于 2024-7-4 12:19:53 | 显示全部楼层
御坂美*** 发表于 2024-7-4 11:43
我看你代码里面就进while之前睡了一次,while里面就没有判断再次进入睡眠的代码了 ...

这下完美了..哈哈哈哈哈哈哈哈

就是功耗有点点大,之前手册写的掉电模式  0.4ua   ,但是我的是 110ua
不懂是哪里出状况了
  1. #include <STC8G.H>
  2. #include "intrins.h"
  3.   
  4. #define MAIN_Fosc 11059200UL
  5. unsigned int pwm_levels[] = {5,15 ,80,255 };
  6. unsigned char PWM_SAVE;
  7. sbit KEY1 = P3^2;
  8. bit key_flag;
  9. unsigned char PWM_MODE;
  10. unsigned char time_out;
  11. void PWM_init(void)
  12. {
  13.     CCON = 0x00;
  14.     CMOD = 0x08;
  15.     CL = 0x00;
  16.     CH = 0x00;
  17.     CCAPM1 = 0x42;
  18.     PCA_PWM1 = 0x00;
  19.     CCAP1L = 0x00;                  
  20.     CCAP1H = 0x00;
  21.         CR=1;       
  22. }
  23. //void pwm_init(void);
  24. //void delayms(u16 ms);       
  25. //void pwm_init(void)
  26. //{
  27. //       
  28. //    CCON = 0x00;
  29. //    CMOD = 0x08;
  30. //    CL = 0x00;
  31. //    CH = 0x00;
  32. //    CCAPM1 = 0x42;
  33. //    PCA_PWM1 = 0x00;
  34. //    CCAP1L = ld;                  
  35. //    CCAP1H = ld;
  36. //        CR=1;       
  37. ////        while(1);
  38. //}
  39. void PWM_updata(unsigned int duty) {
  40.     if(duty > 0) {                              // 如果占空比大于0
  41.         CCAP1L = duty;                       // 更新CCR4计数值
  42.           CCAP1H = duty;  
  43.         CCAPM1 = 0x42;                         // 使能PWM输出
  44.         
  45.     } else {
  46.         CCAP1L = 0x00;                       
  47.           CCAP1H = 0x00;  
  48.         CCAPM1 = 0x00;                     
  49. //        P33 = 1; P34 = 1;                       // 将P3.3和P3.4设置为高电平
  50.     }
  51. }
  52. // 定时器0中断服务程序
  53. void Timer0_Isr(void) interrupt 1 {
  54.   
  55.         static unsigned char key_sta;               // 按键状态机变量
  56.     // 按键状态机
  57.     switch(key_sta) {
  58.         case 0:                                 // 状态0:等待按键
  59.             if (KEY1 == 0) key_sta++;            // 如果按键按下,进入状态1
  60.             break;
  61.         case 1:                                 // 状态1:确认按键
  62.             if (KEY1 == 0) key_sta++;            // 如果按键持续按下,进入状态2
  63.             else key_sta = 0;                   // 否则返回状态0
  64.             break;
  65.         case 2:                                 // 状态2:等待按键释放
  66.             if (KEY1 == 1) key_sta++;            // 如果按键释放,进入状态3
  67.             break;
  68.         case 3:                                 // 状态3:按键完成
  69.             key_flag = 1;                       // 设置按键标志位
  70.             key_sta = 0;                        // 重置状态机
  71.             break;
  72.         default:                                // 默认状态,重置状态机
  73.             key_sta = 0;
  74.             break;
  75.           
  76.     }
  77.    
  78.     if (time_out < 30) time_out++;              // 如果未超时,增加超时计数器
  79. }
  80. void Timer0_Init(void) {
  81.     AUXR &= 0x7F;                               // 设置定时器时钟为12T模式
  82.     TMOD &= 0xF0;                               // 设置定时器模式
  83.     TL0 = 0x00;                                 // 设置定时初值低字节
  84.     TH0 = 0x4C;                                 // 设置定时初值高字节
  85.     TF0 = 0;                                    // 清除TF0标志
  86.     TR0 = 1;                                    // 开始定时器0计时
  87.     IE = 0x02;                                  // 开启定时器0中断
  88. }
  89.   
  90. void delayms(unsigned int ms)
  91. {
  92.         unsigned int i;
  93.         do{
  94.                 i = MAIN_Fosc /10000;
  95.                 while(--i);
  96.         }while(--ms);
  97. }
  98. void INT0_Isr() interrupt 0
  99. {
  100. }
  101. void main()
  102. {
  103.    P_SW2=0x80;                                   // 初始化扩展寄存器
  104.      P3M0 = P3M1 =  0x00;
  105.                          
  106.         PWM_init();  
  107.         Timer0_Init();                              // 初始化定时器0
  108.         IT0=1;EX0=1;
  109.         EA=1;
  110.         _nop_();_nop_();_nop_();_nop_();
  111.         PCON=0x02;_nop_();_nop_();_nop_();_nop_();
  112.        
  113. while(1)
  114. {            
  115.          if(key_flag) {                          // 如果有按键事件
  116.             key_flag = 0;                       // 清除按键标志位
  117.             if (time_out < 30) {                // 如果按键没有超时
  118.                 PWM_MODE++;                     // 增加PWM模式
  119.                 if(PWM_MODE > (sizeof(pwm_levels)/sizeof(pwm_levels[0]))) // 防止超出数组范围
  120.                     PWM_MODE = 1;               // 循环回第一个模式
  121.                
  122.                 PWM_updata(pwm_levels[PWM_MODE - 1]); // 更新PWM占空比
  123.                     
  124.                 time_out = 0;                   // 重置超时计数器
  125.             
  126.                 } else {                            // 如果按键超时
  127.                 if(PWM_MODE) {                  // 如果有输出状态
  128.                     PWM_SAVE = PWM_MODE;        // 保存当前PWM模式
  129.                     PWM_MODE = 0;               // 清空PWM模式
  130.                     PWM_updata(0);              // 关闭PWM输出
  131.                 } else {                        // 如果处于关闭状态
  132.                     
  133.                             if(PWM_SAVE == 0) PWM_SAVE = 1; // 首次按键启动最低亮度
  134.                     PWM_MODE = PWM_SAVE;        // 恢复之前的PWM模式
  135.                     time_out = 0;               // 重置超时计数器
  136.                    PWM_updata(pwm_levels[PWM_MODE - 1]);    // 更新PWM占空比(此处的PWM_MODE*20可能是错误的,应该使用pwm_levels数组)
  137.                
  138.                     }
  139.                     if(CCAP1H==0x00)
  140.                               PCON=0x02;_nop_();_nop_();_nop_();_nop_();
  141.             }
  142.                
  143.         }
  144.          
  145.     }
  146. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:353
  • 最近打卡:2025-05-04 01:05:06
已绑定手机

130

主题

1522

回帖

1871

积分

金牌会员

积分
1871
发表于 2024-7-4 12:20:16 | 显示全部楼层
wnag*** 发表于 2024-7-4 12:02
你看看你测得是单片机的功耗吗?没有测量外围器件的功耗?,单独测试单片机功耗 ...

掉电模式下,外围不是都关电了吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-12 16:14:06

7

主题

59

回帖

984

积分

高级会员

积分
984
发表于 2024-7-4 12:20:25 | 显示全部楼层
vb2*** 发表于 2024-7-4 11:53
现在弄好了. 但是又有新问题了
不是手册上说的 掉电模式 0.4UA   而是 105UA
...

不需要的引脚关掉输入
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-12 16:14:06

7

主题

59

回帖

984

积分

高级会员

积分
984
发表于 2024-7-4 12:28:51 | 显示全部楼层
vb2*** 发表于 2024-7-4 12:19
这下完美了..哈哈哈哈哈哈哈哈

就是功耗有点点大,之前手册写的掉电模式  0.4ua   ,但是我的是 110ua

不需要的引脚关掉,我看你这个就留P32,P31,P30应该就行
P0IE = 0x00;
P1IE = 0x00;
P2IE = 0x00;
P3IE = 0x06;
P4IE = 0x00;
P5IE = 0x00;
P6IE = 0x00;
P7IE = 0x00;
然后就是看你的标准双向口,有没有休眠之前写0的情况,因为弱上拉置零要消耗个十来uA,所以休眠之前就弄成开漏置零,起来再换成标准双向
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-12 16:14:06

7

主题

59

回帖

984

积分

高级会员

积分
984
发表于 2024-7-4 12:29:49 | 显示全部楼层
vb2*** 发表于 2024-7-4 12:19
这下完美了..哈哈哈哈哈哈哈哈

就是功耗有点点大,之前手册写的掉电模式  0.4ua   ,但是我的是 110ua

写错了,应该是P3IE = 0x07;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:353
  • 最近打卡:2025-05-04 01:05:06
已绑定手机

130

主题

1522

回帖

1871

积分

金牌会员

积分
1871
发表于 2024-7-4 12:36:03 | 显示全部楼层
御坂美*** 发表于 2024-7-4 12:29
写错了,应该是P3IE = 0x07;

我试试看,是不是IO口的问题
我用范例程序里面的掉电模式,确实是0.04ua
用我这个代码就不行了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:353
  • 最近打卡:2025-05-04 01:05:06
已绑定手机

130

主题

1522

回帖

1871

积分

金牌会员

积分
1871
发表于 2024-7-4 12:50:56 来自手机 | 显示全部楼层
御坂美琴我老婆 发表于 2024-7-4 12:29
写错了,应该是P3IE = 0x07;

现在掉电电流0.4ua了
因为之前io口没有配置p54,,
我的p54弄成复位按键了

1720068589327.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-12 16:14:06

7

主题

59

回帖

984

积分

高级会员

积分
984
发表于 2024-7-4 13:24:50 | 显示全部楼层
vb2*** 发表于 2024-7-4 12:50
现在掉电电流0.4ua了
因为之前io口没有配置p54,,
我的p54弄成复位按键了

OK,那没问题了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 10:21 , Processed in 0.148258 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表