步进电机调速原理

原理为:通过按键(键盘扫描)控制速度增减,从而改变延时长短
(定时器控制),从而达到调速的目的,数码管显示。


#include
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^0;
sbit dula=P2^1;
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[8];	  //定义字符数组,用以存储speed各个位段码的值
sbit d1=P1^0;	   //定义步进电机的端口
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
#define A {d1=1,d2=0,d3=0,d4=0;}   //1-2相励磁
#define B {d1=0,d2=1,d3=0,d4=0;}
#define C {d1=0,d2=0,d3=1,d4=0;}
#define D {d1=0,d2=0,d3=0,d4=1;}
#define AB {d1=1,d2=1,d3=0,d4=0;}
#define BC {d1=0,d2=1,d3=1,d4=0;}
#define CD {d1=0,d2=0,d3=1,d4=1;}
#define DA {d1=1,d2=0,d3=0,d4=1;}
#define OF {d1=0,d2=0,d3=0,d4=0;}
uchar speed=1; //初始化转速
void delay(uchar t)
{
	while(--t);
}
void delayMS(uchar t) // 大约延时1MS
{
	while(t--)
	{
		delay(245);
		delay(245);
	}							   
}
void init();
uchar keyscan();
void display(uchar f,uchar n);
void main()
{
	uchar num;  //用以存储按键的标号
	init();
	OF
	while(1)
	{
		num=keyscan();
		if(num==1)
		{
			if(speed<5)
				speed++;
		}
		else if(num==2)
		{
			if(speed>1)
				speed--;
		}
		Data[1]=tabledu[speed%10];//将speed个位的段码存放到Data[1]中
	}
}
void display(uchar f,uchar n)//数码管显示函数,循环从数码管的第一位显示到第八位
{
	static uchar i;
	P0=0;	 //消隐
	dula=1;
	dula=0;

	P0=tablewe[f+i]; 
	wela=1;
	wela=0;

	P0=Data[i];
	dula=1;
	dula=0;

	i++;
	if(i==n)
	    i=0;
}
void timer0() interrupt 1
{
	static uchar times,i;
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;

	display(0,8); //进一次中断数码管显示一次
	if(times==speed)
	{
		times=0;
		switch(i)
		/*等价于:
				A delayMS(speed);
				AB delayMS(speed);
				B delayMS(speed);
				BC delayMS(speed);
				C delayMS(speed);
				CD delayMS(speed);
				D delayMS(speed);
				DA delayMS(speed);   */ //其中times随speed变,所以达到调速的目的
		{								 //(按一次键,speed变一次,times跟着变一次,从而达到调速的目的)
			case 0:A i++;break;
			case 1:AB i++;break;
			case 2:B i++;break;
			case 3:BC i++;break;
			case 4:C i++;break;
			case 5:CD i++;break;
			case 6:D i++;break;
			case 7:DA i++;break;
			case 8:i=0;break;
			default:break;
		} 
	}
	else
		times++;
}
void init()	 //初始化定时器
{
	TMOD=0x01; //使用模式1,16位定时器
	EA=1; //开总中断
	ET0=1;//开定时器0中断
	TR0=1; //开定时器0的开关
	PT0=1; //打开优先级
}
uchar keyscan()	   //键盘扫描函数
{
	uchar value;
	if(P3!=0xff)
	{
		delayMS(10);//消抖
		if(P3!=0xff)
		{
			value=P3;
			while(P3!=0xff); //松手检测
			switch(value)
			{
				case 0xfe:return 1;break;
				case 0xfd:return 2;break;
				case 0xfb:return 3;break;
				case 0xf7:return 4;break;
				case 0xef:return 5;break;
				case 0xdf:return 6;break;
				case 0xbf:return 7;break;
				case 0x7f:return 8;break;
				default :return 0;break;
			}
		}
	} 
	return 0;
}							  

  

转载于:https://www.cnblogs.com/fengyepiaolei/archive/2011/11/18/2254584.html

你可能感兴趣的:(步进电机调速原理)