例说51单片机 C语言版 步进马达的控制

合集下载

51单片机汇编语言步进电机转速控制系统

51单片机汇编语言步进电机转速控制系统

大连理工大学本科设计报告题目:步进电机转速控制系统设计课程名称:单片机综合设计学院(系):电子信息与电气工程学部专业:班级:学号:学生姓名:成绩:2013 年7 月20 日题目:步进电机转速控制系统设计1 设计要求1)利用ZLG7290的键盘控制直流电机(或步进电机的转速、转向);2)也可以利用ADC模块(与电位器配合),利用电位器控制转速;3)利用ZLG7290的8位LED数码管显示电机转向、转速参数显示。

2 设计分析及系统方案设计实验要求使用步进电机作为被控制对象,由ZLG7290做人机对话平台,利用单片机的P1(8位)和P3(部分口线)构造系统。

实验最终实现功能、设计思路以及方案设计如以下几个小节所述。

2.1 系统设计实现功能根据设计要求、现有设备以及知识储备,完成功能如下:①由按键S1~S8实现转速切换,其中S1~S4正转,S5~S8反转②按键S16作为停止键,按下S10后步进电机停止转动,再按S1~S16步进电机按照按键对应转速以及转向转动③按键S10作为复位键,当按下S10后,无论当前处于何种状态,系统恢复至初始态④8为LED数码管显示当前步进电机转速(speed=0/1 1~4),转速前0表示正转,1表示反转⑤若按下停止键,数码管显示当前转速;若按下复位键,数码管显示初始态speed=002.2 设计思路本次的设计是LED显示与步进电机相结合以及若干功能键的组合的一种设计。

根据之前学习的按键中断显示实验和定时器实验,使用INT0和INT1,INT0作为按键中断,INT1作为定时器。

在主程序中实现LED初始显示、定时器计时初始、按键中断初始。

INT0中断调用中断服务子程序实现对按键键值的判断,并根据相应的按键值实现对应步进电机的变化,并显示该按键对应的转速。

INT1定时器中断根据INT0的按键键值,对定时器设定相应的初值,实现步进电机按规定的转速转动。

对于按键停止,则是利用中断优先级,当INT0的中断优先级高时,系统进入中断,此时INT1停止计时,也就实现了步进电机的停止,当改变定时器与按键中断的优先级时,即把INT0设为低优先级,INT1设为高优先级,步进电机重新开始转动。

基于51单片机实现的步进机控制系统

基于51单片机实现的步进机控制系统

基于51单片机实现的步进机控制系统摘要步进电机是一种进行精确步进运动的机电执行元件,它广泛地用于工业机械的数字控制。

为使系统的可靠性,通用性,可维护性以及性价比最优,根据控制系统功能要求及步进电动机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电动机的开环控制系统。

控制系统通过单片机存储器、I/O口、中断、键盘、LED显示器的扩展,步进电动机的环形分配器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计。

实现了四相步进电动机的正反转、急停等功能。

为实现单片机控制步进电动机系统在数控机床上的特殊应用,系统设计了两个外部中断,以实现步进电动机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动。

关键词:8051单片机;四相步进电动机;控制Realizes based on single chip microcomputer 51the stepping motorthe control systemABSTRACTThe stepping motor is a precision electromechanical incremental actuator.It widely uses the digital approach for control of industrial machines.For dependable,in general use that make system,can support sex an sex price ratio superior,divide the line according to control system funcion request and a function for entering electric motor applying environment,making sure designing system hardware with softwares, from but realizes to base on single chip microcomputer 8051 of four mutually the step enters the dynamoelectric opening the wreath the control the system.The control system passes the single saving maching,I/O in a machine, break off,the keyboard, the display of LED expands, a wreah for entering elecreic motor form assigns the machine,drive and the design of its protection electric circuit, man-machine connection electric circuit,interrupt system and reset circuit, single-voltage driver circuit and so on,realizes four mutually the step enters the electric motor positive and negative to turn, nasty stop to wait the function.For realizing single chip microcomputer control a special application for entering electric motor system in severalth contorling machine bed, the system designed two exteriors breaks off,toing realize a the step enters electric motor is in a certain time of again and again positive and negative turn the function, also count namely the knife that control the machine bed is automatic to enter to the sport.KEYWORD:single chip microcomputer 8051;four-phase stepper motor ;control目录1 绪论 (1)2 步进电动机原理及其控制技术 (3)2.1 步进电动机的原理 (3)2.2 步进电动机的特性 (4)2.2.1 步进电动机的静态指标及术语 (4)2.2.2 步进电机动态指标及术语 (5)2.2.3 步进电动机的振荡、失步及解决方法 (6)2.3 步进电动机的脉冲分配 (7)2.4 步进电动机的速度及其加减速控制 (7)2.4.1 步进电动机的速度控制 (7)2.4.2 步进电动机的加、减速控制 (8)2.5 步进电动机的驱动系统 (10)3 系统总体设计简介 (11)3.1 系统功能 (11)3.2 系统组成及其器件选择 (11)3.2.1 系统组成 (11)3.2.2 器件选择 (12)3.3 系统的可靠性/抗干扰设计 (12)3.3.1 软件的可靠性设计 (13)3.3.2 硬件抗干扰措施 (13)3.3.3 软件抗干扰措施 (13)4 硬件设计 (14)4.1 单片机控制步进机系统原理图及说明 (14)4.1.1 系统模块之一—四相混合式步进电动机环形分配器 (14)4.1.2 系统模块之二—四相步进电动机驱动及保护电路 (15)4.1.3 系统模块之三—人机接口电路 (17)4.1.4 系统模块之四—中断系统及复位电路 (17)4.1.5 系统模块之五—各档直流电源 (18)4.2 单片机原理 (18)4.2.1 MCS—51单片机 (18)4.2.2 MCS—51单片机的内部结构 (19)4.2.3 MCS—51单片机引脚功能 (20)4.2.4 MCS—51单片机的存储器结构 (22)4.2.5 时钟电路与时序 (26)4.2.6 并行输入/输出端口结构 (27)4.3 单片机的片外总线结构及其存储器扩展 (29)4.3.1 单片机的片外总线结构 (29)4.3.2 外部程序存储器扩展 (31)4.3.3 外部数据存储器扩展 (32)4.3.4 译码法 (33)4.4 I/O接口原理及其扩展 (33)4.5 系统外设接口 (37)4.5.1 键盘接口原理 (37)4.5.2 键盘的控制要求 (38)4.5.3 LED显示器接口原理 (39)4.6.1 3—8译码器:74LS138 (40)4.6.2 地址锁存器:74LS373 (41)5 软件设计 (42)5.1 软件设计流程图 (42)5.2 设计相关程序 (44)结论 (52)致谢............................................ 错误!未定义书签。

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。

