STC8G1K08A遇到的问题

遇到的问题:用STC8G1K08A-8PIN开发,当ACC用12V的电源线接通之后,再接IN_1或者IN_2蜂鸣器都会响,目的是让蜂鸣器不响,当ACC没有接任何线时,再用12V的电源线接IN_2或者IN_1蜂鸣器响,
下面是我的代码和资料,请过目

img

u16    pwm0,pwm1,pwm2;

/*************    本地函数声明    **************/


/*************  外部函数和变量声明 *****************/


/******************** IO口配置 ********************/
void delay_sm(void)
{
    int i = 50000000;
    while(i--);
}

void    GPIO_config(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;                //结构定义
    
    GPIO_InitStructure.Pin  = GPIO_Pin_2;            //P32                PWM
    GPIO_InitStructure.Mode = GPIO_OUT_PP;            //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);    //初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_3;            //P33                IN_2
    GPIO_InitStructure.Mode = GPIO_PullUp;            //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);    //初始化
    
    GPIO_InitStructure.Pin  = GPIO_Pin_5;            //P55                IN_1
    GPIO_InitStructure.Mode = GPIO_PullUp;            //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);    //初始化
    
    //ACC 当ACC—NMOS管导通时,芯片上面的引脚直接接地,所以没有电流通过,所以IN_1和IN_2被禁用,蜂鸣器不发出任何声音,反之截止时,该引脚有上拉电阻一直接着所以一直为高电平
    GPIO_InitStructure.Pin  = GPIO_Pin_4;            //P54                            
    GPIO_InitStructure.Mode = GPIO_PullUp;            //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);    //初始化
}

/******************** PCA配置 ********************/
void    PCA_config(void)
{
    PCA_InitTypeDef        PCA_InitStructure;

    PCA_InitStructure.PCA_Clock    = PCA_Clock_2T;        //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
    PCA_InitStructure.PCA_IoUse    = PCA_1;    //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
    PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;        //ENABLE, DISABLE
    PCA_InitStructure.PCA_Priority = Priority_0;            //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    PCA_InitStructure.PCA_RUN      = DISABLE;                //ENABLE, DISABLE
    PCA_Init(PCA_Counter,&PCA_InitStructure);            //设置公用Counter

    PCA_InitStructure.PCA_Mode     = PCA_Mode_HighPulseOutput;        //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
    PCA_InitStructure.PCA_PWM_Wide = 0;                    //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
    PCA_InitStructure.PCA_Interrupt_Mode = ENABLE;        //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
    PCA_InitStructure.PCA_Value    = 65535;            //对于软件定时, 为匹配比较值
    PCA_Init(PCA0,&PCA_InitStructure);
}


/******************** task A **************************/
void main(void)
{
    GPIO_config();            //引脚初始化
    PCA_config();                //PWM_PCA初始化
    EA = 1;                            //开启中断
    
    while (1)
    {    
        delay_ms(1);    
        if(P54 == 0)
        {
            if(P33 == 0)    //现在这个电平是高电平,所以我们要判断是否是低电平才能进行蜂鸣器叫
            {            
                pwm0 = PWM_NOW;    //给PWM一个初值        6000 / 4 * 1 = 1500
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                
                pwm0 = PWM_NOW;    //给PWM一个初值        6000 / 4 * 1 = 1500
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
            } 
            
            if(P55 == 0)    //电平相反    响一声然后停了是上面那条
            {
                pwm0 = PWM_NOW;    //给PWM一个初值        6000 / 4 * 1 = 1500
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                delay_sm(); 
                delay_sm();

                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                delay_sm();
                delay_sm();
            }
        }
    }
}

贴原理图吧,PCB图没法看啊

根据你的代码,似乎是因为 P54 引脚在 ACC 没有接线时被拉高,所以 P33 和 P55 引脚是被设置为下拉电阻的,导致在 ACC 有 12V 电源接入时,这两个引脚的电平会变成高电平,从而触发蜂鸣器响声。

如果你想让蜂鸣器在 ACC 有 12V 电源接入时不响,可以将 P33 和 P55 引脚的模式改为上拉电阻,这样在 ACC 没有接线时,这两个引脚的电平会变成低电平,不会触发蜂鸣器响声,而在 ACC 有 12V 电源接入时,这两个引脚的电平会变成高电平,仍然不会触发蜂鸣器响声。

修改代码如下:

GPIO_InitStructure.Pin  = GPIO_Pin_3;            //P33                IN_2
GPIO_InitStructure.Mode = GPIO_PULLUP;            //改为上拉电阻
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);    //初始化

GPIO_InitStructure.Pin  = GPIO_Pin_5;            //P55                IN_1
GPIO_InitStructure.Mode = GPIO_PULLUP;            //改为上拉电阻
GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);    //初始化
该回答引用ChatGPT
根据问题描述和代码,可以看出问题出在ACC(电源)引脚上。当ACC接通时,IN_1和IN_2被禁用,蜂鸣器不发出任何声音,但是实际上蜂鸣器还是会响。这是因为在程序中没有对ACC引脚进行处理,导致程序无法正确判断ACC引脚的状态。
解决方法是在程序中加入对ACC引脚的处理。可以使用GPIO_PullUp模式,当ACC接通时,ACC引脚为低电平,IN_1和IN_2引脚为高电平,蜂鸣器不响;当ACC未接通时,ACC引脚为高电平,IN_1和IN_2引脚为低电平,蜂鸣器响。
修改后的代码如下:

u16 pwm0;
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
/******************** IO口配置 ********************/
void delay_sm(void)
{
int i = 50000000;
while(i--);
}
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_2; //P32 PWM
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_3; //P33 IN_2
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_5; //P55 IN_1
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
//ACC 当ACC—NMOS管导通时,芯片上面的引脚直接接地,所以没有电流通过,所以IN_1和IN_2被禁用,蜂鸣器不发出任何声音,反之截止时,该引脚有上拉电阻一直接着所以一直为高电平
GPIO_InitStructure.Pin = GPIO_Pin_4; //P54
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
}
/******************** PCA配置 ********************/
void PCA_config(void)
{
PCA_InitTypeDef PCA_InitStructure;
PCA_InitStructure.PCA_Clock = PCA_Clock_2T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse = PCA_1; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Priority = Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure); //设置公用Counter
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //对于软件定时, 为匹配比较值
PCA_Init(PCA0,&PCA_InitStructure);
}

/******************** task A **************************/
void main(void)
{
GPIO_config(); //引脚初始化
PCA_config(); //PWM_PCA初始化
EA = 1; //开启中断
while (1)
{
delay_sm();
if(P54 == 0) //ACC接通
{
if(P33 == 1 && P55 == 1) //IN_1和IN_2引脚为高电平,蜂鸣器不响
{
pwm0 = PWM_STOP;
PWMn_Update(PCA0,pwm0);
}
}
else //ACC未接通
{
if(P33 == 0) //IN_2引脚为低电平,蜂鸣器响
{
pwm0 = PWM_NOW; //给PWM一个初值 6000 / 4 * 1 = 1500
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
pwm0 = PWM_STOP;
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
pwm0 = PWM_NOW; //给PWM一个初值 6000 / 4 * 1 = 1500
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
pwm0 = PWM_STOP;
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
}
if(P55 == 0) //IN_1引脚为低电平,蜂鸣器响
{
pwm0 = PWM_NOW; //给PWM一个初值 6000 / 4 * 1 = 1500
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
delay_sm();
delay_sm();
pwm0 = PWM_STOP;
PWMn_Update(PCA0,pwm0);
delay_sm();
delay_sm();
delay_sm();
delay_sm();
}
}
}
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的代码和问题描述,我猜测可能存在以下原因:

  1. 电源线和IN_1/IN_2之间存在电磁干扰,导致触发蜂鸣器响声。
  2. ACC引脚由于与芯片上面的引脚直接接地,可能导致电流问题影响到IN_1/IN_2引脚状态以至于影响到蜂鸣器是否响声。

针对这两种情况,你可以尝试以下方法来解决问题:

  1. 将电源线和IN_1/IN_2之间加上抗干扰电容来减少电磁干扰的影响。
  2. 可以使用一个管脚来控制IN_1/IN_2的输入,在ACC引脚接通时禁用IN_1/IN_2的输入,以防止不必要干扰。同时,也可以在程序中加入判断IN_1/IN_2引脚是否无效的代码,以使蜂鸣器不会响声。

以下是示例代码来控制IN_1/IN_2的输入和判断代码:

void GPIO_config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;  //结构定义

    GPIO_InitStructure.Pin  = GPIO_Pin_2;  //P32                PWM
    GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);  //初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_3;  //P33                IN_2
    GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);  //初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_5;  //P55                IN_1
    GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);  //初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_4;  //P54                            
    GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);  //初始化
}

void main(void)
{
    GPIO_config();  //引脚初始化
    PCA_config();   //PWM_PCA初始化
    EA = 1; //开启中断
    
    while (1)
    {    
        delay_ms(1);    

        if(P54 == 0) //ACC引脚接通
        {
            //禁用IN_1/IN_2的输入
            GPIO_SetMode(GPIO_P3, GPIO_HighZ, GPIO_Pin_3);
            GPIO_SetMode(GPIO_P5, GPIO_HighZ, GPIO_Pin_5);
        }
        else //ACC引脚未接通
        {
            //恢复IN_1/IN_2的输入
            GPIO_SetMode(GPIO_P3, GPIO_PullUp, GPIO_Pin_3);
            GPIO_SetMode(GPIO_P5, GPIO_PullUp, GPIO_Pin_5);

            //判断IN_1/IN_2引脚是否为低电平,并控制蜂鸣器响声
            if(P33 == 0)
            {            
                pwm0 = PWM_NOW;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                
                pwm0 = PWM_NOW;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
            } 
            
            if(P55 == 0)
            {
                pwm0 = PWM_NOW;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                delay_sm(); 
                delay_sm();

                pwm0 = PWM_STOP;
                PWMn_Update(PCA0,pwm0);
                delay_sm();
                delay_sm();
                delay_sm();
                delay_sm();
            }
        }
    }
}

如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^