/*原理基本与步进电机的调速原理相同,不同之处在于新增加了两个功能,即
控制步进电机的停止与运行两个功能。这两个功能通过另外设置一个停止标志位
来控制。*/
#include<reg52.h>
#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;	   
bit stopflag;	  //步进电机停止与转动的控制位
void delay(uchar t)
{
	while(--t);
}
void delayMS(uchar t)
{
	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<18)
				speed++;
	   }
	   else if(num==2)	//键二控制时间减
	   {
	   		if(speed>1)
				speed--;
	   }
	   else if(num==3)  //键三控制停止转动
	   {
	   		stopflag=1;
			OF
	   }
	   else if(num==4)	 //键四控制开始转动
	   {
	   		stopflag=0;
	   }
	   Data[0]=tabledu[speed/10];  //将speed的十位的段码存在Data[0]中。
	   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[i+f];
	wela=1;
	wela=0;

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

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

	display(0,8);
	if(!stopflag) //停止键判断
	{
		if(times==(20-speed))
		{
			times=0;
			switch(i)
			{
				case 0: A i++;break;   //一相励磁
				case 1: B i++;break;
				case 2: C i++;break;
				case 3: D i++;break;
				case 4: i=0;break;
			   	default:break;
			}
		}
		else
			times++;
	}
}
void init()
{
	TMOD=0X01;
	EA=1;
	ET0=1;
	TR0=1;
	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;
}

  

posted on 2011-11-18 19:56    阅读(406)  评论(0编辑  收藏  举报