51单片机控制步进电机课设

步进电机正反转设计

设计要求:
设置开始、停止以及正反转键。转速以及转向由数码管显示。
【51单片机控制步进电机】 https://www.bilibili.com/video/BV1mf4y1J7iR/?share_source=copy_web&vd_source=7d72cfb77b74ed500ae232ab0425c3e5

#include <reg52.h>
/*
步进电机正反转设计
设计要求:
设置开始、停止以及正反转键。转速以及转向由数码管显示。

步距角=5.625°/64,其意思就是每64个脉冲步进电机就会转5.625度。
转一圈的脉冲数为 (360 / 5.625) * 64 = 4096 个脉冲 
计算发送 4096/4 个脉冲需要的时间t 转速 = 1/t*4  rad/s
注意:这里由于实际开发板驱动能力不足及电机性能不够,在此显示转速的导数 
	  即转一圈需要多少时间	 单位s/rad
*/

/*
参考资料:https://www.bilibili.com/read/cv11379422/
		  https://blog.csdn.net/wuhenyouyuyouyu/article/details/51612073
		  https://blog.csdn.net/sdkdlwk/article/details/106573784
		  https://blog.csdn.net/weixin_54092701/article/details/113484193

*/
#define uc unsigned
unsigned char code F_Rotation[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//正转表格
unsigned char code B_Rotation[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//反转表格	1000   1100 1011
uc code x[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
				0x6f,0x80,0x00,0x40};  // 小数点  全隐	 负号
int shumaguan[8]={0};	 // 第一位定义为mod 模式选择
//mod x x z . z z z
// mod 0 (停止)
// mod 1 (开始)  k2 正转   k3  反转  k4 停止	
// mod 2 (开始)  k2 加速	 k3  减速  k4 停止
// C51 没有bool
bit is_action = 0; //是否开始旋转
bit correct = 1;   //1 正转  0 反转



int hz = 150;

sbit k1 = P3^1;	  //模式选择 按下时 mod+1
sbit k2 = P3^0;
sbit k3 = P3^2;	  
sbit k4 = P3^3;

sbit lsa = P2^2;
sbit lsb = P2^3;
sbit lsc = P2^4;


int num = 0; //计算发送的脉冲数
int time = 0;


int mod = 0;  
float zhuansu = 0;


void delayms(int xms)//延时
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--);

}
void delay10um(int h) //延时10*h us
{
   while(h--);
}

// 数码管动态显示
void display()
{
	uc i;
	if(correct == 0) //反转
	{
		shumaguan[2] = 12;		//显示负号
	}
	else
	{
		shumaguan[2] = 11;
	}

	if(mod == 0)		  //停转
	{
		shumaguan[3] = 0;
		shumaguan[5] = 0;
		shumaguan[6] = 0;
		shumaguan[7] = 0;	
	}
	for(i=0;i<8;i++)
	{
		switch(7-i)
		{
			case (0): lsa=0,lsb=0;lsc=0;break;
			case (4): lsa=0,lsb=0;lsc=1;break;
			case (2): lsa=0,lsb=1;lsc=0;break;
			case (6): lsa=0,lsb=1;lsc=1;break;
			case (1): lsa=1,lsb=0;lsc=0;break;
			case (5): lsa=1,lsb=0;lsc=1;break;
			case (3): lsa=1,lsb=1;lsc=0;break;
			case (7): lsa=1,lsb=1;lsc=1;break;
		}
		P0=x[shumaguan[i]];
        delay10um(80);
        P0=0x00;
	}

}
//按键扫描函数
void scan()
{
	if(!(k1 & k2 & k3 & k4 ) )
	{
		delayms(10);
		if(!k1)
		{
			//mod +1
			mod = mod + 1 ;
			is_action = 1;
			if(mod == 3)
			{
				mod = 0;
			}
		}

		if(!k2)
		{
			is_action = 1;
			if(mod == 1)
			{
				//正转
				correct = 1;

			}
			if(mod == 2)
			{
				//加速
				hz = hz - 10 ;

			}
		}
		if(!k3)
		{
			if(mod == 1)
			{
				//反转
				correct = 0;

			}
			if(mod == 2)
			{
				//减速
				hz = hz + 10 ;

			}
		}
		if(!k4)
		{
			//stop!
			is_action = 0 ;
			mod = 0;
		}
	}
	while(!(k1 & k2 & k3 & k4 )) ;

   shumaguan[0] = mod ;
}


