STC8G1K08A_8PIN开发的问题

肥话:

大家好,我是一个还没毕业的实习生,我创建这篇文章的初衷就是为了提示大家不要和我犯一样的错误,就算犯了,你可以来看下我的文章,希望能给到你一点帮助或者启发。 

问题:

 

在使用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();
			}
	 }
 }
}

结尾:

我要说的就这么多,希望能帮到你或者给到你启发

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值