所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图•注意:上图为共阳极接法,实际连接参考总体线路连接。

•驱动器信号端定义:PUL+:脉冲信号输入正。

( CP+ )PUL-:脉冲信号输入负。

( CP- )DIR+:电机正、反转控制正。

DIR-:电机正、反转控制负。

EN+:电机脱机控制正。

EN-:电机脱机控制负。

•电机绕组连接A+:连接电机绕组A+相。

A-:连接电机绕组A-相。

B+:连接电机绕组B+相。

B-:连接电机绕组B-相。

•电源连接VCC:电源正端“+”GND:电源负端“-”注意:DC直流范围:9-32V。

不可以超过此范围,否则会无法正常工作甚至损坏驱动器.•总体线路连接输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信号DIR+,DIR-③脱机信号EN+,EN-。

输入信号接口有两种接法,可根据需要采用共阳极接法或共阴极接法。

在这里我采用的是共阴极接法:分别将PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端);脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接入(不接也可,代码中未接,置空)。

按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。

注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路,以免损坏驱动器。

2、代码1.#include<reg51.h>2.#define MotorTabNum 53.unsigned char T0_NUM;4.sbit K1 = P3^5; // 启动5.sbit K2 = P3^4; // 反转6.sbit K3 = P3^3; // 加速7.sbit K4 = P3^2; // 减速8.sbit K5 = P3^1; //正反转9.10.sbit FX = P2^4; // 方向11.//sbit MotorEn = P2^5; // 使能12.sbit CLK = P2^6; // 脉冲13.14.inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};15.16.unsigned char g_MotorSt = 0; //17.unsigned char g_MotorDir = 0; //18.unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};19.20.signed char g_MotorNum = 0;21.22.void delayms(xms);23.void mDelay(unsigned int DelayTime);24.void T0_Init();25.26.void KeyScan(void);27.28.29.30.void main(void)31.{32.T0_Init();33.// MotorEn = 0; //34.FX = 0;35.while(1)36.{37.KeyScan(); //38.}39.40.41.}42.43.void T0_Init()44.{45.TMOD = 0x01;46.TH0 = (65535-100)/256; // 1ms47.TL0 = (65535-100)%256;48.EA = 1;49.ET0 = 1;50.// TR0 = 1;51.52.}53.54.void T0_time() interrupt 155.{56.// TR0 = 0;57.TH0 = (65535-100)/256;58.TL0 = (65535-100)%256;59.T0_NUM++;60.if(T0_NUM >= MotorTab[g_MotorNum]) //61.{62.T0_NUM = 0;63.CLK=CLK^0x01; //64.}65.// TR0 = 1;66.}67.68.69.//--------------------------70.void KeyScan(void)71.{72.if(K1 == 0)73.{74.delayms(10);75.if(K1 == 0)76.{77.g_MotorSt = g_MotorSt ^ 0x01;78.// MotorEn ^= 1;79.TR0 = 1;80.FX ^= 0; //反转81.}82.}83.84.if(K2 == 0)85.{86.delayms(10); //正转87.if(K2 == 0)88.{89.g_MotorDir = g_MotorDir ^ 0x01;90.FX ^= 1; //加速91.}92.}93.94.if(K3 == 0) //95.{96.delayms(5); //加速97.if(K3 == 0)98.{99.g_MotorNum++;100.if(g_MotorNum > MotorTabNum) 101.g_MotorNum = MotorTabNum; 102.}103.}105.if(K4 == 0) //106.{107.delayms(5); // 减速108.if(K4 == 0)109.{110.g_MotorNum--;111.if(g_MotorNum < 0)112.g_MotorNum = 0;113.}114.}115.116.if(K5 == 0) //117.{118.delayms(10); // 正反转119.if(K5 == 0)120.{121.g_MotorSt = g_MotorSt ^ 0x01; 122.g_MotorDir = g_MotorDir ^ 0x01; 123.MotorEn ^= 1;124.TR0 = 1;125.while(1)126.{127.FX ^= 1; //128.delayms(90000);129.FX ^= 0; //130.delayms(90000);131.}132.}133.}135.136.void delayms(xms)//延时137.{138.unsigned int x,y;139.for(x=xms;x>0;x--)140.for(y=110;y>0;y--);141.}3、常见问题解答•控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。

单片机控制步进电机系统(C语言源代码)

单片机控制步进电机系统(C语言源代码)

说明: 本系统中采用了四个按键,分别与 80s52 的四个引脚相连,分别为 LCDEN,RS,WR,RD;
分别实现的功能是电机加速,减速,正反转。键盘一旦按下则表示向单片机发送了有效信号, 单片机就相应的进行调节。对于键盘的键按下的时候分为几个步骤,当键盘按下的时候,接 通电路,键盘扫描检测低电平,但检测到低电平之后不能够判断键是否被按下,因为抖动可 能引起这个变化,所有大概延时 5~10ms 之后再进行检测。如果再次检测到低电平之后说明 键被按下。这个过程就是所说的消除抖动。 3.3 显示部分 如图 5
Key Words:SCM; stepper motor; system; drive
目录
引言 4 1 单片机控制步进电机的一般原理 4 1.1 步进电机 4
1.1.1 步进电机介绍 4 1.1.2 步进电机分类 5 1.1.3 技术指标 5 1.1.4 步进电机工作原理 5 1.2 单片机 7 2 步进电机驱动实现 8 2.1 简介 8 2.2 驱动选择 8 3 系统硬件设计 9 3. 1 单片机控制电机 9 3.2 键盘 9 3.3 显示部分 10 程序流程图 11 总结 12 致 谢 13 参考文献 13 附录 13 C 代码 13
In this paper, given the design of the system hardware circuit,software design, human-computer interaction and so on.and it given the details description of each functional module.the main contents include the following:
功能特性描述

51单片机实现步进电机控制

51单片机实现步进电机控制

摘要8051单片机控制步进电机进行简单的转速控制,包括启停变换转速控制等。

利用利用单片机实验箱以模拟电压提供电机转速设定值,使用并行模数转换芯片ADC0809 进行电压信号的采集和数据处理转换得到速度给定的数字量,通过单片机的P1 口控制步进电机的控制端,使其按一定的控制方式进行转动。

