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

写了个手电的pwm程序,每次上电都会闪一下

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-6 16:20:37 来自手机 | 显示全部楼层
DebugLab 发表于 2024-8-6 16:17
上电二话别说先关闭输出,然后不能操作IO,读EEPROM,再打开输出

其他档位没问题,就是微量有闪一下

点评

上电时序不合理呗,注意IAP操作时CPU暂停  详情 回复 发表于 2024-8-6 16:36
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-8-6 16:36:41 | 显示全部楼层
vb2*** 发表于 2024-8-6 16:20
其他档位没问题,就是微量有闪一下

上电时序不合理呗,注意IAP操作时CPU暂停

点评

先读写EEPROM,再打开PWM  详情 回复 发表于 2024-8-6 16:37
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-8-6 16:37:17 | 显示全部楼层
Debu*** 发表于 2024-8-6 16:36
上电时序不合理呗,注意IAP操作时CPU暂停

先读写EEPROM,再打开PWM
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-6 17:35:52 来自手机 | 显示全部楼层
DebugLab 发表于 2024-8-6 16:37
先读写EEPROM,再打开PWM

好的,我回去试试,把pwm放在eeprom后面
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-6 18:42:18 | 显示全部楼层
Debu*** 发表于 2024-8-6 16:37
先读写EEPROM,再打开PWM

是这个问题,,我把PWM放在eeprom后面就好了.
但是只解决了一半,,还是有点点闪,,不过可以接受了.
之前是超级闪,现在就是一丢丢闪

点评

上电高阻的型号,用电阻给IO口拉到不亮的电平  详情 回复 发表于 2024-8-6 18:45
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-8-6 18:45:57 | 显示全部楼层
vb2*** 发表于 2024-8-6 18:42
是这个问题,,我把PWM放在eeprom后面就好了.
但是只解决了一半,,还是有点点闪,,不过可以接受了.
之前是超 ...

上电高阻的型号,用电阻给IO口拉到不亮的电平
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-7 00:21:17 | 显示全部楼层


