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

📄 stepper.c

📁 课程设计_步进电机的控制
💻 C
字号:

#include "Stepper.h"

uchar keyscan(void);
void getkey(void);
void display(void);

char code str0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0xc0,0xbf,0xc0,0xc0,0xc0};//0,1,2,3,4,5,6,7,8,9,启动,结束,反向,无,无,复位
char code str1[]={0x28,0x14,0x24,0x44,0x12,0x22,0x42,0x11,0x21,0x41,0x81,0x82, 0x84,0x18,0x48,0x88};
int code str2[]={ 0,40,80,120,160,200,240,280,320,360,100000,0,0,0,0,0} ;  // 周期

static int p,flag_p;
unsigned int count,t;
char key;

/* 定时器0服务子程序 */
void time0() interrupt 1 using 1  // 用定时器0中断来产生CLK时钟
{
	/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
	TH0 = T/256;  
	TL0 = T%256;
	
	if(count!=0)
	 {
	  CLK = ~CLK;
	  count--;
	  if(p!=10||key!=0)
	  {

	   if(count%40==0)
	    { 
		flag_p--;
	     P0=str0[flag_p];  
	       LED1=0;
		for(t=0;t<=10000;t++);
		   LED1=1;
		   }
		  
		 }
	 }
	else
	 {
	    P0=0x89;TR0=0;
	 }

}

/* 键消抖延时函数 */
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 getkey(void)
{	
   key=keyscan();

for(p=0;p<=15;)
{
 if (key==str1[p])
  {
   break;
  
  }
 else 
 {
  p++;  
 
 }

}

}


//显示子程序

void display(void)
{

if(key==0)
{
P0=0xc0;
}
else
{
P0=str0[p];
}


}

/* 主程序 */
void main()
{ 
	uchar key;

  	TMOD = 0x01;					// 设置定时器0工作模式

  	EA = 1;
	ET0 = 1;
	
	/* 设置为2相激励 */
	M1 = 0;
	M2 = 0;

	
	EN = 0;							// 切断驱动输出
	RET = 0;						// 归位输入无效
	
	CWB = 1;						// 初始设置为顺时针方向

  	while(1)
    {
		key=keyscan();			    // 调用键盘扫描函数
		getkey();
		
		switch(key)
   		{
      	    case 0x81:				// 0行3列,启动键
				EN = 1;				// 打开驱动输出
				TH0 = -T/256;   	// 改变T可以改变步进电机转动速度  
  			    TL0 = -T%256;
				TR0 = 1;			// 定时器0开始计数
			   count=str2[p];
			   display();
				
				break;
			case 0x82:				// 1行3列,停止键
				TR0 = 0;			// 定时器0停止计数
				EN = 0;				// 切断驱动输出
			    break;			
			case 0x84:				// 2行3列,切换转向按键
				CWB = ~CWB;
				if(LED2==1)
				   LED2 = 0;
				else
				   LED2=1;
			    break;
     		case 0x88:				// 3行3列,归位键
				RET = 1;	
				delay();
				RET = 0;
			    break;
			case  0x11:             // 7
			   
		 	    TR0 = 1;			// 定时器0开始计数
			    count=str2[p];    
			    display();
				flag_p =p;
			    break;       
			case 0x21:              // 8
                 TR0 = 1;			// 定时器0开始计数
                 count=str2[p];
			     display();
				 flag_p =p;
			     break;
            case  0x41:             //9
				  
		 	      TR0 = 1;			// 定时器0开始计数
			      count=str2[p];
			      display();
				  flag_p =p;
			      break;
			case 0x12:              // 4
				 
		 	      TR0 = 1;			// 定时器0开始计数
			      count=str2[p];
			      display();
				  flag_p =p;
			      break;
			case  0x22:	            //5
			      
		 	      TR0 = 1;
			      count=str2[p];
				  flag_p =p;
			      display();
			      break;
		    case  0x42:	            //6
			  	  
		 	      TR0 = 1;			// 定时器0开始计数
			      count=str2[p];
				  flag_p =p;
			      display();
			      break;
			case	0x14:           //1
				  
		 	      TR0 = 1;			// 定时器0开始计数
			      count=str2[p];
				  flag_p =p;
			      display();
			      break;
			case	0x24:           //2
				 
		 	      TR0 = 1;			// 定时器0开始计数
			      count=str2[p];
				  flag_p =p;
			      display();
			      break;
			case	 0x44:          //3
				
		 	      TR0 = 1;			 // 定时器0开始计数
			      count=str2[p];
				  flag_p =p;
			      display();
			      break;
			default:
			      break;
		 }
	}
}

⌨️ 快捷键说明

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