⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianji.c

📁 无刷电机控制器的控制电路的单片机程序,更详细说明见程序注释.
💻 C
📖 第 1 页 / 共 2 页
字号:
 	CR = th;			//1启动/0关闭PCA定时器	

}
void Con_Buzzer(uint ch1,uint ch2)			//蜂鸣器响起
{
	_Buzzer_5V=0;		//开蜂鸣器
	STC_Delay_1ms(ch1);
	_Buzzer_5V=1;		//关蜂鸣器
	STC_Delay_1ms(ch2);
}
//==============================STC12C4052PWM调速===========================
//作者:许XX					编写时间:20070808
//功能:
//入口:
//		
//出口:无
//影响资源:PWM输出脚:_PWM_Point
//==========================================================================
void PWM_Timing()			   //功能选择函数,主要是6个按键的处理程序
{
	uchar Control_Sign=0;//调速控制标志
	if((Control_Key&0x3f)!=0x3f)		//判断是否进入调速控制
	{
	   STC_Delay_1ms(10);
	   Control_Key|=0x3f;			//对控制器调控端口负值
	   //STC_Delay_1ms(1);
	   _nop_();
	   _nop_();
	   if((Control_Key&0x3f)!=0x3f)		//进入调速控制
	   {
	   		STC_Delay_1ms(1);
			Control_Sign=Control_Key&0x3f;			//保存控制端口值
	   		if(Control_BeginOrEnd==0)	//关机状态不相应
				Con_Buzzer(300,1);		 //蜂鸣器响
			switch(Control_Sign)	 //判断控制端口值,选择功能函数进行操作
			{
			 	case 0x1f : if((Time_EndWait==0)&&(Control_BeginOrEnd==0)) ConTime();break;	//进入时间调整
				case 0x3b : //进入电机正转
				case 0x2f : //进入电机反转
							if(Control_BeginOrEnd==0)
				  			ConZZorFZ(Control_Sign);
							break;	
				case 0x3d : if((Time_EndWait==0)&&(Control_BeginOrEnd==0))
							 ConSpeedup();
							break;	//进入电机加速
				case 0x37 : if((Time_EndWait==0)&&(Control_BeginOrEnd==0))
							 ConSlowdown();break;//进入电机减速
				case 0x3e : ConPower_KeyEnd();break;	//进入电源开关
				default : 
				while((Control_Key&0x3f)!=0x3f)		//按键消抖,看情况是否删除
				{ 
					Control_Key|=0x3f;
					_nop_();
					_nop_();
				}
				break;
			}
			/*while((Control_Key&0x3f)!=0x3f)		//按键消抖,看情况是否删除
			{ 
				Control_Key|=0x3f;
				_nop_();
				_nop_();
			}*/
			STC_Delay_1ms(50);		 //消抖动
	   }
	}
}
void ConTime()	//进入时间调整
{
	if(Time_SignSetup==0)		//判断是否进入定时操作
	{
		Time_Begin=1;		//确认进入定时操作
		Time_Mun+=5;
		if(Time_Mun==20)
		{
			Time_Mun=0;
			Time_Begin=0;	 //确认退出定时操作
		}
		Time_DSorDJS=1;				//显示倒计时
		Time_ShowAllow=1;			//标志可以显示
	}
}
void ConZZorFZ(uchar ZorF)		//进入电机正转或者反转
{
	if(ZorF==0x3b)		 //正传
	   Elect_ZZ=1;		//开始正传
	else if(ZorF==0x2f)
	   Elect_FZ=1;		//开始反转
	while((Control_Key&0x3f)!=0x3f)		//按键消抖,看情况是否删除
	{ 
		Control_Key|=0x3f;
		_nop_();
		_nop_();
	}
	Elect_ZZ=0;		//关闭正传	 这两句看是否加进ConFZ/ConZZ中
	Elect_FZ=0;		//关闭反传
}
void ConSpeedup()	//进入电机加速
{
	//uchar key[2];
	if(PWM_Pace!=20)
	{
		PWM_Pace++;
		//key[0]=PWM_Pace/0x0a;
		//key[1]=PWM_Pace-key[0]*0x0a;
		//_74LS164_Show(key,table,2);			//显示加速档数
		PWM_Out(PWM_Pace,1);
		Time_DSorDJS=0;				//显示档数
		Time_ShowAllow=1;			//标志显示器可以显示数值提示
		Time_SignSetup=1;				//禁止进入定时设置控制操作
		if(Time_Begin==1)
		{
			Time_Begin=0;			//禁止再次定时
			Ini_Timer(1);			//开定时器
		}
	}
}
void ConSlowdown()//进入电机减速
{
	//uchar key[2];
	if(PWM_Pace>1)
	{
		PWM_Pace--;
		//key[0]=PWM_Pace/0x0a;
		//key[1]=PWM_Pace-key[0]*0x0a;
		//_74LS164_Show(key,table,2);			//开机初始显示00
		PWM_Out(PWM_Pace,1);
		Time_DSorDJS=0;				//显示器显示档数
		Time_ShowAllow=1;			//标志显示器可以显示数值提示
	}
}
void Con_ShowDSorDJS(bit ShowDSorDJS)//显示器轮流显示倒计时时间或者是档数
{
	uchar _show_Sign;				//待显示的数值,倒计时时间或者是档数
	uchar key[2];
	if(Time_ShowAllow==1)			//判断是否进行数码管显示,1为显示,0为不显示
	{
		_show_Sign=Time_Mun;		//ShowDSorDJS=1时,显示倒计时数值   
		if(ShowDSorDJS==0)			//显示档数
		{
			_show_Sign=PWM_Pace;
		}
		key[0]=_show_Sign/0x0a;
		key[1]=_show_Sign-key[0]*0x0a;
		_74LS164_Show(key,table,2);			//显示档数
		Time_ShowAllow=0;					//清楚显示标志
	}
}
void ConPower_TmerEnd()	//使用定时器进行电源开/关操作,此时等待Power键按下关机
{
	if((Time_End == 1)&&(Time_EndWait == 1))   //等待定时器时间到
	{
		PWM_Out(0,0);			//关闭电机,停止转动
		Time_End = 0;			//清零0关闭电机标志
		Con_Buzzer(300,100);
		Con_Buzzer(300,100);
		Con_Buzzer(300,100);
		PWM_Pace = 0;
		Time_DSorDJS=0;				//显示器显示档数
		Time_ShowAllow=1;			//标志显示器可以显示数值提示
	}
	//WDT_CONTR = 0x3c;	//喂看门狗
}
void ConPower_KeyEnd()	//使用按键进行电源开/关操作
{
	if(Control_BeginOrEnd==1)	//关机状态不相应
		Con_Buzzer(300,1);		 //蜂鸣器响
	STC_Delay_1ms(500);
	Control_Key |= 0x3f;
	_nop_();
	_nop_();
	if((Control_Key&0x3f)==0x3e)
    {
		if(Control_BeginOrEnd==0)//现在处于开机状态,现在准备关机
		{
			Control_BeginOrEnd = 1;//现在处于关机状态
			Ini_WS_Control_End();		//关机初始化
		}
		else
		{
		  Control_BeginOrEnd = 0;//现在处于关机状态,准备开机
		  Ini_WS_Control_Begin();		//开机初始化
		}
	 }
	//}
}
void main(void)
{
	Ini_WS_Control_Begin();
  	while(1)
  	{
		if(Control_BeginOrEnd==0)  //给键盘负值
			Control_Key|=0x3f;
		else
			Control_Key|=0x01;	
		PWM_Timing();			  //功能选择函数,主要是6个按键的处理程序
		Con_ShowDSorDJS(Time_DSorDJS); //显示器轮流显示倒计时时间或者是档数
		ConPower_TmerEnd();	  //使用定时器进行电源开/关操作,此时等待Power键按下关机
  	}
}

