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

📄 motor_main.c

📁 单片机控制的步进电机 不是很完善 但是能实现基本功能
💻 C
字号:
#define	uchar	unsigned char
#define	uint	unsigned int
#define	low_speed	10
#define high_speed	100
#include<reg52.h>
#include<Key_Define.h>
#include<Get_Key_Declare.h>
#include<Lcd_Init_Declare.h>
//#include<Main_Define.h>	
bit		SData_flag=0;
bit		step_permit=0;
bit		direction,sisdf;//set direction flag
bit		stepflag=0;	//步进标志	
bit		run=0;		//全带运行标志
bit		stopflag=0;
uchar	int_cnt;
uchar	 speed=50,step_length=7,thdata,tldata;
sbit	AA=	P3^4;
sbit	AB=	P3^5;
sbit	BA=	P3^6;
sbit	BB=	P3^7;
uchar	cnt;
uchar	sicnt=0;			
//产生脉冲波形
void Timer0(void)interrupt 1 using 1
	{
		TL0=(tldata+10);
		TH0=thdata;						
		if(step_permit)		int_cnt++;							
		if(direction)		//反转
			{
				switch(cnt)
					{
						case 0:AA=1;AB=1;BA=0;BB=0;	break;
						case 1:AA=0;AB=1;BA=1;BB=0;	break;
						case 2:AA=0;AB=0;BA=1;BB=1;	break;
						case 3:AA=1;AB=0;BA=0;BB=1;	break;
						default:		break;
					}			
			}
		else	{
				switch(cnt)
					{
						case 0:AA=1;AB=1;BA=0;BB=0;	break;
						case 1:AA=1;AB=0;BA=0;BB=1;	break;
						case 2:AA=0;AB=0;BA=1;BB=1;	break;
						case 3:AA=0;AB=1;BA=1;BB=0;	break;
						default:		break;
					}			
			}
		++cnt;
		if(cnt==4)cnt=0;	
	}
void SeriCab(void)interrupt 4 using 2
	{
		uchar	sda;		
		
		/*if(RI)*/RI=0;				
		sda=SBUF;
		if(sda>=64)
			{
				if((sda<95)&&(run==0)){step_length=sda*3;stepflag=1;}
				else	if((sda==0x61)&&(SData_flag==1)){run=1;stopflag=0;}
				else	if(sda==0x63){direction=0;sisdf=1;}
				else	if(sda==0x64){direction=1;sisdf=1;}
				else	if((sda==0x62)&&(SData_flag==1)){run=0;stopflag=1;}
				else	if((sda==0x65)&&(SData_flag==1)){step_permit=1;}
						
			}
		else 		speed=sda*2;						
		++sicnt;
		//if((sicnt==1)&&(stepflag==0))SData_flag=1;		
		if(sicnt==2){sicnt=0;SData_flag=1;}			
	}

void	ST_Convert(void)//将转速转换为T0常数
	{
		//unsigned long tdata;
		uint	tdbuf;
		tdbuf=(1000000/speed)/192;		
		tdbuf=0xffff-tdbuf;
		tldata=(uchar)(tdbuf&0xff);
		thdata=(uchar)((tdbuf>>8)&0xff);		
	}

void	Get_Speed(void)//转速设置子程序
	{
		uchar	spl,sph,spk,key,spd;
		spd=speed;		
		do	{	
				//key=0;
				key=GetKey();				
				spk=spd/100;
				sph=(spd%100)/10;
				spl=spd%10;
				if(spk==0)
					{
						spk=10;
						if(sph==0)sph=10;
					}
				Right_Show_Figure(5,16,spk);
				Right_Show_Figure(5,24,sph);
				Right_Show_Figure(5,32,spl);				
				if((key==UP)&&(spd<high_speed))spd+=1;
				else if((key==DOWN)&&(spd>low_speed))spd-=1;				
			}while(key!=ENTER);	
		speed=spd;			
	}

void	Get_Step_Length(void)//预置步长
	{
		uchar	length=10,key,lthh,lthl;	
		do	{	
				key=GetKey();
				lthh=length/10;
				lthl=length%10;
				if(lthh==0)
					lthh=10;									
				Right_Show_Figure(5,24,lthh);
				Right_Show_Figure(5,32,lthl);				
				if((key==UP)&&(length<45))length+=1;
				else if((key==DOWN)&&(length>7))length-=1;				
			}while(key!=ENTER);
		length&=0x3f;
		step_length=length;
	}

