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

📄 stepmotorcontroller.c.c

📁 实现对步进电机的控制
💻 C
字号:
	#include <AT89X51.h>
	
	sbit step=P1^0;
	sbit direct=P1^1;
	sbit speed=P1^2;
	sbit set=P3^2;
	sbit ok=P1^3;
	sbit led1=P1^4;
	sbit led2=P1^5;
	sbit led3=P1^6;
	sbit led4=P1^7;

	bit drt=0,dr0=0,tt=0;
	unsigned char stp=0,spd=1;
	unsigned int count;
	unsigned char n=0,m=0;
	unsigned int pvalue[4]={0x83,0x86,0x8c,0x89};		/**********步进电机正转输入值***********/
	unsigned int nvalue[4]={0x89,0x8c,0x86,0x83};		/**********步进电机反转输入值***********/
	
	void start(void);
	void wait(unsigned int z);
	void display(unsigned char x);
	void readkeys(void);

/*********************************************/
/******************主程序********************/
	void main(void)								
	{												
		IT0=1;
		EX0=1;												/*********设定中断方式*********/
		EA=1;
	    while(1)
		{
			if(ok==0) start();
		}
	}

/****************************************************/
/****************中断处理****************************/
	extern0() interrupt 0
	{
		readkeys();
		display(stp);
		start();
		
	}

/**************************************************/
/******************读键盘**************************/
	void readkeys(void)						
	{										
		display(stp);
		while(ok!=0)									/*************在按下OK键前读********/
		{
			count=300;
			wait(count);						    	/************去抖动**************/
			if(ok==0) break;
			if(step==0) 							/******************读步数值,边读边显示****************/
			{									
					count=300;
					wait(count); 
					if(step==0)
					{
						stp++;
						if(stp==100) stp=0;
						display(stp);
						count=10000;
						wait(count);
					}
			}	
			if(direct==0) 							/************读方向值,1为反转,0为正转,连读边显示**********/
			{	
				count=300;
				wait(count); 
				if(direct==0) 
				{	
					drt=~drt;
					display(drt);
					count=20000;
					wait(count);
				}
	 		}
			if(speed==0) 							/*******************读速度值,1~4倍速*********************/
			{	
				count=300;
				wait(count); 
				if(speed==0) 
				{	
						spd++;
						if(spd==5) spd=1;
						display(spd);
						count=20000;
						wait(count);
				}
	 		}
	
	
		}	
	}

/*******************************************************/
/*********************对设定值进行显示*****************/
	void display(unsigned char x)				
	{	
		unsigned char firstbit=0,secondbit=0;	
		if(x<10) P2=x+128;													/************显示一位数*************/
		else 
		{
			firstbit=x/10;													/************显示两位数*************/
			secondbit=x-firstbit*10;
			P2=secondbit+192;														/******显示个位*******/
			switch(firstbit)														/******显示十位*******/
			{
				case 1:led1=1;led2=0;led3=0;led4=0;break;
				case 2:led1=0;led2=1;led3=0;led4=0;break;
				case 3:led1=1;led2=1;led3=0;led4=0;break;
				case 4:led1=0;led2=0;led3=1;led4=0;break;
				case 5:led1=1;led2=0;led3=1;led4=0;break;
				case 6:led1=0;led2=1;led3=1;led4=0;break;
				case 7:led1=1;led2=1;led3=1;led4=0;break;
				case 8:led1=0;led2=0;led3=0;led4=1;break;
				case 9:led1=1;led2=0;led3=0;led4=1;break;
			}
			
		}		
	}

/****************************************************/
/*************************延时子程序*****************/
	void wait(unsigned int z)					
	{										
		unsigned int w;
		for (w=0;w<z;w++);
	}

/******************************************************/
/**********************启动步进电机********************/
	void start(void)                        
	{											
		unsigned char v;				
	   	tt=dr0 ^ drt; 
		while(stp!=0)
		{
			if(drt==0)							/*****************************正转*******************************/				
			{												
				if(tt==1)									/***判断上一次是正转还是反转******/
				{
					switch(m)
					{										/****反转,则寻找上次通电位置***/			
						case 0:n=0;						
						case 1:n=3;					
						case 2:n=2;
						case 3:n=1;
					}
				}
				for(v=1;v<=stp;v++)							/***********开始正转 ************/
				{
						P0=pvalue[n];
						n++;
						if(n==4) n=0;
						wait(40000/spd);
				}
				dr0=drt;
				break;					 
			}
			if(drt==1)						/********************************反转******************************/				
			{											
				if(tt==1)									/***判断上一次是正转还是反转*****/
				{
					switch(n)								/***正转,则寻找上次通电位置***/
					{
						case 0:m=0;
						case 1:m=3;
						case 2:m=2;
						case 3:m=1;
					}
				}
				for(v=1;v<=stp;v++)							/***********开始反转 ************/
				{
					
					P0=nvalue[m];
					m++;
					if(m==4) m=0;
					wait(40000/spd);
				}
				dr0=drt;
				break;				
			}
							
		}
	}

⌨️ 快捷键说明

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