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

步进电机正反转设计

设计要求:
设置开始、停止以及正反转键。转速以及转向由数码管显示。

#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);
	
	}   

}









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值