bit	Operating(void)	//开机初始化程序
	{		uchar	key;
			bit		step_flag=0;			
			Show_Null();
			key=0;
			Show_Sign();		//显示===========
			Show_Speed_Set();	//显示"请预置转速 "
			Get_Speed();		//转速设置子程序
			//ST_Convert();		//将转速转换为T0常数
			Show_Null();
			Show_Operation_Model();
		while(key!=LEFT&&key!=RIGHT)
				key=GetKey();
			Show_Null();		
		 if(key==RIGHT)			//步进
			{		
				key=0;
				step_flag=1;				
				Show_Sign();		//显示===========
				Show_Step_Length(); //显示"请预置步长: " 					
				Get_Step_Length();	//预置步长											
			}
		return	step_flag;	
	}

void	main(void)
	{
		uchar	key,stl;
		IntRst();		
		Lcd_SetZ(1);	
		Lcd_Off();	
		Show_Null();
		Show_Sign();	//显示===========
		Show_Greet();
		Lcd_On();
		TMOD=0x21;		//T0工作在方式1,T1工作在方式2自动重装	
		TH1=0xF3;		//波特率设置;晶振12MHz;波特率为2400
		TL1=0xF3;		
		SCON=0X50;		//串行口工作在方式1,八位方式,允许接收
		PCON=0;			//SMOD设置为0
		EA=1;
		ES=1;  			//串行中断允许
		ET0=0;			//T0中断禁止
		TR1=1;

		while((key==0)&&(SData_flag==0))
				key=GetKey();		
		if(key)stepflag=Operating();
		ST_Convert();		//将转速转换为T0常数
		TH0=thdata;
		TL0=tldata;
		TR0=1;	
		Show_Null();
		Show_Sign();		//显示===========
		Show_Ready();		//显示"准备好:"	
		Show_Direction(direction);
		key=0;
		while((key!=START)&&(run==0))
				{	key=0;
					key=GetKey();
				}							
		if(stepflag)				//步进方式
			{	stl=step_length;				
				Show_Null();		//清屏
				Show_Sign();		//显示===
				Show_Step();		//显示"步进"
				while(1)
					{					
						if(int_cnt==stl)
							{	ET0=0;								
								int_cnt=0;
								step_permit=0;
							}					
						key=0;
						key=GetKey();
						if(key==STEP)
							{	
								step_permit=1;
								key=0;
								ET0=1;																														
							}
						else	if((key==DIR)||sisdf)
							{
								direction=(~direction);
								Show_Direction(direction);
								sisdf=0;
							}	
					}
			}

		else			//全速运行方式	
			{														
				ET0=1;
				//Show_Null();		//清屏
				//Show_Sign();		//显示===
				//Show_Start();		//显示"启动"						
				Show_Null();		//清屏
				Show_Sign();		//显示===
				Show_Running();		//显示"运行中"
				Show_Direction(direction);
				while(1)
					{
						key=0;
						key=GetKey();
						if((key==DIR)||sisdf)
							{
								direction=(~direction);
								Show_Direction(direction);
								sisdf=0;
							}
						else 	if((key==STOP)||stopflag)
							{	
								ET0=0;
								Show_Null();		//清屏
								Show_Sign();		//显示===	
								Show_Stop();		//显示"停止"
								Show_Direction(direction);
								stopflag=0;
							}
						else 	if((key==START)||run)
							{
								ET0=1;
								//Show_Null();		//清屏
								//Show_Sign();		//显示===
								//Show_Start();		//显示"启动"						
								Show_Null();		//清屏
								Show_Sign();		//显示===
								Show_Running();		//显示"运行中"
								Show_Direction(direction);								
								run=0;
							}									
					}						
			}
	}


/*
	void	Show_Null			(void);//清屏
	void	Show_Sign			(void);//显示===========
	void	Show_Greet			(void);//显示电机控制系统湖南师范大学XXX制作   
	void	Show_Operation_Model(void);//显示"请预置工作方式"1全速2步进  
	void	Show_Speed_Set		(void);//显示"请预置转速 "
	void	Show_Step_Length	(void); //显示"请预置步长: "   
	void	Show_Ready			(void);//显示"准备好:"  
	void	Show_Start			(void);//显示"启动" 
	void	Show_Running		(void);//显示"运行中"
	void	Show_Stop			(void);//显示"停止"
	void	Show_Step			(void);//显示"步进"
	void	Show_Direction		(bit a)//显示"正反向"
*/

⌨️ 快捷键说明

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