肥话:
大家好,我是一个还没毕业的实习生,我创建这篇文章的初衷就是为了提示大家不要和我犯一样的错误,就算犯了,你可以来看下我的文章,希望能给到你一点帮助或者启发。
问题:
在使用STC8G1K08A_8PIN开发时,我的老大给了我这个板,让我做出效果来,很可惜我在弄完蜂鸣器和IN_1,IN_2之后,ACC的引脚我选择了P54这个特殊的引脚(为什么不选择P30或者P31,因为这两个引脚我用来下载代码了,然后不想这么麻烦,于是问题就发生了),根据我老大说的:当你的ACC接上了12V的电源线之后,该引脚就自动从高电平变成低电平(IN_1和IN_2也是通过接入12V电源线之后,对应的引脚会自动从高电平变成低电平然后进行判断的),好了,说到这里就很好判断了是吧,家人们我帮你们构想一下,只要while(1)循环经过下面的语句就可以达到项目要求了对吧:
while (1)
{
if (P54) // 当ACC未接通时
{
if (P33 == 0) //当IN_2被接入,蜂鸣器叫两下
{
pwm0 = PWM_NOW; //赋予PWM初值
PWMn_Update(PCA0, pwm0); //将初值放进对应通道的PWM中,使蜂鸣器发声
delay_sm(); //延时
pwm0 = PWM_STOP; //赋予PWM一个让蜂鸣器发出最微小声音的值,几乎听
//不到这样子就行了,然后这是我自己的宏定义
PWMn_Update(PCA0, pwm0);
delay_sm();
pwm0 = PWM_NOW;
PWMn_Update(PCA0, pwm0);
delay_sm();
pwm0 = PWM_STOP;
PWMn_Update(PCA0, pwm0);
delay_sm();
}
if (P55 == 0) //当IN_1被接入,蜂鸣器叫一下
{
pwm0 = PWM_NOW;
PWMn_Update(PCA0, pwm0);
delay_sm();
pwm0 = PWM_STOP;
PWMn_Update(PCA0, pwm0);
delay_sm();
}
}
if (P54 == 0) //当ACC被接通时,你想干嘛就干嘛
{
//随便写
}
}
大部分人都是想要按照这样的逻辑去写,并且我刚开始也是这样的,但是呢,我这样写了,然后下载到芯片里后,效果就完全不对应项目要求了,一开始我觉得是代码的问题,然后修修改改,我发现了,使用P54这个引脚去对应ACC的时候我根本不了解他的电平状态是怎么样的,于是我又觉得NMOS管的问题,因为那块板子的P54接着NMOS管的漏极,我真的见识很少,最后我去翻阅了手册我发现P54原来是一个复位脚,具体是这样:
原因分析:
P54这个引脚一开始会输出高电平一段时间,之后它的上拉电阻就关闭了,我也不知道是什么状态,于是我就去判断他的状态,可却始终判断不出来,然后我放弃了,我开始选用了P30这个引脚。
解决方案:
P54比较繁琐就别用它,我改用了P30这个引脚,当它未接入ACC时是高电平,接入后是低电平,完全符合我老大说的要求,于是就有了下面的代码(用的STC8G给的函数去开发的,寄存器这一块比较薄弱):
#include "config.h"
#include "GPIO.h"
#include "PCA.h"
#include "delay.h"
/************* 功能说明 ***************
*
下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
u16 pwm0,flag;
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
/******************** IO口配置 ********************/
void delay_sm(void)
{
int i = 50000000;
while(i--);
}
void Set_GPIO_P33_P55_Mode(int flag) //禁止IN_1和IN_2作用的代码
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
if(flag)
{
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); //初始化
}
else
{
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); //初始化
}
P33 = 1;
P55 = 1;
return;
}
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_0; //P30
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&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; //开启中断
flag = 0;
while (1)
{
delay_ms(1);
if(P30 == 0) //ACC引脚接通
{
Set_GPIO_P33_P55_Mode(0);
}
if(P30) //ACC引脚未接通
{
Set_GPIO_P33_P55_Mode(1);
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();
}
}
}
}
结尾:
我要说的就这么多,希望能帮到你或者给到你启发