- 打卡等级:初来乍到
- 打卡总天数: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溢出中断标志
}
}
|
|