www.pudn.com > motor.rar > Stepper.c, change:2005-09-15,size:2104b


/*****************************************/ 
/* Copyright (c) 2005, 通信工程学院      */ 
/* All rights reserved.                  */ 
/* 作    者:戴 佳						 */ 
/*****************************************/ 
 
#include "Stepper.h" 
 
/* 定时器0服务子程序 */ 
void time0() interrupt 1 using 1  // 用定时器0中断来产生CLK时钟 
{ 
	/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */ 
	TH0 = -T/256;   
	TL0 = -T%256; 
	CLK = ~CLK; 
} 
 
/* 键消抖延时函数 */ 
void delay(void) 
{ 
	uchar i; 
	for (i=300;i>0;i--); 
} 
 
/* 键扫描函数 */ 
uchar keyscan(void) 
{ 
	uchar scancode,tmpcode; 
	P1 = 0xf0;			 					// 发全0行扫描码 
	if ((P1&0xf0)!=0xf0)					// 若有键按下 
	{ 
		delay();							// 延时去抖动 
		if ((P1&0xf0)!=0xf0)				// 延时后再判断一次,去除抖动影响 
		{ 
			scancode = 0xfe; 
			while((scancode&0x10)!=0)		// 逐行扫描 
			{ 
				P1 = scancode;				// 输出行扫描码 
				if ((P1&0xf0)!=0xf0)		// 本行有键按下 
				{ 
					tmpcode = (P1&0xf0)|0x0f; 
 
					/* 返回特征字节码,为1的位即对应于行和列 */ 
					return((~scancode)+(~tmpcode)); 
				} 
				else scancode = (scancode<<1)|0x01;		// 行扫描码左移一位 
			} 
		} 
	} 
	return(0);								// 无键按下,返回值为0 	 
} 
 
/* 主程序 */ 
void main() 
{  
	uchar key; 
 
  	TMOD = 0x01;					// 设置定时器0工作模式 
 
  	EA = 1; 
	ET0 = 1; 
	 
	/* 设置为2相激励 */ 
	M1 = 0; 
	M2 = 0; 
 
	/* 设置为环形转向轨迹 */ 
	M4 = 1; 
	M5 = 1; 
	 
	EN = 0;							// 切断驱动输出 
	RET = 0;						// 归位输入无效 
	 
	CWB = 1;						// 初始设置为顺时针方向 
 
  	while(1) 
    { 
		key = keyscan();			// 调用键盘扫描函数 
		switch(key) 
   		{ 
      		case 0x11:				// 0行0列,启动键 
				EN = 1;				// 打开驱动输出 
				TH0 = -T/256;   	// 改变T可以改变步进电机转动速度   
  				TL0 = -T%256; 
				TR0 = 1;			// 定时器0开始计数 
				break; 
			case 0x21:				// 0行1列,停止键 
				TR0 = 0;			// 定时器0停止计数 
				EN = 0;				// 切断驱动输出 
				break;			 
			case 0x41:				// 0行2列,切换转向按键 
				CWB = ~CWB; 
				break; 
     		case 0x81:				// 0行3列,归位键 
				RET = 1;	 
				delay(); 
				RET = 0; 
				break; 
			default:break; 
		 } 
	} 
}