调节步进电机转速,使其与给定值相当,最后,利用ZLG7290模块驱动LED数码管显示速度设定值。

通过这个单片机控制系统的设计来掌握A/D转换的原理,了解步进电机的工作原理,掌握它的转速控制方式和调速方法,并且掌握LED显示原理和ZLG7290模块的使用方法,用LED数码管显示模数转换的结果,设计电路的硬件接线图和实现上述要求的程序。

最后实现通过改变模拟电压就可以改变步进电机的转速控制,并且在LED 数码管上显示步进电机的转速这一功能。

关键词:51单片机调速步进电机LED显示绪论在进行51单片机的学习和实验过程中曾利用51单片机对步进电机进行过简单的控制,包括利用单片机试验箱对步进电机进行转角控制,方向控制等。

即按照设定的转动角度步进电机进行动作,来实现步进电机的实时控制,通过设定的方向来实现步进电机的方向反转控制等,并利用利用ZLG7290模块驱动LED数码管显示步进电机的设定值与步进电机实际所转过过的角度,同时显示步进电机的旋转方向等。

这次所进行的步进电机转速控制系统是对步进电机的另一种控制,即实现步进电机的转速控制而不是单单的转动角度控制,并且是通过模拟量输入来时时的控制步进电机的转速。

并且通过数码管来显示出所设定的步进电机的转速。

第一章系统程序及分析1.1对步进电机控制系统的设计要求进行设计,主程序程序如下:#include<reg51.h>#include"VIIC_C51.h"#include"zlg7290.h"sbit PA=P1^0;sbit PB=P1^1;sbit PC=P1^2;sbit PD=P1^3;sbit SDA=P1^7;sbit SCL=P1^6;sbit RST=P1^4;sbit KEY_INT=P1^5;unsigned char xdata *port;unsigned char count,count1=0,c[3],n;/*****************ADC0809*******************************************/int1()interrupt 2{count=*port;*port=0;}/*******************************************************************//*****************延迟函数*****************************************/delay(unsigned int t){unsigned int i;for(i=0;i<t;i++){TMOD=0X11;TH0=-500/256;TL0=-500%256;TR0=1;while(TF0!=1);TF0=0;}}/*****************脉冲函数********************************************/ time1()interrupt 3{if(count==0X00)count1=4;TH1=-3*1000000/(256*count);TL1=-3*1000000%(256*count);switch(count1){ case 0:{PA=1;PB=1;PC=0;PD=0;}break;case 1:{PA=0;PB=1;PC=1;PD=0;}break;case 2:{PA=0;PB=0;PC=1;PD=1;}break;case 3:{PA=1;PB=0;PC=0;PD=1;}break;default:{PA=0;PB=0;PC=0;PD=0;}}count1++;if(count1>=4){count1=0;}}/************************主函数*******************************************/ main(){ RST=0;delay(1);RST=1;delay(10);port=0x7ff8;EA=1;ET1=1;ET0=1;TMOD=0X11;TH1=-100000/256;TL1=-100000%256;TR1=1;EX1=1;IT1=1;*port=0;while(1){c[0]=count/100;c[1]=count%100/10;c[2]=count%10;for(n=0;n<3;n++)ZLG7290_SendCmd(0x60+(2-n),c[n]);}}1.2程序分析:程序的开头包含了3个头文件,第一个头文件<reg51.h>中对所有的特殊功能寄存器进行了SFR定义,只要引用了<reg51.h> 就可以直接引用特殊功能寄存器名。

基于51单片机的步进电机控制系统设计

基于51单片机的步进电机控制系统设计

基于51单片机的步进电机控制系统设计步进电机是一种特殊的直流电动机,具有定角度、定位置、高精度等特点,在许多领域得到广泛应用,如机械装置、仪器设备、医疗设备等。

本文将基于51单片机设计一个步进电机控制系统,主要包括硬件设计和软件设计两部分。

一、硬件设计步进电机控制系统的硬件设计主要包括51单片机、外部电源、步进电机驱动模块、以及其他辅助电路。

1.51单片机选择由于步进电机控制需要执行复杂的算法和时序控制,所以需要一个性能较高的单片机。

本设计选择51单片机作为主控芯片,因为51单片机具有丰富的外设接口、强大的计算能力和丰富的资源。

2.外部电源步进电机需要较高的电流供给,因此外部电源选择稳定的直流电源,能够提供足够的电流供电。

电源电压和电流的大小需要根据具体的步进电机来确定。

3.步进电机驱动模块步进电机驱动模块是连接步进电机和51单片机的关键部分,它负责将51单片机输出的脉冲信号转化为对步进电机的驱动信号,控制步进电机准确转动。

常用的步进电机驱动芯片有L297、ULN2003等。

4.其他辅助电路为了保证步进电机控制系统的稳定运行,还需要一些辅助电路,如限流电路、电源滤波电路、保护电路等。

这些电路的设计需要根据具体的应用来确定。

二、软件设计1.系统初始化系统初始化主要包括对51单片机进行外部中断、定时器、串口和IO 口等初始化设置。

根据实际需求还可以进行其他模块的初始化设置。

2.步进电机驱动程序步进电机的驱动程序主要通过脉冲信号来控制电机的转动。

脉冲信号的频率和脉冲宽度决定了电机的转速和运行方向。

脉冲信号可以通过定时器产生,也可以通过外部中断产生。

3.运动控制算法步进电机的运动控制可以采用开环控制或闭环控制。

开环控制简单,但无法保证运动的准确性和稳定性;闭环控制通过对电机转动的反馈信号进行处理来调整脉冲信号的生成,从而实现精确的运动控制。

4.其他功能设计根据具体的应用需求,可以加入其他功能设计,如速度控制、位置控制、加速度控制等。

基于51单片机的步进电机控制系统设计与实现

基于51单片机的步进电机控制系统设计与实现

