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

📄 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>
uchar	 speed=50,step_length=10,thdata,tldata;
#include<Start.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;
bit		spdset;

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;		
		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;spdset=1;}						
		++sicnt;				
		if(sicnt==2){sicnt=0;SData_flag=1;}			
	}

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

bit	Operating(void)						//开机初始化程序
	{		uchar	key;
			bit		step_flag=0;			
			Show_Null();
			key=0;
			Show_Sign();				//显示===========
			Show_Speed_Set();			//显示"请预置转速 "
			speed=Get_Speed(speed);		//转速设置子程序			
			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(); 	//显示"请预置步长: " 					
				step_length=Get_Step_Length(step_length);	//预置步长											
			}
		return	step_flag;	
	}

void	main(void)
	{
		uchar	key,stl,stepcnt=0;
		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*4;				
				Show_Null();		//清屏
				Show_Sign();		//显示===
				//Show_Step();		//显示"步进"
				Show_Direction(direction);
				Show_Speed(speed);
				Show_StepCnt(stepcnt);//"显示"步进:XXX""步进数
				while(1)
					{					
						if(int_cnt==stl)
							{	ET0=0;								
								int_cnt=0;
								step_permit=0;
							}
						if(spdset){ST_Convert();Show_Speed(speed);spdset=0;}					
						key=0;
						key=GetKey();
						if(key==STEP)
							{	
								step_permit=1;
								int_cnt=0;								
								ET0=1;								
								Show_StepCnt(++stepcnt);//"显示":XXX""步进数
																																														
							}
						else	if((key==DIR)||sisdf)
							{
								direction=(~direction);
								Show_Direction(direction);
								sisdf=0;
							}
						else 	if(key==RESET)(*(void(*)())0)();//热启动	
					}
			}

		else			//全速运行方式	
			{														
				ET0=1;	
				run=0;
				//Show_Null();		//清屏
				//Show_Sign();		//显示===
				//Show_Start();		//显示"启动"						
				Show_Null();		//清屏
				Show_Sign();		//显示===
				Show_Running();		//显示"运行中"				
				Show_Direction(direction);
				Show_Speed(speed);
				while(1)
					{
						if(spdset)
							{	
								ST_Convert();
								Show_Speed(speed);
								spdset=0;
							}	
						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);
								Show_Speed(speed);								
								run=0;
							}
						else 	if(key==RESET)(*(void(*)())0)();//热启动									
					}							
			}
	}


/*
	void	Right_Show_Figure	(uchar	x,uchar	y,uchar	figure_num);
	void	Left_Show_Figure	(uchar	x,uchar	y,uchar	figure_num);
	void	Lcd_SetZ			(uchar z);
	void	Lcd_Off				(void);
	void  	Lcd_On				(void);
	void    IntRst				(void);
	void	Show_Null			(void);//清屏
	void	Show_Sign			(void);//显示===========
	void	Show_Greet			(void);//显示电机控制系统湖南师范大学XXX制作   
	bit		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_Direction		(bit	a);//显示"正反向"	
	void	Show_Speed			(uchar sp);//显示"转速:XX" 	
	void	Show_StepCnt		(uchar stp);//"显示"步进:XXX""步进数
*/

⌨️ 快捷键说明

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