/*********************************************************
作者:许XX						编写时间:20070810
函数名:_74LS164_Show				功能说明:74ls164的驱动程序
参数:
输入:地址一SBuf_one   地址二SBuf_two	   地址一内数据长度Mun_Long
	 SBuf_one的内容用SBuf_two的地址内容表示

输出:无
输出显示:SBuf_two[i]   SBuf_two[i-1] ...
**********************************************************/
/*void _74LS164_Show(uchar * SBuf_one,uchar * SBuf_two,uchar Mun_Long)         //数码管输出
{
	uchar i,j,temp;
	_74LS164_CLK=1;
	_74LS164_DS=1;
	
	for(i=0;i<Mun_Long;i++)
	{
		temp=SBuf_two[SBuf_one[Mun_Long-i-1]];
		if(Control_BeginOrEnd==1)		  //如果控制器处于关机状态,显示器不显示
		temp=0x00;		  //因为现在显示器只有2位,所以当高位显示为0时,此时数码管就不显示
		for(j=0;j<8;j++)
		{
			temp=temp<<1;
			_74LS164_CLK=0;
			_nop_();
			_nop_();
			_74LS164_DS=CY;
			_nop_();
			_nop_();
			_74LS164_CLK=1;
			_nop_();
			_nop_();
		}
	}
} */
void _74LS164_Show(uchar * SBuf_one,uchar * SBuf_two,uchar Mun_Long)         //数码管输出
{
	uchar i,j,temp;
	_74LS164_CLK=1;
	_74LS164_DS=1;
	
	for(i=0;i<Mun_Long;i++)
	{
		//temp=SBuf_two[SBuf_one[Mun_Long-i-1]];
		temp=SBuf_two[SBuf_one[i]];
		if(Control_BeginOrEnd==1)		  //如果控制器处于关机状态,显示器不显示
		temp=SBuf_two[10];		  //因为现在显示器只有2位,所以当高位显示为0时,此时数码管就不显示
		for(j=0;j<8;j++)
		{
			temp=temp<<1;
			_74LS164_CLK=0;
			_nop_();
			_nop_();
			_74LS164_DS=CY;
			_nop_();
			_nop_();
			_74LS164_CLK=1;
			_nop_();
			_nop_();
		}
	}
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -