#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int 
sbit dula=P2^1;    //段选
sbit wela=P2^0;	   //位选
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	    //位码
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};				//段码
uchar Data[8];	    //存数位的段码
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;}
void delay(uchar t)			   //延时函数
{									  
	while(--t);
}
void delayMS(uchar t)
{
	while(t--)
	{
		delay(245);
		delay(245);
	}
}
void init();			  //初始化函数
void display(uchar f,uchar n);		  //显示函数
uchar speed;		  //控制延时长度,speed越大,延时越长,步进电机转速越慢
void main()
{
	uint i=512;		//控制步进电机转的圈数
	init();			//初始化定时器0

	EA=1;			//开总中断						
	EX0=1;			//开外部中断
	IT0=1;		    //边沿触发方式
	
	speed=3;		//初始化speed
	Data[0]=tabledu[speed/10];		 //将speed的十位段码装入Data[0]中
	Data[1]=tabledu[speed%10];		 //将speed的个位段码装入Data[1]中

	OF			//关闭任意线圈,步进电机不转动
	while(i--)		//步进电机转圈
	{
		A				  //1-2相励磁法
		delayMS(speed);
		AB
		delayMS(speed);
		B
		delayMS(speed);
		BC
		delayMS(speed);
		C
		delayMS(speed);
		CD
		delayMS(speed);
		D
		delayMS(speed);
		DA
		delayMS(speed);
	}
}
void init()					//初始化定时器
{
	TMOD=0x01;	   //T0方式,定时器模式,16位定时器
	EA=1;		 //开总中断
	ET0=1;	      //开定时器0中断
	TR0=1;	      //T0开始工作
	PT0=1;	      //定时器中断0优先级(优先)
}
void INTE() interrupt 0	   //外部中断0
{
	if(!INT0)			 //判断独立按键是否按下
	{
		delayMS(10);		//延时消抖
		if(!INT0)		     //再次判断独立按键是否按下
		{
			speed++;		  
			if(speed==20)
			{
				speed=3;
			}
			Data[0]=tabledu[speed/10];		   //将speed的十位段码装入Data[0]中
			Data[1]=tabledu[speed%10];		   //将speed的个位段码装入Data[1]中
		}
		while(!INT0);			  //松手检测
	}
}
void display(uchar f,uchar n)			//数码管显示函数
{
	static uchar i=0;		 //定义静态变量i
	P0=0;					 //消隐
	dula=1;
	dula=0;
	P0=0;
	wela=1;
	wela=0;

	P0=tablewe[i+f];		  //因为f恒为0,i为静态变量(保存上一次调用此函数时的i值)
	wela=1;				      //所以位选的值随i值变
	wela=0;
							  
	P0=Data[i];				  //段选的值随i值变,因为Data[i]的值只有0,1有取值,所以后面的都不显示
	dula=1;
	dula=0;

	i++;
	if(i==n)				 //n恒为8,所以此语句即为if(i==8)
	{
		i=0;
	}
}
void timer0() interrupt 1		//定时器0中断
{
	TH0=(65536-2000)/256;		//装初值,定时2MS
	TL0=(65536-2000)%256;

	display(0,8);				//显示
}

  

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