| 
				打卡等级:初来乍到打卡总天数:2最近打卡:2024-09-23 09:19:07   注册会员 
 
 
	积分63 
 | 
 
| 各位大佬,帮忙看一下这段代码,为什么进入掉电模式下。电流还有10多mA的电流? 
 谢谢。
 
   
 
 
 
 #define MAIN_Fosc                11059200UL        //定义主时钟
 #define IDL             0x01                    //PCON.0
 #define PD              0x02                    //PCON.1
 
 #include        "STC8Gxxx.h"
 
 /*************        本地变量声明        **************/
 
 u16        pwm;                //pwm
 bit        B_PWM_Dir;        //方向, 0为+, 1为-.
 u8        cnt;
 
 /*************        本地函数声明        **************/
 void        UpdatePwm(u8 id, u16 pwm_value);        //id: PCA序号, 0~2对应 PCA0 ~ PCA2,  pwm_value: pwm值, 这个值是输出低电平的时间.
 void        PCA_config(u8 io, u8 clk, u8 wide);        // io: 选择IO, 0: P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2),   1: 选择P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2), 2: P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)).
 //clk: 选择时钟, 0: 12T,  1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,  5: 4T,  6: 6T,  7: 8T
 //wide: pwm的宽度, 0: 8位PWM,  1: 7位PWM,  2: 6位PWM,  3: 10位位PWM
 void        PwmOutContinue(u8 id, u8 level);        // id: PCA序号, 0~2对应 PCA0 ~ PCA2,  level: 连续输出的电平,0为低电平, 1为高电平.
 void          delay_ms(u8 ms);
 
 /******************** 主函数 **************************/
 void main(void)
 {
 
 IT0 = 0;                                    //使能INT0上升沿和下降沿中断
 EX0 = 1;                                    //使能INT0中断
 EA = 1;
 
 PCA_config(0, 4, 3);        //io=0:        选择P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2), clk=4: 选择时钟1T, 3: 10位PWM
 
 pwm = 128;
 B_PWM_Dir = 0;
 
 while (1)
 {
 if(P32)
 {
 
 delay_ms(1);
 
 if(B_PWM_Dir)
 {
 if(--pwm <= 8)                B_PWM_Dir = 0;
 }
 else
 {
 if(++pwm >= 1016)        B_PWM_Dir = 1;
 }
 UpdatePwm(PCA1, pwm);        //更新PWM.
 UpdatePwm(PCA2, pwm);        //更新PWM.
 }
 else
 {
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 
 PWM1_OUT_1();        //初始输出0
 PWM2_OUT_1();        //初始输出0
 
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 //   PCON = IDL;                                 //MCU进入IDLE模式
 PCON = PD;                                  //MCU进入掉电模式
 
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 }
 }
 }
 
 void INT0_Isr() interrupt 0
 {
 _nop_();
 }
 
 //========================================================================
 // 函数: void  delay_ms(u8 ms)
 // 描述: 延时函数。
 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
 // 返回: none.
 // 版本: VER1.0
 // 版本: V1.0, 2016-5-10
 // 备注:
 //========================================================================
 void  delay_ms(u8 ms)
 {
 u16 i;
 do
 {
 i = MAIN_Fosc / 10000;
 while(--i)        ;
 }while(--ms);
 }
 
 
 
 //========================================================================
 // 函数: void        PCA_config(u8 io, u8 clk, u8 wide)
 // 描述: PCA配置函数。
 // 参数: io: 选择IO, 0: P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2),   1: 选择P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2), 2: P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)).
 //       clk: 选择时钟, 0: 12T,  1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,  5: 4T,  6: 6T,  7: 8T
 //                 wide: pwm的宽度, 0: 8位PWM,  1: 7位PWM,  2: 6位PWM,  3: 10位位PWM
 // 返回: none.
 // 版本: VER1.0
 // 版本: V1.0, 2016-5-10
 // 备注:
 //========================================================================
 void        PCA_config(u8 io, u8 clk, u8 wide)
 {
 CR = 0;   //停止PCA定时器
 
 CMOD = (CMOD & ~0x0E) | ((clk & 7) << 1);                // PCA时钟选择, 0: 12T,  1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,  5: 4T,  6: 6T,  7: 8T
 
 PCA1_PWM(wide);        //PWM宽度        0: 8位PWM,  1: 7位PWM,  2: 6位PWM,  3: 10位PWM
 PCA2_PWM(wide);        //PWM宽度        0: 8位PWM,  1: 7位PWM,  2: 6位PWM,  3: 10位PWM
 
 PWM1_OUT_0();        //初始输出0
 PWM2_OUT_0();        //初始输出0
 
 if(io == 1)
 {
 P_SW1 = (P_SW1 & ~0x30) | 0x10;        // 将PCA/PWM切换到 P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2)
 P3n_push_pull(0x0a);        //头文件的宏, P3.1 P3.3设置为推挽输出
 P5n_push_pull(0x10);        //头文件的宏, P5.4设置为推挽输出
 }
 else if(io == 2)
 {
 P_SW1 = (P_SW1 & ~0x30) | 0x20;        // 将PCA/PWM切换到 P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)
 P3n_push_pull(0x0c);        //头文件的宏, P3.2 P3.3设置为推挽输出
 P5n_push_pull(0x20);        //头文件的宏, P5.5设置为推挽输出
 }
 else
 {
 //        P_SW1 = P_SW1 & ~0x30;        // 将PCA/PWM切换到 P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2)
 P3n_push_pull(0x8c);        //头文件的宏, P3.3设置为推挽输出
 P5n_push_pull(0x10);        //头文件的宏, P5.4设置为推挽输出
 //        P5n_pure_input(bitn)    //头文件的宏, P3.2设置为高阻输入
 }
 
 CH = 0;
 CL = 0;
 //        PPCA = 1;        // 高优先级中断
 CR   = 1;        // 运行PCA定时器
 }
 
 
 
 //========================================================================
 // 函数: void PwmOutContinue(u8 id, u8 level)
 // 描述: 设置PWM连续输出电平(高或低).
 // 参数:    id: PCA序号, 0~2对应 PCA0 ~ PCA2
 //                 level: 连续输出的电平,0为低电平, 1为高电平.
 // 返回: none.
 // 版本: V1.0, 2018-5-10
 //========================================================================
 void        PwmOutContinue(u8 id, u8 level)
 {
 if(id == 1)
 {
 if(level == 0)        PWM1_OUT_0();
 else                        PWM1_OUT_1();
 }
 else if(id == 2)
 {
 if(level == 0)        PWM2_OUT_0();
 else                        PWM2_OUT_1();
 }
 }
 
 //========================================================================
 // 函数: void UpdatePwm(u8 id, u16 pwm_value)
 // 描述: 更新PWM值.
 // 参数:        id: PCA序号, 0~2对应 PCA0 ~ PCA2
 //                 pwm_value: pwm值, 这个值是输出低电平的时间.
 // 返回: none.
 // 版本: V1.0, 2018-5-10
 //========================================================================
 void        UpdatePwm(u8 id, u16 pwm_value)
 {
 if(id == 1)
 {
 PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
 CCAP1H = (u8)pwm_value;
 //        PWM1_NORMAL();
 }
 else if(id == 2)
 {
 PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
 CCAP2H = (u8)pwm_value;
 //        PWM2_NORMAL();
 }
 }
 
 //========================================================================
 // 函数: void        PCA_Handler (void) interrupt PCA_VECTOR
 // 描述: PCA中断处理程序.
 // 参数: None
 // 返回: none.
 // 版本: V1.0, 2016-5-10
 //========================================================================
 void        PCA_Handler (void) interrupt PCA_VECTOR
 {
 
 if(CCF1)        //PCA模块1中断
 {
 CCF1 = 0;                //清PCA模块1中断标志
 }
 
 if(CCF2)        //PCA模块2中断
 {
 CCF2 = 0;                //清PCA模块1中断标志
 }
 
 if(CF)        //PCA溢出中断
 {
 CF = 0;                        //清PCA溢出中断标志
 }
 
 }
 
 
 
 
 
 
 | 
 |