步进电机工作原理
步进电机是一种基于磁场的控制系统,工作原理是当电流通过定子绕组时,会 产生一个磁场,该磁场会吸引转子铁芯到相应的位置,从而产生一定的角位移。 步进电机的角位移量与输入的脉冲数量成正比,因此,通过控制输入的脉冲数 量和频率,可以实现精确的角位移和速度控制。同时,步进电机具有较高的分 辨率和灵敏度,可以满足各种高精度应用场景的需求。
二、系统设计
1、硬件设计
本系统主要包括51单片机、步进电机、驱动器、按键和LED显示等部分。其中, 51单片机负责接收按键输入并控制步进电机的运动;步进电机用于驱动负载运 动;驱动器负责将51单片机的输出信号放大,以驱动步进电机。LED显示用于 显示当前步进电机的状态。
2、软件设计
软件部分主要包括按键处理、步进电机控制和LED显示等模块。按键处理模块 负责接收用户输入,并根据输入控制步进电机的运动;步进电机控制模块根据 按键输入和当前步进电机的状态,计算出步进电机下一步的运动状态;LED显 示模块则负责实时更新LED显示。
三、系统实现
1、按键输入的实现
为了实现按键输入,我们需要在主程序中定义按键处理函数。当按键被按下时, 函数将读取按键的值,并将其存储在全局变量中。这样,主程序可以根据按键 的值来控制步进电机的转动。
2、显示输出的实现
为了实现显示输出,我们需要使用单片机的输出口来控制显示模块的输入。在 中断服务程序中,我们根据设定的值来更新显示模块的输出,以反映步进电机 的实时转动状态。
基于单片机的步进电机控制系统需要硬件部分主要包括单片机、步进电机、驱 动器、按键和显示模块等。其中,单片机作为系统的核心,负责处理按键输入、 控制步进电机转动以及显示输出等功能。步进电机选用四相八拍步进电机,驱 动器选择适合该电机的驱动器,按键用于输入设定值,显示模块用于显示当前 步进电机的转动状态。

步进电机控制程序(c语言51单片机)

步进电机控制程序(c语言51单片机)

// pri_dj = Pme );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one _round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
while ( key_puse & key_clear ); delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break; }
while( !key_puse ); delay(8ms);
while( !key_puse ); }
set_display_num(); for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0; P0 = P0 | LEDBuf[i] ; if(i==0) led_1000 = 0; //P0^4 if(i==1) led_100 = 0; //P0^5 if(i==2) led_10 = 0; //P0^6 if(i==3) led_1 = 0; //P0^7
delay ( 1ms ); tmp = (~(P2 | 0xF0)); P2 = 0x7F; // 0111 1111
delay ( 1ms ); tmp = (~(P2 | 0xF0)) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num;

51单片机驱动步进电机的方法

51单片机驱动步进电机的方法

51单片机驱动步进电机的方法一、步进电机简介步进电机是一种将电脉冲转化为角位移的执行机构,广泛应用于各种自动化设备中。

其工作原理是,当一个脉冲信号输入时,电机转动一个步距角,从而实现电机的精确控制。

二、51单片机驱动步进电机的方法1、硬件连接需要将51单片机与步进电机连接起来。

通常,步进电机需要四个引脚,分别连接到单片机的四个GPIO引脚上。

同时,还需要连接一个驱动器来提高电机的驱动能力。

2、驱动程序编写接下来,需要编写驱动程序来控制步进电机的转动。

在51单片机中,可以使用定时器或延时函数来产生脉冲信号,然后通过GPIO引脚输出给电机。

同时,还需要设置电机的步距角和转向,以保证电机的精确控制。

3、示例程序以下是一个简单的示例程序,用于演示如何使用51单片机驱动步进电机:cinclude <reg52.h> //包含51单片机的头文件sbit motorPin1=P1^0; //定义连接到P1.0引脚的电机引脚sbit motorPin2=P1^1; //定义连接到P1.1引脚的电机引脚sbit motorPin3=P1^2; //定义连接到P1.2引脚的电机引脚sbit motorPin4=P1^3; //定义连接到P1.3引脚的电机引脚void delay(unsigned int time) //延时函数unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);void forward(unsigned int step) //正转函数motorPin1=0;motorPin2=0;motorPin3=0;motorPin4=0; //清零电机引脚delay(step); //延时一段时间motorPin1=1;motorPin3=1;motorPin2=0;motorPin4=0; //设置转向和步距角delay(step); //延时一段时间void backward(unsigned int step) //反转函数motorPin1=0;motorPin2=0;motorPin3=0;motorPin4=0; //清零电机引脚delay(step); //延时一段时间motorPin2=1;motorPin4=1;motorPin3=0;motorPin1=0; //设置转向和步距角delay(step); //延时一段时间void main() //主函数unsigned int step=1000; //设置步距角为1000微步forward(step); //正转一圈backward(step); //反转一圈while(1); //循环等待,保持电机转动状态在这个示例程序中,我们使用了四个GPIO引脚来控制步进电机的转动。

51单片机控制的步进电机C语言程序

51单片机控制的步进电机C语言程序

51单片机控制的步进电机C语言程序用的是L298驱动的和ULN2003一样,你把它换成2003就行拉#include <AT89X51.H>unsigned char codetable[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0x f3,0x00};unsigned char temp,temp_old;unsigned char key;unsigned char i,j,k,m,s;void delay(int i){for(m=i;m>0;m--)for(j=250;j>0;j--)for(k=10;k>0;k--);}void saomiao(){P3=0xff;P3_4=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=4;break;}temp=P3;temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;P3_5=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}temp=P3;temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}}void main(void){while(1){saomiao();if(key==1){ P1=0;P2=0;saomiao();}if(key==2){temp_old=key;for(s=0;s<8;s++){ P2=table[s];P1_4=0;delay(13);saomiao();if(key!=temp_old){P1_4=1;break;}}}if(key==3){temp_old=key;for(s=0;s<8;s++){ P2=table[s];P1_5=0;delay(5);saomiao();if(key!=temp_old){P1_5=1;break;}}}if(key==4){temp_old=key; for(s=0;s<8;s++){ P2=table[s];P1_6=0;delay(20);saomiao();if(key!=temp_old){P1_6=1;break;}}}if(key==5){temp_old=key;for(s=9;s<17;s++){ P2=table[s];P1_7=0;delay(13);saomiao();if(key!=temp_old){P1_7=1;break;}}}if(key==6){temp_old=key;for(s=9;s<17;s++){ P2=table[s];P1_5=0;delay(5);saomiao();if(key!=temp_old){P1_5=1;break;}}}if(key==7){temp_old=key;for(s=9;s<17;s++){ P2=table[s];P1_6=0;delay(20);saomiao();if(key!=temp_old){P1_6=1;break;}}}}}C语言程序源代码#include <REGX51.H> // 51寄存器定义#include "intrins.h"#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相#define discode P0 //显示代码控制端口#define uchar unsigned char //定义无符号型变量#define uint unsigned intsbit en_dm=P3^0; //显示代码锁存控制sbit en_wk=P3^1; //位控锁存控制uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//电机正转uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //电机反转uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示字段uint code Levspeed[5]={500,400,300,200,100};//电机速度等级uchar Hscan,speedcount;//Hscan行扫描,speedcount 速度等级计数uint uu; //频率计数uint step,setstep; //step:电机步伐计数,setstep:手动设置电机步伐uint speed=500; //电机初始速度uchar count;uchar flag[5];uchar butcount; //按键次数//****************************************//flag[0] 正转标志//flag[1] 反转标志//flag[2] 加速标志//flag[3] 减速标志//flag[4] 设置标志//****************************************Delay1mS(unsigned int tt) //延时1ms “Delay1mS”延时子程序,用循环语句延时。

