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

📄 dianji.c

📁 无刷电机控制器的控制电路的单片机程序,更详细说明见程序注释.
💻 C
📖 第 1 页 / 共 2 页
字号:
*******************************************************************/
#pragma optimize(8,size)
#pragma SYMBOLS
#pragma NOAREGS       
#pragma small

#include<reg52.h>
#include "STC12C4052.h"
#include <intrins.h>


#define uchar unsigned char
#define uint unsigned int
#define Control_Key	P1

sbit Control_Time=P1^5;	//控制定时	 初始值为1,检测是否控制定时操作

sbit Control_ZZ=P1^2;	//控制正转	 初始值为1,停止
sbit Control_FZ=P1^4;	//控制反转	 初始值为1,停止

sbit Control_Speedup=P1^1;	//控制加速	 初始值为1,检测是否加速
sbit Control_Slowdown=P1^3;	//控制减速	 初始值为1,检测是否加速

sbit Control_Power=P1^0;	//INT0 控制控制器的关闭/启动  初始值为1,检测是否加速

sbit _Buzzer_5V=P1^7;		//蜂鸣器   初始值为1,不报警蜂鸣器不响

sbit Elect_ZZ=P3^2;		//正转输出信号	初始值为1,断开继电器
sbit Elect_FZ=P3^3;		//反转输出信号	初始值为1,断开继电器

sbit _74LS164_CLK=P3^4;		//74LS164时钟线	 初始值为1
sbit _74LS164_DS=P3^5;		//74LS164数据线	 初始值为1

sbit _PWM_Point=P3^7;		//PWM输出脚	   初始值为低电平0,禁止电机正转

/*uchar code table[]={0xb7,0x06,0x73,0x57,0xc6,	//数码管显示0---9的数字代码
                            0xd5,0xf5,0x07,0xf7,0xd7};*/
uchar code table[]={0x88,0xf9,0x4c,0x68,0x39,	//数码管显示0---9的数字代码
                            0x2a,0x0a,0xf8,0x08,0x28,0xff};
uchar PWM_Pace;			//速度0--20档	初始值为0,表示0转速

uchar Time_Mun;	//给控制器定时时间有0、5、10、15分钟,0为初始值,表示没有开定时关机

uint Time_Addup;	//定时控制累加器变量,初始值为0

uchar bdata _Control_Sign;	//控制标志,包括显示方式,等待等
sbit Time_SignSetup = _Control_Sign^0;	//判断是否进入定时操作,0为可以进入,1为不能进入,初始值为0
sbit Time_Begin = _Control_Sign^1;	//确认有进行定时操作,0为没有进入定时操作,1为有进入,初始值0,
sbit Time_EndWait = _Control_Sign^2;	//倒计时完毕等待关机标志,其他操作禁止运行,0为不等待关机,1为等待 初始值0
sbit Time_End = _Control_Sign^3;	//倒计时完毕关闭电机标志,0为不等待关机,1为等待 初始值0
sbit Time_DSorDJS = _Control_Sign^4;	//档数和倒计时时间,分别显示标志位,0为单显示档数,1为显示倒计时时间
sbit Time_ShowAllow = _Control_Sign^5;	//可以显示数字,现在是5S显示一次,显示完毕后就清零0,显示器需要显示时就负值1
sbit Control_BeginOrEnd = _Control_Sign^6;		//关闭/启动控制器标志,0为控制器在开机状态,1为关机状态,初始值0

void Ini_WS_Control_Begin();//无刷电机控制器的开机初始化处理程序
void Ini_WS_Control_End();	//无刷电机控制器的关机初始化处理程序
void Ini_Timer(bit one);			//定时器初始化,并且开启
void End_Timer0();			//关闭定时器
void PWM_Out(uchar CCA,bit th);//设置PWM输出不同频率和占空比的方波,输出0--5V的电压,有20个等级
							   //每个等级0.25V
void Con_Buzzer(uint ch1,uint ch2);			//蜂鸣器响起
void PWM_Timing();				  //功能选择函数,主要是6个按键的处理程序
void ConTime();	//进入时间调整
//void ConZZ();		//进入电机正转
//void ConFZ();	//进入电机反转
void ConZZorFZ(uchar ZorF);		//进入电机正转或者反转
void ConSpeedup();	//进入电机加速
void ConSlowdown();//进入电机减速
void Con_ShowDSorDJS(bit ShowDSorDJS);//显示器轮流显示倒计时时间或者是档数
void ConPower_TmerEnd();	//使用定时器进行电源开/关操作,此时等待Power键按下关机
void ConPower_KeyEnd();	//使用按键进行电源开/关操作
void _74LS164_Show(uchar * SBuf_one,uchar * SBuf_two,uchar Mun_Long);//数码管输出