电路图
代码我也发出来吧


  1. #include "stc8g.h"
  2. #include "intrins.h"
  3. #include "eeprom.h"
  4. #include <stdio.h>
  5. #define MAIN_Fosc 11059200UL
  6. #define BRT         (65536 - MAIN_Fosc / 115200 / 4)
  7. //#define EEPROMId           0x0E00
  8. typedef unsigned char u8;
  9. typedef unsigned int u16;
  10.   
  11. u8 save;
  12. u8 state;
  13. u8 dat;
  14. u16 EEPROMId = 0100;
  15. u16 time;
  16. bit key_flag;
  17. //void delayms(u16 ms);   
  18. void sys_init();
  19. void PWM_init(void);
  20. void Timer0_Init(void);
  21. void UartInit()
  22. {
  23.     SCON = 0x5a;
  24.     TL1 = BRT;
  25.     TH1 = BRT >> 8;
  26.     AUXR = 0x15;
  27.         TR1=1;
  28. }
  29. //void UartSend(char dat)
  30. //{
  31. //    while (!TI);
  32. //    TI = 0;
  33. //    SBUF = dat;
  34. //}
  35. u8 LEDControl()
  36. {       
  37. //        u8 dat;
  38. //        u16 EEPROMId = 0XE00;                                //将指针指向第8扇区的第一个字节
  39. //        SetMode(CMD_READ);                                //设置为读取数据
  40.        
  41.         while(1)
  42.         {       
  43.                 dat = IapRead(EEPROMId + 1);                        //读取下一字节数据
  44. //                printf("%bu\r\n",dat);
  45. //                printf("%u\r\n",EEPROMId);       
  46. //        printf("dat= %bu\r\n",dat);
  47. //        printf("id= %u\r\n",EEPROMId);                       
  48.                
  49.                 if(dat == 0XFF)                                        //下一字节字节未写入数据
  50.                 {
  51.                         dat = IapRead(EEPROMId);                //读取当前字节数据
  52. //                        SetMode(CMD_PROGRAM);                        //写入数据
  53.        
  54.                         switch(dat)
  55.                         {       
  56.                                 case 1: IapProgram(EEPROMId+1,191);break;
  57.                                 case 191: IapProgram(EEPROMId+1,121);break;
  58.                                 case 121: IapProgram(EEPROMId+1,51);break;
  59.                                 default: IapProgram(EEPROMId+1,1);break;        
  60.                                
  61.                         }         
  62.                         return dat;                                        //返回当前字节数据
  63.                 }
  64.         else                                                        //下一字节不为空,指针加一,继续判断下一个字节
  65.                 {        EEPROMId++;
  66.                 }
  67.                 if(EEPROMId >= 0XFFD)                                //如果当前字节到达EEPROM末尾,擦除扇区所有数据
  68.                 {       
  69. //                        SetMode(CMD_ERASE);                        //扇区擦除
  70.                         IapErase(0x0000);                                //擦除扇区
  71.                         IapErase(0x0200);                                //擦除扇区       
  72.                         IapErase(0x0400);                                //擦除扇区       
  73.                         IapErase(0x0600);                                //擦除扇区       
  74.                         IapErase(0x0800);                                //擦除扇区       
  75.                         IapErase(0x0A00);                                //擦除扇区       
  76.                         IapErase(0x0C00);                                //擦除扇区       
  77.                         IapErase(0x0E00);                                //擦除扇区                               
  78.                         return 1;
  79.                 }
  80.         }
  81. }
  82. void main()
  83. {               
  84.         sys_init();  
  85.       UartInit();
  86. CR=0;       
  87.        
  88.         LEDControl();
  89.         CR=1;       
  90.              PWM_init();
  91. //     UartSend(IapRead(dat));
  92. //     UartSend(IapRead(EEPROMId));
  93. //     UartSend(IapRead(dat));
  94.                
  95.           while(1)
  96.         {
  97.                     CCAP1H  = dat;   
  98. //                switch(state)
  99. //        {
  100. //                case 0 :    PWMA_CCR1 = 5;   break;
  101. //                case 1 :   PWMA_CCR1 = 15;   break;
  102. //                case 2 :    PWMA_CCR1 = 55;   break;
  103. //                case 3 :   PWMA_CCR1 = 250;   break;
  104. //                default:break;
  105. //               
  106. //        }
  107.         }
  108.        
  109.          
  110.        
  111. }
  112. void sys_init(void)
  113. {
  114.         P_SW2=0x80;
  115.        
  116.     P0M0 = 0x00; P0M1 = 0x00;
  117.     P1M0 = 0x00; P1M1 = 0x00;
  118.     P2M0 = 0x00; P2M1 = 0x00;
  119.     P3M0 = 0x00; P3M1 = 0x00;
  120.     P4M0 = 0x00; P4M1 = 0x00;
  121.     P5M0 = 0x00; P5M1 = 0x00;
  122.     P6M0 = 0x00; P6M1 = 0x00;
  123.     P7M0 = 0x00; P7M1 = 0x00;
  124.    
  125. //        P1M0 = 0x00; P1M1 = 0x00;
  126.        
  127.   
  128.          Timer0_Init();
  129.        
  130.         IT0=1;EX0=1;
  131.         INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
  132. //        IP2H=0x00;               
  133.         IP2=0x10;
  134.        
  135.         EA=1;                        //打开总中断
  136. }
  137. //// 初始化PWM功能
  138. void PWM_init(void)
  139. {
  140.     CCON = 0x00;
  141.     CMOD = 0x08;
  142.     CL = 0x00;
  143.     CH = 0x00;
  144.     CCAPM1 = 0x42;
  145.     PCA_PWM1 = 0x00;
  146.     CCAP1L = 0x00;                  
  147.     CCAP1H = 0x00;
  148.         CR=1;       
  149. }
  150. void Timer0_Isr(void) interrupt 1
  151. {        
  152.         TL0 = 0xCD;                                //设置定时初始值
  153.         TH0 = 0xD4;                                //设置定时初始值
  154.         if(time>=200)
  155.                 switch(dat)
  156.         {       
  157.                
  158.                 case 191:  IapProgram(EEPROMId+2,dat);break;
  159.                 case 121: IapProgram(EEPROMId+2,dat);break;
  160.                 case 51: IapProgram(EEPROMId+2,dat);break;
  161.                 case 1: IapProgram(EEPROMId+2,dat);break;
  162.                 default:IapProgram(EEPROMId+2,191); break;
  163.         }       
  164.          
  165.         if(time<200) time++;
  166. }
  167. void Timer0_Init(void)                //1毫秒@11.0592MHz
  168. {
  169.         AUXR |= 0x80;                        //定时器时钟1T模式
  170.         TMOD &= 0xF0;                        //设置定时器模式
  171.         TMOD |= 0x01;                        //设置定时器模式
  172.         TL0 = 0xCD;                                //设置定时初始值
  173.         TH0 = 0xD4;                                //设置定时初始值
  174.         TF0 = 0;                                //清除TF0标志
  175.         TR0 = 1;                                //定时器0开始计时
  176.         ET0 = 1;                                //使能定时器0中断
  177. }
  178. void INT4_Isr(void) interrupt 16
  179. {
  180. IAP_CONTR=0x60;                       
  181. }
  182. void INT0_Isr(void) interrupt 0
  183. {
  184. //        printf("dat= %bu\r\n",dat);
  185. //        printf("id= %u\r\n",EEPROMId);       
  186.                
  187. }
  188. void delayms(u16 ms)
  189.         {u16 i;
  190.         do{
  191.                 i = MAIN_Fosc /10000;
  192.                 while(--i);
  193.         }                while(--ms);
  194. }
  195.        
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-8-7 08:13:41 | 显示全部楼层
vb2*** 发表于 2024-8-7 00:21
电路图
代码我也发出来吧

你这个做个手电,搞出了个文章啦。{:5_322:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-8-7 09:47:20 | 显示全部楼层
上电时STC-PWM脚位高阻,CN5711的EN也是高阻,所以状态不定,你下拉一个10K电阻就可以解决。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-7 09:53:20 | 显示全部楼层
梁*** 发表于 2024-8-7 09:47
上电时STC-PWM脚位高阻,CN5711的EN也是高阻,所以状态不定,你下拉一个10K电阻就可以解决。 ...

那就是开机就拉低电阻,让引脚拉低电平是吗?
回头我试试
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 08:01 , Processed in 0.134147 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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