51单片机控制步进电机

51单片机控制步进电机

设计方案与原理1 设计方案设计一个51单片机四相步进电机控制系统要求系统具有如下功能:(1)由I/O口产生的时序方波作为电机控制信号;(2)信号经过驱动芯片驱动电机的运转;(3)电机的状态通过键盘控制,包括正转,反转,加速,减速,停止和单步运行。

2 设计原理步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。

步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。

从结构上看,步进电机分为三相、四相、五相等类型,本次设计的是四相电机。

四相步进电机的工作方式有单四拍、双四拍和单双八拍三种。

在本次设计中,我们使用的是四相单八拍的工作方式。

通过P1口给A,B,C,D四相依次输出高电平即可实现步进电机的旋转,通过控制两次输出的间隔,即可实现对步进电机的速度控制。

图 2.1 步进电机内部结构截图根据步进电机的相关相序表我们可以正常的控制电机的步进运行。

3 硬件设计根据设计要求和设计原理,我们可以绘制出基本的功能方框图,以便之后我们连接实际电路时的方便和可靠。

用键盘控制具体的功能模块,这样更能直观方便的控制整体的系统,使其达到我们预期的操作效果。

图3.1中简单描述了整个单片机系统的控制模式和控制流程,包括通过时钟电路和键盘电路,来控制ULN2003驱动电机动作。

图表图 3.1 硬件电路功能方框图4 电路原理图4.C程序代码#include <reg52.h>#define KeyPort P3#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量sbit A1=P1^0; //定义步进电机连接端口sbit B1=P1^1;sbit C1=P1^2;sbit D1=P1^3;#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//DA相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed=1;bit StopFlag;void Display(unsigned char FirstBit,unsigned char Num);void Init_Timer0(void);unsigned char KeyScan(void);/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t)while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/ main(){unsigned int i=512;//旋转一周时间unsigned int n=0;unsigned char num,vo,v;Init_Timer0();Coil_OFF;while(1) //正向{num=KeyScan(); //循环调用按键扫描if(num==1)//第一个按键,速度等级增加{if(Speed<15)Speed=Speed+2;}if(num==2)//第二个按键,速度等级减小{if(Speed>1)Speed=Speed-2;}if(num==3)//第三个按键,电机停转{Coil_OFFStopFlag=1;}if(num==4)//第四个按键,电机启动{StopFlag=0;TR0=1;}if(num==5)//第五个按键,电机反转{TR0=0;TR1=1;}if(num==6)//第六个按键,电机正传{TR0=1;TR1=0;}vo=(0.25*(20-Speed)*64*32)/1000;v=60/vo;TempData[0]=dofly_DuanMa[v/10]; //分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[v%10];}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

基于51单片机的步进电机的控制设计

基于51单片机的步进电机的控制设计

单片机应用系统设计报告设计题目:步进电机控制器设计专业班级:学生姓名:指导教师:设计时间: 2016年12月一、 设计要求及方案 1、设计要求可以实现步进电机正转和反转控制及速度的控制,同时实现步进电机步数的控制。

2、设计方案本次设计采用AT89C51单片机控制一个四相步进电机。

单片机输出脉冲序列,驱动步进电机转动;并设置开关、按键电路,来控制步进电机的2挡转速,即加速、减速;以及步数的变化,即四拍驱动方式、八拍驱动方式,同时控制步进电机的转动方向,即正转、反转。

设计方案总体框图:二、步进电机简介 1、步进电机工作原理步进电机是一种将电脉冲转化为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。

步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的多相时序控制器。

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。

随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。

2、步进电机磁力方式选择步进电机的励磁方式主要分为全步励磁和半步励磁两种,其中全步励磁又有一相励磁和二相励磁之分,半步励磁又称一-二相励磁。

51单片机C语言和汇编控制28BYJ48步进电机程序

51单片机C语言和汇编控制28BYJ48步进电机程序

