历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2020年02月18日 | 89c51单片机控制两个步进电机正反转加减速

2020-02-18 来源:51hei

序有详细注释。

仿真原理图如下
0.png?imageView2/2/w/550

单片机源程序如下:

/*******************************************************************************

* 实 验 名: 步进电机实验


* 使用的IO: 电机用P1口,键盘使用P2.0、P2.1、P2.2、P2.3、P2.4、P2.5


* 按键功能:K1;正转  K2;反转  K3;低速转动  K4;高速转动  K5:电机切换  K6;停止


* 实验效果: 按下K1键,顺时针转,按下K2键,逆时针转,按下K3键,低速,按下K4键,高速。


按下K5键,转动的电机停止,并切换到控制另一个电机

按下K6键,转动的电机停止,按下K1或K2时,刚才停止的电机继续转动

*******************************************************************************/

#include "reg52.h"


//电机IO


#define GPIO_MOTOR P1            //宏定义 对端口进行操作,定义电机接口为P1


//sbit F1 = P1^0;


//sbit F2 = P1^1;


//sbit F3 = P1^2;


//sbit F4 = P1^3;


//sbit F5 = P1^4;


//sbit F6 = P1^5;


//sbit F7 = P1^6;


//sbit F8 = P1^7;                //另种操作,位操作,定义电机接口为P1.0~p1.7


//按键IO


sbit K1=P2^0;          //正转


sbit K2=P2^1;          //反转


sbit K3=P2^2;          // 减速


sbit K4=P2^3;          // 加速


sbit K5=P2^4;          // 电机切换


sbit K6=P2^5;          // 停止