void motor_zheng(void)
{
  char i =0;
  for(i=0;i<8;i++)     
     {
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
	 num++;
     delay10um(hz);        //改变这个参数可以调整电机转速
	 }
}


void motor_fan(void)
{
	char i =0;
	for(i=0;i<8;i++)      
	 {
	 P1=B_Rotation[i];  //输出对应的相 可以自行换成反转表格
	 num++;
	 delay10um(hz);        //改变这个参数可以调整电机转速
	 }
}

void xuanzhuan()
{

   if(correct == 1) //正转
   {
	  motor_zheng();
   }
   if(correct == 0) //反转
   {
	  motor_fan();
   }
}

//定时器0 初始化 用于精确计时
void tim0_init()
{
    TMOD=0x01;//1.模式设置,00000001,采用的是定时器0,工作与式1(M1=0,M0=1)。
    TH0=(65536-1000)/256;  //2.定时器设置,每隔1毫秒发起一次中断。
    TL0=(65536-1000)%256;
    ET0=1;                  //3.开定时器0中断
    EA = 1;                 //4.开总中断
    TR0=1;                  //5.打开定时器
}
void jiexi(float t)
{
	char ge=0,gef=0,shif=0,baif=0,qianf=0;


	ge = t ;		
	gef = (t-ge)*10;
	shif = (t*1000 - ge*1000- gef*100)/10;
	baif = t*1000 - ge*1000- gef*100-shif*10;

	shumaguan[3] = ge;
	shumaguan[5] = gef;														    
	shumaguan[6] = shif;
	shumaguan[7] = baif;
			
	
}



void main()
{
	tim0_init();
	shumaguan[4] = 10;	 
	shumaguan[1] = 11;
	while(1)
	{
		scan();
		display();
		if(is_action != 0)
		{
			xuanzhuan();
		}
		
	}


}
 





void timer_0() interrupt 1		//?
{
	
    TH0=(65536-1000)/256;  //进入中断要重新设置定时器处置,要注意。
    TL0=(65536-1000)%256;

	time++ ;  //1ms 进入一次中断 
	if(num == 1024)
	{
		num = 0;
		zhuansu =  4*time/1000.0;
		time = 0;
		jiexi(zhuansu);
	
	}   

}









摘 要 在现代电子产品中,步进电机广泛应用于ATM机、喷绘机、刻字机、写真机、喷涂备、医疗仪器及备、计算机外及海量存储备、精密仪器、工业控制系统、办公自动化、机器人等领域。所以步进电机控制是一门很实用的技术。本实验主要是基于唐都——PIT试验箱的步进电机控制计。主要使用到了并行接口电路8255、LED七段数码管电路、8086cpu、步进电机等元件。主要是通过按键的不同来置直流电机转速、运行状态和方向。软件部分采用了汇编语言编写程序代码和C语言编写的步进电机控制程序,通过判断、跳转、循环、延时等基本技术实现。 此系统可以通过键盘输入相关数据, 并根据需要, 实时对步进电机工作方式进行置, 具有实时性和交互性的特点。该计可应用于步进电机控制的大多数场合 目录 摘要…………….…………………………………………...…...3 一. 计目的……………………………………….....…...4 二. 计题目名称及要求……………………………….....…….4 三. 实验备…………………………………………...…..…….4 四. 计的思想和实施方案……………………………..….…….5 五. 硬件原理图…………………………………………………….11 六. 典型程序模块及典型编程技巧…………………….…....…13 七. 计中遇到的问题及解决方法………………...………16 八. 程序流程图………………………………………….…......19 九. 汇编程序清单及程序注释…………………………..…..……..23 十. C语言程序清单及注释………………………….……..…..…30 十一. 收获体会………………………………….………..……..…37 十二. 参考文献………………………………………..….…..……38
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值