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

📄 dianji.c

📁 利用单片机产生脉冲,通过驱动器控制步进电机
💻 C
字号:
/*===============================================================
 
  程序名称:四相步进电机驱动程序 						  
  -----------------------------------------------
  ( http://www.bluepw.com  http://www.bluepw.cn )


 Agni 07-EV开发板 步进电机与单片机接线方式:


 注:(1):主芯片AT89S52使用11.0592M晶振

	(2):Keil uV3 3.30编译运行通过

	(3):本例程在 Agni 07-EV 开发平台上成功运行通过

	(4):蓝极风电子技术网版权所有,只供学习参考,不得应用于商业用途.

==================================================================*/
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int

void keyscan(void);
uchar count=0;
uchar k;
uint t=20000;
bit dir=0;

/***以下定义四相步进电机正转代码*/
uchar code zheng[]={0x00,0x30,0x20,0x60,0x40,0xc0,0x80,0x90,0x10};

/***以下定义四相步进电机反转代码*/
uchar code fan[]={0x10,0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x00};

/*********主函数*************/
void main(void)
{
	TMOD=0x01;
	TH0=(65536-t)/256;
	TL0=(65536-t)%256;
	TR0=1;
	ET0=1;
	EA=1;
	P1=0xf0;  //初始化键盘
	P3_0=1;
	P3_1=1;
	while(1)
	{
		keyscan();
		switch(k)
		{
			/*****速度调节*********/
			case 2:	t+=1000; break;
			case 8:	t-=1000; break;

			/*****速度和转向调节***/
			case 4:	dir=0;   break;
			case 6:	dir=1;   break;
			default:break;
		}		
	}
}

/***********键盘去抖动**********/
void key_delay(void)	   
{
  int a;
  for(a=0;a<500;a++);
}

/***********键盘扫描************/
void keyscan(void)	 //键盘扫描函数
{
	uchar a;					
	P1 = 0xf0;				 //键盘初始化
	if(P1!=0xf0)			 //有键按下?
	{
		key_delay();		 //延时
		if(P1!=0xf0)		 //确认真的有键按下?
		{
			P1 = 0xfe;		 //使行线P2.4为低电平,其余行为高电平
			key_delay();
			a = P1;			 //a作为缓存
			switch (a)		 //开始执行行列扫描
			{
				case 0xee:k=0;break;
				case 0xde:k=1;break;
				case 0xbe:k=2;break;
				case 0x7e:k=3;break;
				default:P1 = 0xfd;	   //使行线P2.5为低电平,其余行为高电平

				a = P1;
				switch (a)
				{
					case 0xed:k=4;break;
					case 0xdd:k=5;break;
					case 0xbd:k=6;break;
					case 0x7d:k=7;break;
					default:P1 = 0xfb;	   //使行线P2.6为低电平,其余行为高电平

					a = P1;
					switch (a)
					{
						case 0xeb:k=8;break;
						case 0xdb:k=9;break;
						case 0xbb:k=10;break;
						case 0x7b:k=11;break;
						default:P1 = 0xf7;	  //使行线P2.7为低电平,其余行为高电平

						a = P1;
						switch (a)
						{
							case 0xe7:k=12;break;
							case 0xd7:k=13;break;
							case 0xb7:k=14;break;
							case 0x77:k=15;break;
							default:break;	   			   			        
						}
					}
				}
				break;
			}
		}
	}
}

/****使用定时器中断发出驱动信号*****/
void t0(void) interrupt 1
{
	EA=0;
	TH0=(65536-t)/256;
	TL0=(65536-t)%256;
	if(dir==0)
	{
		P2=zheng[count];
	}
	else
	{
		P2=fan[count];
	}
	count++;
	if(count==8)
	{
		count=0;
	}
	EA=1;
}

/****************** end ***********************/

⌨️ 快捷键说明

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