unsigned char code FFW_X[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //X反转顺序


unsigned char code FFZ_X[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //X正转顺序


unsigned char code FFW_Y[8]={0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f}; //Y反转顺序


unsigned char code FFZ_Y[8]={0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}; //Y正转顺序


unsigned char Direction,Speed,X_Y=0,stop=0;           //  Direction  转向标志位,Speed 延时函数的参数,通过改变它大小来控制电机转速

                                                                                           //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机

void Delay(unsigned int t);                                           //stop为控制电机停止的标志位,但它为1时,电机停止


void Motor();                                                                   //电机旋转函数



/*******************************************************************************


* 函 数 名 : main


* 函数功能 : 主函数


* 输    入 : 无


* 输    出 : 无


*******************************************************************************/



void main(void)


{


unsigned char i;


Speed=30;                   //Speed 延时函数的参数,通过改变它大小来控制电机转速


while(1)


{


/********************检测按键K1是否按下***********************/

if(K1==0) //检测按键K1是否按下


{


Delay(1); //消除抖动


if(K1==0)


{


Direction=1;           //Direction 转向标志位,为1时为正转

stop=0;                   //按下K1时,对stop停止标志位清零,如果之前按下停止键,清零之后才能启动


}


while((i<200)&&(K1==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}


/********************检测按键K2是否按下***********************/


if(K2==0) //检测按键K2是否按下


{


Delay(1); //消除抖动


if(K2==0)


{


Direction=2;                  //Direction 转向标志位,为2时为反转

stop=0;                          //按下K1时,也对stop停止标志位清零,如果之前按下停止键,清零之后才能启动


}


while((i<200)&&(K2==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}


/********************检测按键K3是否按下***********************/

if(K3==0)//检测按键K3是否按下


{


Delay(1);//消除抖动


if(K3==0)


{


Speed=60;                                   //Speed 延时函数的参数,通过改变它大小来控制电机转速

                                                   //87行代码定义Speed=30;但按键K3按下后,Speed=60,这时转速就会降下来

}


while((i<200)&&(K3==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}



/********************检测按键K3是否按下***********************/


if(K4==0) //检测按键K4是否按下


{


Delay(1); //消除抖动


if(K4==0)


{


Speed=20;                         //Speed 延时函数的参数,通过改变它大小来控制电机转速

                                                   //87行代码定义Speed=30;但按键K4按下后,Speed=20,这时转速就会降下来升上去

}


while((i<200)&&(K4==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}


  if(K5==0)//检测按键K1是否按下


{


Delay(1);//消除抖动


if(K5==0)


   Direction=0;                                   //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机

   if(X_Y==0)                                   //当切换电机时,对Direction=0;对标志位清零,防止上个电机的转向影响本次所控电机

       X_Y=1;

   else

       X_Y=0;


}


while((i<200)&&(K5==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}


   if(K6==0)//检测按键K1是否按下


{


Delay(1);//消除抖动


if(K6==0)


   stop=1;                                   //stop为控制电机停止的标志位,但它为1时,电机停止


}


while((i<200)&&(K6==0))//检测按键是否松开


{


Delay(1);


i++;


}


i=0;


}


Motor();


}


}


/*******************************************************************************


* 函 数 名: Motor


* 函数功能: 电机旋转函数


* 输    入: 无


* 输    出: 无


*******************************************************************************/



void Motor()


{


unsigned char i;


for(i=0;i<8;i++)


{


if(Direction==1&&X_Y==0&&stop==0)                 //正转&Y电机&电机没按下停止


GPIO_MOTOR = FFW_Y[i]&0xf0;//取数据,‘&’按位与


if(Direction==2&&X_Y==0&&stop==0)                 //反转&Y电机&电机没按下停止


GPIO_MOTOR = FFZ_Y[i]&0xf0;


  if(Direction==1&&X_Y!=0&&stop==0)                 //正转&X电机&电机没按下停止


GPIO_MOTOR = FFW_X[i]&0x0F;//取数据


if(Direction==2&&X_Y!=0&&stop==0)                 //反转&X电机&电机没按下停止


GPIO_MOTOR = FFZ_X[i]&0x0f;


Delay(Speed); //调节转速


}


}


/*******************************************************************************


* 函 数 名  : Delay


* 函数功能  : 延时


* 输    入  : t


* 输    出  : 无


*******************************************************************************/


void Delay(unsigned int t)


{


unsigned int k;


while(t--)


{


for(k=0; k<80; k++)


{ }


}


}


推荐阅读

史海拾趣

DRS Technologies公司的发展小趣事

在全球电子行业快速发展的背景下,DRS面临着来自各方面的挑战。为了应对这些挑战,DRS不断加强研发投入,提高产品质量和服务水平。同时,公司也积极拓展国际市场,寻求更多的合作机会。通过这些努力,DRS在全球电子行业中保持了领先地位,并为未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上故事均为概述性质,具体细节和背景信息可能有所省略。

Analytic Instruments Corp公司的发展小趣事

随着技术的不断成熟和产品线的不断丰富,Analytic Instruments Corp开始积极拓展市场。公司通过与行业内的知名企业和研究机构建立合作关系,成功地将产品打入多个重要的应用领域。同时,公司还加大了品牌宣传力度,通过参加行业展会、举办技术研讨会等方式,提升了品牌知名度和影响力。

CYMBET公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。CYMBET公司深知这一点,始终将质量管理作为重中之重。公司建立了完善的质量管理体系,从原材料采购、生产制造到产品检测等各个环节都严格把控质量。同时,CYMBET还引进了先进的生产设备和检测仪器,确保产品的可靠性和稳定性。这种对质量的执着追求使得CYMBET的产品在市场上获得了良好的口碑和广泛的认可。

Einfochips公司的发展小趣事

Einfochips公司一直致力于嵌入式系统的创新与发展。在某一时期,该公司推出了Eragon600,一款基于Qualcomm Snapdragon 600处理器的全新嵌入式开发平台。这一平台的推出,标志着Einfochips在嵌入式系统开发领域取得了重要突破。Eragon600不仅具备强大的处理能力,还适用于多种行业,包括工业、安全与监控、信息、娱乐等。在多个领域的广泛应用,进一步巩固了Einfochips在嵌入式系统开发领域的领先地位。

锋鸣电子(Fengming)公司的发展小趣事

福斯特集团(FIRST SEMI)作为另一家以“FIRST”为品牌的企业,在半导体芯片领域也取得了显著成绩。该集团成立于2010年,总部位于中国深圳,是一家集半导体芯片研发、方案设计、封装制造、测试编带、产品销售为一体的国家级高新技术企业。公司产品广泛应用于无人机、机器人、笔记本电脑、液晶电视等多个领域。通过在全球设立代理销售公司,福斯特集团的销售网络覆盖全球多个国家和地区,服务合作客户超过3000家。

集创北方(CHIPONE)公司的发展小趣事

在显示芯片领域,集创北方是国产化替代的积极推动者。公司凭借自身在显示芯片领域的深入研究和创新实力,成功打破了国外厂商的技术垄断,为国内厂商提供了更多选择。同时,集创北方还积极参与行业标准制定,推动了国内显示芯片产业的健康发展。

问答坊 | AI 解惑

请教一下怎么用NT-TR01F模块~~急!!!

为什么把NT-TR01F模块一接为接收模式,模块就不断地产生数据,而且产生数据的速率很高。请各位高手帮帮忙解决一下,急啊~~谢谢啦!!!…

查看全部问答>

隐形眼镜显示器,你敢戴吗?

头戴式显示器有什么稀奇的,入眼式才厉害呢!华盛顿大学的研究小组将灯管与电路整合进了隐形眼镜。这种入眼式显示器与普通隐形眼镜一般大,可惜现在还点不亮。不过在能点亮之前,相信大家都很关心一个问题--佩戴舒适度。因此他们在兔子的红眼睛 ...…

查看全部问答>

DELPHI串口编程剖析

1.串口通信的基本原理: 一般计算机与外部设备通讯有两种方式: 并行传送(Parallel ):一次的传输量为8个位(1字节),通过并行端口,如打印机 串行传送(Serial ):一次只传输1个位,通过串行端口,如RS-232 位与字节的概念:  &n ...…

查看全部问答>

我该怎么办啊?真的要再重头来做嵌入式吗?太灰心

我们单位原来做的那一块极度萎缩,认为没有前途,根据大政方针要深入嵌入式开发,可是我对于这一块很不熟悉,对于C、DSP、硬件、linux内核都是重头入门,做了10多年的MIS,都快要人到中年了,现在又要重头入门,我该怎么办啊?真的要再重头来做嵌入 ...…

查看全部问答>

【低功耗】Altera低功耗Cyclone III FPGA实现了便携式应用的高度集成

     Altera公司(NASDAQ: ALTR)近日宣布,65-nm Cyclone® III FPGA系列推出新的8x8 mm2封装(M164),为设计人员提供单位电路板上容量最大的FPGA。设计人员现在可以充分利用Cyclone III器件的低功耗和大容量领先优势,设计实现消 ...…

查看全部问答>

CCSV6简易安装包安装教程

本帖最后由 Sur 于 2014-11-1 12:14 编辑 1、  首先要下载一个ccs_setup_win32安装包(8.72M)地址https://download.eeworld.com.cn/detail/Sur/5371212、  下面需要注意的是电脑里面的防病毒软件,如果没有关的话会有如下对 ...…

查看全部问答>

关于变压器的问题

请问各位大神、、我用信号发生器产生一个10V左右的方波信号,然后通过一个小的变压器(变比1;3),次级线圈接示波器,可以得到一个大约30V的方波信号,但是方波信号有点失真,这是怎么回事。还有 就次级线圈接我的超声波换能器,30V方波信号的电压 ...…

查看全部问答>

【OpenWRT】.7 问题小结

本帖最后由 le062 于 2015-10-15 10:11 编辑 1. 内核版本与官网15.05源不一致 解决:已将git中的master回溯到15.05,重新拉取编译即可。放在百度云中的dl文件夹也已更新。 2. nfs服务器不能开机自启动以及启动后局域网不能访问 在/etc/pro ...…

查看全部问答>

寻MTK蓝牙播放器方案

功能要求: 1,MT66XX平台,根据功能要求选取性价比最合适的。 2,蓝牙抗干扰性强 3,无线电广播 4,电源充放 Q:久陆七叁叁5零,重酬!! 此内容由EEWORLD论坛网友9673350原创,如需转载或用于商业用途需征得作者同意并注明出处 …

查看全部问答>

RC耦合中电阻电容+A、B、AB类功率放大

1.基本RC耦合放大电路         稳压电阻:为稳定偏置电压而设置         旁路电容: 阻断稳压电阻上的交流通过。不加还会影响到放大倍数,使放大倍数减小。 2.功率放大(使用变压 ...…

查看全部问答>