void delay(void) //步进电机延时
{
int i=0;
for(i=0;i<30;i++);
}
void Delay(unsigned int t)
//最常用的延时函数,已经反复使用过
{
while(t--);
}
/************************************************************
P0=0x08; delay(); P0=0x04; delay(); P0=0x02; delay(); P0=0x01; delay(); break; case DOWNQUICK : P0=0x01; delay(); P0=0x02; delay(); P0=0x04; delay(); P0=0x08; delay(); break; }
P0=0xF3;//0011 delay();
P0=0xF6;//0110 delay(); }
}
}
C 语言程序 2: #include <reg51.h> #include <absacc.h> #define UPQUICK 25 #define DOWNQUICK 30
sbit P10=P2^0; sbit P11=P2^1; sbit P12=P2^2; sbit P13=P2^3;
{ for(n=0;n<20;n++) {P0=0xFC;//1100 delay();
P0=0xF6;//0110 delay();
P0=0xF3;//0011 delay();
P0=0xF9;//1001 delay(); }

步进电机控制实验c语言程序,用AT89C51单片机控制步进电机的汇编源程序

步进电机控制实验c语言程序,用AT89C51单片机控制步进电机的汇编源程序

步进电机控制实验c语⾔程序,⽤AT89C51单⽚机控制步进电机的汇编源程序:单⽚机(2540)源程序(50)步进电机(282)汇编语⾔(64)下⾯程序完成的主要功能:实现的正反转,加速、减速;显⽰电机转速(转速级别)和⼯作状态(正转、反转、不转)。

源程序SPEED EQU 10H ;SPEED为转速等级标志,共7级,即1~7FX EQU 11H ;FX 为⽅向标志COUNT EQU 12H ;COUNT次数标志ORG 0000HAJMP MAINORG 0003H ;外部中断0⼊⼝地址,加速⼦程序AJMP UPORG 0013H ;外部中断1⼊⼝地址,减速⼦程序AJMP DOWNORG 000BH ;定时器0中断⼊⼝地址,控制中断次数来达到控制转速 AJMP ZDT0ORG 0030HMAIN: MOV SP,#60HMOV TMOD,#01H ;⼯作于定时、软件置位启动,模式1(16 位计时器)MOV TH0,#0CFHMOV TL0,#2CHMOV COUNT,#01HSETB ET0 ;定时/计数器允许中断CLR IT0 ;外部中断为电平触发⽅式,低电平有效CLR IT1SETB EX0 ;外部允许中断SETB EX1SETB EA ;开总中断MOV R1,#11H ;四相单四拍运⾏,共阳数码管⽅向显⽰8,速度值显⽰0MOV SPEED,#00HMOV FX,#00HXIANS: MOV A,SPEEDMOV DPTR,#LEDMOVC A,@A+DPTR ;查表获取等级对应数码管代码MOV P2,A ;第⼆个数码管显⽰转速等级MOV A,FX ;准备判断转向CJNE A,#11H,ELSMOV P0, #0F9H ;第⼀个数码管显⽰ 1,表⽰正转AJMP QDELS: CJNE A,#00H,ZHENGMOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转AJMP QDZHENG: MOV P0,#0BFH ;第⼀个数码管显⽰-,表⽰反转QD: JB P3.4,DD ;P3.4 接启动开关 K1,P3.4=1 时启动CLR TR0 ;停⽌定时/计数器MOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转MOV P2,#0C0H ;第⼆个数码管显⽰ 0,表⽰转速为 0 MOV SPEED,#00H ;重新赋初值MOV FX,#00HAJMP QDDD: MOV A,SPEEDJNZ GO ;A 不等于 0,即初始速度不为零,则转移到 GO CLR TR0 ;停⽌定时/计数器AJMP QDGO: SETB TR0 ;开启定时/计数器ACALL DELAYAJMP XIANSDELAY: MOV R6,#10 ;延时⼦程序DEL1: MOV R7,#250HERE1: DJNZ R7, HERE1DJNZ R6,DEL1RET。

51单片机控制步进电机硬件图及C语言编程

51单片机控制步进电机硬件图及C语言编程

51单片机控制步进电机硬件图#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#include<absacc.h>#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit P20=P2^0; //将P20位定义为P2.0引脚sbit P21=P2^1; //将P21位定义为P2.1引脚sbit P22=P2^2; //将P22位定义为P2.2引脚sbit P23=P2^3; //将P23位定义为P2.3引脚sbit P24=P2^4; //将P24位定义为P2.4引脚sbit P25=P2^5; //将P25位定义为P2.5引脚sbit P26=P2^6; //将P26位定义为P2.6引脚sbit P27=P2^7; //将P27位定义为P2.7引脚sbit P34=P3^4; //将P34位定义为P3.4引脚sbit P35=P3^5; //将P35位定义为P3.5引脚sbit P36=P3^6; //将P36位定义为P3.6引脚sbit P37=P3^7; //将P37位定义为P3.7引脚sbit P30=P3^0; //将P30位定义为P3.0引脚sbit P31=P3^1; //将P31位定义为P3.1引脚sbit BEEP=P3^2; // 蜂鸣器bit on=0;bit off=1; //运行与停止标志bit zdirection=0; //方向标志bit fdirection=0; //方向标志uchar h,l,k; //定义行键值//定义列键值uchar idata count[3]; //0-9数值储存unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9的段码uchar keyval=0; //定义变量储存按键值uchar dat=0; //按键值uint run_i=0;uchar count_i=0;uint run=0; //需要运行的步数uint drun=0; //当前运行的步数bit flag;uint x=60;uint y=60;uint z=0;/* uint k=0; //调速按键次*//**************************************************************/ void led_delay1(void){unsigned char j;for(j=0;j<52;j++);}void beep(){uchar j;for (j=0;j<200;j++){led_delay1();BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/**************************************************************函数功能:数码管动态扫描延时**************************************************************/void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/**************************************************************/**************************************************************函数功能:软件延时去抖动子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<70;i++)for(j=0;j<60;j++);}void display(uint run){ //显示设点步数P31=1; //点亮数码管DS6P30=0;P34=0;P35=0;P36=0;P37=0;P14=0;P15=0;if((run/100)!=0){ P0=Tab[run/100]; //显示百位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;P30=1;P31=0;P34=0;P36=0;P37=0;P14=0;P15=0;if(((run%100/10)==0)&&(run/10==0)) { P0=0xff;led_delay(); //动态扫描延时led_delay();} //点亮数码管DS5else{ P0=Tab[run%100/10]; //显示十位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;P37=1; //点亮数码管DS4P30=0;P34=0;P35=0;P36=0;P31=0;P14=0;P15=0;if((run/10==0)&&(run%100/10==0)&&(run%10==0)){ P0=0xff;led_delay(); //动态扫描延时led_delay(); //动态扫描延时}else{ P0=Tab[run%10]; //显示个位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;}/*********************************************************************/void ddisplay(uint drun){ //显示运行步数P36=1; //点亮数码管DS3P30=0;P34=0;P35=0;P31=0;P37=0;P15=0;if((drun/100)!=0){P0=Tab[drun/100]; //显示百位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;P35=1; //点亮数码管DS2P30=0;P34=0;P31=0;P36=0;P37=0;P14=0;P15=0;if(((drun%100/10)==0)&&(drun/10==0)) { P0=0xff;led_delay(); //动态扫描延时led_delay();}//点亮数码管DS5else{ P0=Tab[drun%100/10]; //显示十位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;P34=1; //点亮数码管DS1P30=0;P31=0;P35=0;P36=0;P37=0;P14=0;P15=0;if((drun/10==0)&&(drun%100/10==0)&&(drun%10==0)){ P0=0xff;led_delay(); //动态扫描延时led_delay(); //动态扫描延时}else{ P0=Tab[drun%10]; //显示个位led_delay(); //动态扫描延时led_delay(); //动态扫描延时}P0=0xff;}void dddisplay(){ P15=1;P36=0;P30=0;P34=0;P35=0;P31=0;P37=0;P14=0;if((fdirection==1)&&(on==1)){P0=0xbf; led_delay(); led_delay(); }P0=0xff;P14=1;P36=0;P30=0;P34=0;P35=0;P31=0;P37=0;P15=0;if(y==60){P0=0x08;led_delay(); led_delay();}if(y==50){P0=0x03; led_delay(); led_delay(); }if(y==40){P0=0x46; led_delay(); led_delay();}if(y==30){P0=0x21 ;led_delay(); led_delay();}if(y==20){P0=0x86; led_delay(); led_delay(); }if(y==10){P0=0x8e; led_delay(); led_delay();}P0=0xff;}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){ x=60;P14=0;P15=0;P16=0;P17=0;EA=1;EX1=1; //允许使用外中断IT1=1; //选择负跳变来触发外中断PT0=1;ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=0xec; //定时器T0的高8位赋初值TL0=0x78; //定时器T0的低8位赋初值TR0=1;P30=1; //启动定时器T0P34=1;P35=1;P36=1;P37=1;P31=1;P2=0xf0;while(1){if(flag){P2=0x0f; h=P2&0x0f; //所有行线置为高电平"1",所有列线置为低电平"0",并把值给hif((P2&0x0f)!=0x0f) //行线中有一位为低电平"0",说明有键按下delay20ms(); //延时一段时间、软件消抖else {keyval=16;}if(h!=0x0f) //确实有键按下{h=P2&0x0f; //读取行值P2=0xf0; //反转电位l=P2&0xf0; //读取列值k=h+l; //行列相加,为键位值if(k==0x7e) keyval=12;if(k==0x7d) keyval=0;if(k==0x7b) keyval=13;if(k==0x77) keyval=15;if(k==0xbe) keyval=1;if(k==0xbd) keyval=2;if(k==0xbb) keyval=3;if(k==0xb7) keyval=14; //键位与设定对应if(k==0xde) keyval=4;if(k==0xdd) keyval=5;if(k==0xdb) keyval=6;if(k==0xd7) keyval=11;if(k==0xee) keyval=7;if(k==0xed) keyval=8;if(k==0xeb) keyval=9;if(k==0xe7) keyval=10;}else keyval=16;dat=keyval;if((dat==10)&&(run!=0)) //正转键按下{zdirection=1; //方向标志fdirection=0;on=1; //运行与停止标志off=0;}if((dat==11)&&(run!=0)) //反转键按下{fdirection=1; //方向标志zdirection=0;on=1; //运行与停止标志off=0;}if(dat==12) //加速键{if(y==10) y=10;else y=y-10;}if(dat==13) //减速键{if(y==60) y=y;else y=y+10;}if((dat==14)&&(run!=0)) //开始键按下{ if(z==1) {on=1;}elseon=1;off=0;z=0;if((zdirection==0)&&(fdirection==0)){zdirection=1;}}if(dat==15) { z++;on=0; } //停止键按下一次if((on==0)&&(z==2)) //停止键按下二次{count[0]=0; //显示清零count[1]=0;count[2]=0;drun=0; run=0;z=0;on=0;off=1; //运行与停止标志}if((dat>=0)&&(dat<=9)&&(on==0)&&(off==1)){count[count_i]=dat;if(count[0]!=0){count_i++;}if((count_i==3)&&(on==0)&(off==1)){count_i=0;}if((count_i==0)&&(on==0)&(off==1)){ if(count[0]==0)run=0;else run=count[0]*100+count[1]*10+count[2];}if((count_i==1)&&(on==0)&(off==1)){run=count[0];}if((count_i==2)&&(on==0)&(off==1)){run=count[0]*10+count[1];}}if((dat==0)&&(on==1)){off=1;}if(dat==16);flag=0;}/*if(run!=0){*/ddisplay(drun);dddisplay();display(run);/*} */ //调用按键值的数码管显示子程序if((run==drun)&&run!=0){on=0;off=1;beep();drun=0; run=0;count[0]=0; //显示清零count[1]=0;count[2]=0;count_i=0;}}}/**************************************************************外部中断键盘扫描键值保存在dat中******************************************************************************* ************/void Interrupt1() interrupt 2 using 3{flag=1;}/*************************************************************************/ void Interrupt2() interrupt 1 using 1{ TR0=0;EX1=1;TH0=0xec;TL0=0x78;x--;if(x==0){if((zdirection==1)&&(fdirection==0)&&(on==1)&&(off==0)){P1=FFW[run_i];fdirection=0;led_delay(); //动态扫描延时led_delay(); //动态扫描延时led_delay(); //动态扫描延时led_delay(); //动态扫描延时drun++;run_i++;if(run_i==8)run_i=0;if(run==drun){on=0;off=1;}}if((zdirection==0)&&(fdirection==1)&&(on==1)&&(off==0)){P1=REV[run_i];led_delay(); //动态扫描延时led_delay(); //动态扫描延时led_delay(); //动态扫描延时led_delay(); //动态扫描延时zdirection=0;drun++;run_i++;if(run_i==8)run_i=0;if(run==drun){on=0;off=1;}}if((on==0)&&(off=1))P1=0x00; x=y;}TR0=1;}。

步进电机和直流电机控制系统C51程序设计(1)

步进电机和直流电机控制系统C51程序设计(1)

//步进电机控制实验#include <reg51.h>//添加特殊功能寄存器变量定义头文件#include <absacc.h>//添加绝对宏定义头文件#define uchar unsigned char#define uint unsigned int#define D8279 XBYTE[0xE000] //定义8279数据口地址变量#define C8279 XBYTE[0xE001] //定义8279控制口地址变量#define DISPLAY_BUFFER DBYTE [0x70] //定义单片机显示缓冲器首地址变量uchar code TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //定义显示码数据表0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x73,0x3E,0x40,0x6E,0x76,0x38,0x00,0x80};uchar code KEY_DA TA[]={0x00,0x08,0x10,0x18,0x01,0x09,0x11,0x19, //定义键值数据表0x02,0x0a,0x12,0x1a,0x03,0x0b,0x13,0x1b};uchar data M_state,M_Code,Timer; //定义电机状态变量、步进电机状态编码变量、软件定时器变量bit Key_in; //定义按键状态变量sbit A_7=ACC^7; //定义8279初始化状态变量void Init_8279();//声明8279初始化函数void Disp();//声明显示函数uchar Get_Key();//声明键盘扫描函数void Timer0_Int();//声明T0中断函数main(){uchar data *ptr=&DISPLAY_BUFFER;//定义显示缓冲区指针变量及其初始化uchar data i,Key_Num;//定义循环计数、键号变量P1=0x03;//初始化P1口M_state=0;//初始化状态变量M_Code=0x33;//初始化电机状态编码变量Init_8279();//调用8279初始化函数TMOD=0x01;TH0=0xEE;TL0=0x00;//定时器T0初始化EA=1;ET0=1;TR0=0;//中断系统初始化for (i=0;i<=7;i++)//显示缓冲区初始化{*ptr=0;ptr++;}Key_in=0;//按键状态变量初始化Disp();//调用显示函数LOOP://主程序循环体do{Key_Num=Get_Key();}while(!Key_in);//如果没有键按下,则不断巡视键是否按下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例说89S51-C语言
10-35
yiher
1相驱动实验(ch10-3-1.c)-1
2013/7/19
例说89S51-C语言
10-36
yiher
1相驱动实验(ch10-3-1.c)-2
2013/7/19
例说89S51-C语言
10-37
yiher
思考一下!
• 当times参数为10时,每步之间的时间差距约0.5 秒,则步进电机转一圈(200步)应该是100秒, 请实际测量,是否相符? 试着增加times参数,看看是否能使步进电机的 速度变慢?再试着减少times参数,看看是否能 使步进电机的速度变快?而找出多快时,步进 电机就不能正常转动? 若要从P2输出到步进电机,要如何修改程序?
10-46
yiher
1-2相驱动实验(ch10-3-3.c)-2
2013/7/19
例说89S51-C语言
10-47
yiher
思考一下!


如何将本实验里的步进电机,由正转变成 反转? 在本实验里,步进电机转一圈需要多少时 间?
2013/7/19
例说89S51-C语言
10-48
yiher
实例演练10-3-4
例说89S51-C语言
10-12
yiher
1-2相驱动信号的产生 (左正转、右反转)
2013/7/19
例说89S51-C语言
10-13
yiher
1-2相驱动信号
2013/7/19
例说89S51-C语言
10-14
yiher
非预期状态一
2013/7/19
例说89S51-C语言
10-15
yiher
2013/7/19
例说89S51-C语言
10-24
yiher
动态展示
2013/7/19
例说89S51-C语言
10-25
2001/2002/2003/2004系列 驱动IC的引脚图
yiher
2013/7/19
例说89S51-C语言
10-26
yiher
内部电路
2013/7/19
例说89S51-C语言
方向控制实验
2013/7/19
例说89S51-C语言
10-49
yiher
流程图
2013/7/19
例说89S51-C语言
10-50
yiher
方向控制实验 (ch10-3-4.c)-1
2013/7/19
例说89S51-C语言
10-51
yiher
方向控制实验 (ch10-3-4.c)-2
2013/7/19
2013/7/19
例说89S51-C语言
10-43
yiher
实例演练10-3-3
1-2相驱动实验
2013/7/19
例说89S51-C语言
10-44
yiher
流程图
2013/7/19
例说89S51-C语言
10-45
yiher
1-2相驱动实验(ch10-3-3.c)-1
2013/7/19
例说89S51-C语言
10-27
yiher
2003驱动电路
2013/7/19
例说89S51-C语言
10-28
yiher
CD4050引脚图
2013/7/19
例说89S51-C语言
10-29
yiher
达林顿晶体管驱动电路
2013/7/19
例说89S51-C语言
10-30
yiher
FT5754 电路
2013/7/19
例说89S51-C语言


2013/7/19
例说89S51-C语言
10-38
yiher
实例演练10-3-2
2相驱动实验
2013/7/19
例说89S51-C语言
10-39
yiher
流程图
2013/7/19
例说89S51-C语言
10-40
yiher
2相驱动实验(ch10-3-2.c)-1
2013/7/19
例说89S51-C语言
10-41
yiher
2相驱动实验(ch10-3-2.c)-2
2013/7/19
例说89S51-C语言
10-42
yiher
思考一下!


请修改程序,采用1相激磁方式驱动步进 电机? 在本实验里,若将步进电机转速提高 (times减少),会不会让步进电机不动?若 步进电机不动,其驱动信号的频率(或周 期)为何?
10-8
yiher
1 相驱动步进电机的动作
2013/7/19
例说89S51-C语言
10-9
yiher
动态展示(1相)
2013/7/19
例说89S51-C语言
10-10
yiher
2相驱动信号的产生 (左正转、右反转)
2013/7/19
例说89S51-C语言
10-11
yiher
2相驱动信号
2013/7/19
例说89S51-C语言
10-52
yiher
方向控制实验 (ch10-3-4.c)-3
2013/7/19
例说89S51-C语言
10-53
yiher
思考一下!
• 在本实验里,加入两个拨码开关(S1与S2), 并设计一个程序,让S1接通时,则步进电 机正转;让S2接通时,则步进电机反转。
2013/7/19
yiher
步进电机的控制
第十章
2013/7/19
例说89S51-C语言
10-1
yiher
本章内容
2013/7/19
例说89S51-C语言
10-2
yiher
步进电机的基本结构
2013/7/19
例说89S51-C语言
10-3
yiher
步进电机的种类
2013/7/19
例说89S51-C语言
10-4
yiher
非预期状态二
2013/7/19
例说89S51-C语言
10-20
yiher
原始转子位置
2013/7/19
例说89S51-C语言
10-21
yiher
吸不过来
2013/7/19
ቤተ መጻሕፍቲ ባይዱ
例说89S51-C语言
10-22
yiher
顺时针旋转1.8
2013/7/19
例说89S51-C语言
10-23
yiher
逆时针旋转3.6
例说89S51-C语言
10-54
步进电机的控制
Bye Bye…
2013/7/19 例說89S51-C語言 11-55
步进电机的齿间距
2013/7/19
例说89S51-C语言
10-5
yiher
步进电机的驱动方式
2013/7/19
例说89S51-C语言
10-6
yiher
1相驱动信号的产生 (左正转、右反转)
2013/7/19
例说89S51-C语言
10-7
yiher
1相驱动信号
2013/7/19
例说89S51-C语言
原始转子位置
2013/7/19
例说89S51-C语言
10-16
yiher
顺时针旋转1.8
2013/7/19
例说89S51-C语言
10-17
yiher
逆时针旋转5.4
2013/7/19
例说89S51-C语言
10-18
yiher
动态展示
2013/7/19
例说89S51-C语言
10-19
yiher
10-31
yiher
FT5754 步进电机驱动电路
2013/7/19
例说89S51-C语言
10-32
yiher
实例演练10-3-1
1相驱动实验
2013/7/19
例说89S51-C语言
10-33
yiher
步进电机控制电路图
2013/7/19
例说89S51-C语言
10-34
yiher
流程图
2013/7/19
相关文档
最新文档