/*==============================STC12C4052系统初始化=======================
作者:许XX					编写时间:20070808
功能:无刷电机控制器的开机初始化处理程序
	  主要设置了禁止ALE输出,P1口和P3口的模式(为准双向口),给P1和P3口初始值
	  P1.0---P1.5设置为输出高电平1,进行键盘的检测
	  P1.6设置为低电平0,这个脚不用
	  P1.7设置为高电平1,控制蜂鸣器
	  初始化定时器,是2个定时器工作在定时器方式1,但是不开定时器
	  
入口:无
出口:无
影响资源:
==========================================================================*/
void Ini_WS_Control_Begin()					//无刷电机控制器的开机初始化处理程序
{
	uchar key[2]={0x00,0x00};			//键盘操作缓冲区
	AUXR = 0x01;						//禁止ALE输出
	P1M0 = 0x00;			//将IO口设置为准双向口
	P1M1 = 0x00;
	P3M0 = 0x00;
	P3M1 = 0x00;	
	P1=0xbf;
	P3=0x30;
	Ini_Timer(0);
 	_74LS164_Show(key,table,2);			//开机初始显示00
	End_Timer0();//关闭定时器
 	//PWM_Out(0,0);	//输出电压为0V	,第一个0表示输出电压,第二个0表示强制使PWM脚输出低电平0

	//WDT_CONTR = 0x3c;	//开看门狗
	/*对变量负值*/
	PWM_Pace = 0x00;	//速度0--20档	初始值为0,表示0转速

	Time_Mun = 0x00;	//给控制器定时时间有0、5、10、15分钟,0为初始值,表示没有开定时关机

	Time_Addup = 0x00;	//定时控制累加器变量,初始值为0

	_Control_Sign = 0x00;	//控制标志,包括显示方式,等待等
	Con_Buzzer(300,1);		//开机提示,长鸣一声
	//Time_SignSetup = 0;	//判断是否进入定时操作,0为可以进入,1为不能进入,初始值为0
	//Time_Begin = 0;	//确认有进行定时操作,0为没有进入定时操作,1为有进入,初始值0,
	//Time_EndWait = 0;	//倒计时完毕等待关机标志,其他操作禁止运行,0为不等待关机,1为等待 初始值0
	//Time_End = 0;	//倒计时完毕关闭电机标志,0为不等待关机,1为等待 初始值0
	//Time_DSorDJS = 0;	//档数和倒计时时间,分别显示标志位,0为单显示档数,1为显示倒计时时间
	//Time_ShowAllow = 0;	//可以显示数字,现在是5S显示一次,显示完毕后就清零0,显示器需要显示时就负值1,初始值为0
	//Control_BeginOrEnd = 0;		//关闭控制器标志,0为不关机,1为有关机,初始值0,
}
//=========================================================================
//作者:许XX					编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
void Ini_WS_Control_End()					//无刷电机控制器的关机初始化处理程序
{
	uchar key[2]={0x00,0x00};			//键盘操作缓冲区
	End_Timer0();//关闭定时器
	PWM_Out(0,0);	//关闭电机
 	_74LS164_Show(key,table,2);			//开机初始显示00
	P1=0x81;							//只有Power按键才能有按键作用
	P3=0x30;
	Con_Buzzer(300,1);		//关机提示
 	//PWM_Out(0,0);	//输出电压为0V	,第一个0表示输出电压,第二个0表示强制使PWM脚输出低电平0
//还要设置看门狗
/*				*/
}
//==============================STC12C4052系统初始化=======================
//作者:许XX						编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
void Ini_Timer(bit one)//定时器初始化,并且开启
{
	ET1 = 1;                          /* 允许定时器0中断 */
	ET0 = 0;                          /* 允许定时器1中断 */
	TMOD = 0x11;                      /* 定时器工作方式选择 */
	//TMOD = 0x01;                      /* 定时器工作方式选择 */
	TF1 = 0;
	TL1 = 0xb0;     				  /*晶振为6MHz,定时100ms*/
	TH1 = 0x3c;                       /* 定时器赋予初值 */
	//Time_Addup = 0;					  //给累计时变量为0值

	//TL1 = 0x06;     
	//TH1 = 0x00;                       /* 定时器赋予初值 */
 	EA = 1;                           /* 开总中断 */

	TR1 = one;                          /* 启动定时器 */
	//TR1 = 1;                          /* 启动定时器*/
}
void STC_Delay_1ms(uint delay_mun)		//1ms
{
	//uint i,j;
	TL0 = 0x0c;     
	TH0 = 0xfe;                       /* 定时器0赋予初值 */
	TF0 = 0;
	TR0 = 1;                          /* 启动定时器0*/
	do{
		while(!TF0);
		TR0=0;
		TF0=0;
		TL0 = 0x0c;     
		TH0 = 0xfe;                       /* 定时器0赋予初值 */
		TR0=1;
		--delay_mun;
	//WDT_CONTR = 0x3c;	//喂看门狗0.5s
	}while(delay_mun);
	TR0 = 0;                          /* 关闭定时器0*/
	//for(i=120;i>0;i--)
	//for(j=delay_mun;j>0;j--);
}
void End_Timer0()//关闭定时器1
{
	ET1 = 0;                          /* 允许定时器1中断*/
	TR1 = 0;                          /* 关闭定时器 */
	EA = 0;                           /* 开总中断 */
}
//==============================STC12C4052系统初始化=======================
//作者:许XX					编写时间:20070808
//功能:进入中断要100ms
//入口:无
//出口:无
//影响资源:
//==========================================================================
void timer1(void) interrupt 3 using 2
{
	TL1 = 0xb0;     				  /*晶振为6MHz,定时100ms*/
	TH1 = 0x3c;                       /* 定时器赋予初值 */
	TF1 = 0;						  /* 清楚中断标志 */
	
	if((++Time_Addup)==600)			 //一分钟进入一次
	{
		if((--Time_Mun)==0)
		{
		   Time_EndWait=1;				//关机标志,启动自动关机
		   Time_End=1;					//倒计时完后,关闭电机标志
		   TR1 = 0;						//关闭倒计时,准备关机
		   //Time_Addup = 0;			//清累计时变量为0
		}
		Time_Addup = 0;
	}
	if((Time_Addup%50)==0)		    //指示5S转换一次显示标志,倒计时时间和档数轮流显示
	{
		Time_ShowAllow=1;			//标志可以显示,每5S只能显示一次
		Time_DSorDJS=!Time_DSorDJS;	//轮流显示档数和倒计时时间,0位显示档数,1为显示倒计时时间
	}
}
//==============================STC12C4052系统初始化=======================
//作者:许XX					编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
/*void timer1(void) interrupt 3 using 1
{
	TL1=0x06;
	TH1=0x00;
} */

