遇到的问题:用STC8G1K08A-8PIN开发,当ACC用12V的电源线接通之后,再接IN_1或者IN_2蜂鸣器都会响,目的是让蜂鸣器不响,当ACC没有接任何线时,再用12V的电源线接IN_2或者IN_1蜂鸣器响,
下面是我的代码和资料,请过目
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
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大模型与博主波罗歌共同编写:
根据你提供的代码和问题描述,我猜测可能存在以下原因:
针对这两种情况,你可以尝试以下方法来解决问题:
以下是示例代码来控制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();
}
}
}
}
如果我的回答解决了您的问题,请采纳!
不知道你这个问题是否已经解决, 如果还没有解决的话:==☆注:本节的实验源码是在“实验2-5-1:定时器0定时”的基础上修改。本节对应的实验源码是:“实验2-5-4:定时器3定时”。 ==