//==============================STC12C4052PWM设置===========================
//作者:许XX					编写时间:20070808
//功能:设置PWM输出不同频率和占空比的方波
//入口:CCA		调节占空比
//		th		0关PWM		1开PWM
//出口:无
//影响资源:PWM输出脚:_PWM_Point
//==========================================================================
void PWM_Out(uchar CCA,bit th)
{
	/*uchar code PWM[]={0xff,225,222,220,215,212,		//0.6V---1.6V
					  210,207,204,202,199,197,
					  194,192,189,187,184,181,
					  179,176,174,172};//20个档位的电压调速,分别是
					  //0,5%,10%...90%,95%,100%
	uchar code PWM[]={0xff,210,201,191,182,173,		//0.9V---4.5V
					  164,155,145,136,127,118,
					  108,90,81,72,62,53,
					  44,35,25};//20个档位的电压调速,分别是
					  //0,5%,10%...90%,95%,100%*/
	uchar code PWM[]={0xff,174,166,159,151,144,		//1.6V---4.5V
					  137,129,122,114,107,100,
					  92,85,77,70,63,55,45,37,25};//20个档位的电压调速,分别是
					  //0,5%,10%...90%,95%,100%
	CR = 0;			//关闭PCA定时器
		//CMOD = 0x02; //设置PCA定时器0000.0010
		CMOD = 0x00; //设置PCA定时器0000.0010  fsoc/12
		//CL = 0x00;
		//CH = 0x00;
		CL = 0xBC;		//37ms 频率为1.953KHz
		CH = 0xB7;
		//CCAP0L = 0xc0;	//设置CCAP0H
		//CCAP0H = 0xc0;	//设置占空比为25%
		CCAP0L = PWM[CCA];	//设置CCAP0H
		CCAP0H = PWM[CCA];	//设置占空比为
	 	CCAPM0 = 0x42;	//0100,0010  设置PCA为PWM模式0
	if(th==0)	
	{
	   _PWM_Point=0;
	   th=0;
	}

⌨️ 快捷键说明

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