51单片机驱动步进电机电路及程序
- 格式:doc
- 大小:85.00 KB
- 文档页数:4
51单片机电机正反转控制程序以下是一个基于51单片机的电机正反转控制程序示例:#include <reg52.h>sbit motorPin1 = P0^0; // 电机接口1sbit motorPin2 = P0^1; // 电机接口2void delay(unsigned int delayTime) {unsigned int i, j;for(i=delayTime; i>0; i--)for(j=200; j>0; j--);}void motorClockwise() {motorPin1 = 1; // 电机接口1为高电平motorPin2 = 0; // 电机接口2为低电平delay(500); // 延时一段时间motorPin1 = 0; // 电机接口1为低电平motorPin2 = 0; // 电机接口2为低电平}void motorAnticlockwise() {motorPin1 = 0; // 电机接口1为低电平motorPin2 = 1; // 电机接口2为高电平delay(500); // 延时一段时间motorPin1 = 0; // 电机接口1为低电平motorPin2 = 0; // 电机接口2为低电平}void main() {while(1) {motorClockwise(); // 电机正转delay(1000); // 延时一段时间motorAnticlockwise(); // 电机反转delay(1000); // 延时一段时间}}以上代码中,我们通过定义两个sbit变量来表示电机接口1和接口2。
通过控制接口1和接口2的高低电平状态,可以控制电机的正反转。
在motorClockwise函数中,我们将接口1设置为高电平,接口2设置为低电平,电机开始正转;在motorAnticlockwise函数中,我们将接口1设置为低电平,接口2设置为高电平,电机开始反转。
单片机课程设计摘要近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
本次课程设计是用单片机来控制步进电机的定位和正反旋转。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
整个系统有89C51单片机控制系统,L298驱动电路,4*4的键盘控制电路,LED显示电路。
用89C51单片机控制两相四线步进电机,在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲的相序来改变步进电机的转动方向,从而达到的控制正反转的目的。
本系统采用单片机AT89C51为中心器件来控制步进电机,系统实用性强。
关键字:单片机;步进电机;脉冲;步距角目录1 前言 (3)2 步进电机工作原理 (4)2.1两相步进电机结构 (4)2.2两相步进电机的原理 (4)2.3两相步进电机的供电方式 (5)3 硬件系统设计 (6)3.1系统总体设计框图 (6)3.2单片机系统 (6)3.3时钟信号控制电路 (7)3.4电源电路 (8)3.5驱动电路 (8)3.6显示电路 (9)3.7 4*4键盘电路 (9)4 软件系统设计 (10)4.1主程序流程图及源代码 (10)4.2扫描键盘流程图及源代码............... . (11)4.3 LED显示流程图及源代码 (12)5 开发系统简介.............................. . (14)5.1 WA VE6000编译器简介 (14)5.2 protues仿真平台简介 (14)6 仿真结果及分析 (16)7 课程设计总结 (19)附录 (20)1 前言本次课程设计是以步进电机控制和驱动为要求,用单片机来控制步进电机的定位和正反旋转圈数的显示。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
mega16的,16和32管脚兼容,只不过flash大小不一样,不过中断向量号也不一样,你看下自己改改。
时钟频率:内部RC 1M 芯片:ULN2003 键值:0 小角度快正转。
1 小角度快倒。
2 大角度快转。
3 大角度快倒。
4 小角度正慢转。
5 小角度倒慢转。
6 大角度正慢转。
7 大角度倒慢转。
********************************************************************/#include<iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intuchar a=0,b=0;uchar KEY_num=0xe1;unsigned int m=9000;const uchar f1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}; //正转时序3.75度const uchar f2[]={0x04,0x06,0x02,0x03,0x01,0x09,0x08,0x0c}; //倒转时序3.75度const uchar f3[]={0x01,0x02,0x04,0x08}; //正转时序7.5度const uchar f4[]={0x01,0x08,0x04,0x02}; //倒转时序7.5度void delay(int k) //延时{ int i; for(i=0;i<k;i++); }void delay_10ms(uint data){ uint m=2; while(data) { data--; m=2; while(m)m--; } }void zhengzhuan1(void) //正转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f1[j]; delay(m); } }void daozhuan1(void) //倒转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f2[j]; delay(m); } }void zhengzhuan2(void) //正转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f3[j]; delay(m); } }void daozhuan2(void) //倒转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f4[j]; delay(m); } }void port_int() //初始化端口{ PORTB = 0xf0; DDRB = 0x0F; DDRC=0xff; PORTC=0x01; }void init_devices(void){ CLI(); //禁止所有中断MCUCR = 0x00; MCUCSR = 0x80;//禁止JTAG GICR = 0x00; port_int();SEI();//开全局中断}//按键键值读取程序//返回按键键值,如果没有按键则返回0.void KYY_read(){ //定义按键值存放内存PORTB=0xf0; //行全部送高电平PORTB=0xf0;if((PINB&0xf0)!=0xf0) //有按键{ delay_10ms(1);//延时消抖if((PINB&0xf0)!=0xf0) //确定有按键按下{ PORTB=0xfe; //扫描第一行PORTB=0xfe;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+1; a=9; }PORTB=0xfd; //扫描第二行PORTB=0xfd;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+2; } PORTB=0xfb; //扫描第三行PORTB=0xfb;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+4; } PORTB=0xf7; //扫描第四行PORTB=0xf7;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+8; } } } //没有按键返回0 }//按键执行程序//送如参数:按键键值KEY_do(uchar data){ uchar KEY_number=data;switch(KEY_number){ case 0xe1:a=0;b=0;daozhuan1();m=5000;break;case 0xd1:a=0;b=1;daozhuan1();m=6000;break;case 0xb1:a=0;b=2;daozhuan1();m=7000;break;case 0x71:a=0;b=3;daozhuan1();m=8000;break;case 0xe2:a=0;b=4;daozhuan2();m=5000;break;case 0xd2:a=0;b=5;daozhuan2();m=6000;break;case 0xb2:a=0;b=6;daozhuan2();m=7000;break;case 0x72:a=0;b=7;daozhuan2();m=8000;break;case 0xe4:a=0;b=8;zhengzhuan1();m=5000;break;case 0xd4:a=0;b=9;zhengzhuan1();m=6000;break;case 0xb4:a=1;b=0;zhengzhuan1();m=7000;break;case 0x74:a=1;b=1;zhengzhuan1();m=8000;break;case 0xe8:a=1;b=2;zhengzhuan2();m=5000;break;case 0xd8:a=1;b=3;zhengzhuan2();m=6000;break;case 0xb8:a=1;b=4;zhengzhuan2();m=7000;break;case 0x78:a=1;b=5;zhengzhuan2();m=8000;break; default:b=0;break;}}void main (void)//主程序{ init_devices();while(1){ KYY_read(); KEY_do(KEY_num); }}#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbit K1 = P3^4; //正转sbit K2 = P3^5; //反转sbit K3 = P3^6; //停止sbit K4 = P3^7;sbit BEEP = P0^6; //蜂鸣器/********************************************************//*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/void delay(uint t){uint k;while(t--){for(k=0; k<125; k++){ }}}/**********************************************************/void delayB(uchar x) //x*0.14MS{uchar i;while(x--)for (i=0; i<13; i++){ }}}/**********************************************************/ void beep(){uchar i;for (i=0;i<180;i++){delayB(5);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(){uchar i;uint j;for (j=0; j<12; j++) //转1*n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = FFW[i]; //取数据delay(15); //调节转速}}}/********************************************************/ /*/*步进电机反转/********************************************************/ void motor_rev(){uchar i;uint j;for (j=0; j<12; j++) //转1×n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = REV[i]; //取数据delay(15); //调节转速}}}/********************************************************** 主程序**********************************************************/main(){uchar r,N=5; //N 步进电机运转圈数P2=0xDF;while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ffw(); //电机正转if(K4==0){beep();break;} //退出此循环程序}}else if(K2==0){beep();for(r=0;r<N;r++){motor_rev(); //电机反转if(K4==0){beep();break;} //退出此循环程序}}elseP0 = 0xf0;}}/********************************************************/ULN2803是8路NPN达林顿连接晶体管系列,特别适用于低逻辑电平数字电路,如:TTL,COMS或PMOS/NMOS,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。
/实现功能:正转程序使用芯片:AT89S52晶振:编译环境:Keil作者:声明此程序仅用于学习与参考,引用请注明版权和作者信息/include<> //库文件define uchar unsigned char //字符型宏定义define uint unsigned int //整型宏定义uchar tcnt; //定时器计数初值定义uint sec; //速度值定义uchar buf11;uchar bai,shi,ge;/控制位定义/sbit shi_neng=P1^0; // 使能控制位sbit fang_shi=P1^1; // 工作方式控制位sbit fang_xiang=P1^2;// 旋转方向控制位sbit mai_chong=P1^3; // 脉冲控制位/延时函数/void delay1msuchar z{uchar x,y;forx=0;x<z;x++fory=0;y<110;y++;}/定时中断服务函数/void t0void interrupt 1 using 0 //定时中断服务函数{tcnt++; //每过250ust tcnt 加一iftcnt==1 //当tcnt满足条件时{tcnt=0; //计满重新再计sec++;ifsec==6 //括号内数值越小,电机转动速度越快{sec=0; //计满重新再计mai_chong=~mai_chong; //脉冲输出}}}/定时器0/1初始化/void T0_Init{ET0 = 1;TMOD = 0x22;TH0=0x06; //对TH0 TL0 赋值TL0=0x06;TR0=1; //开始定时sec=0;mai_chong=1; // 脉冲控制位}/串口初始化/void Uart_Init{TMOD = 0x22;TH1 = 0xFD;TL1 = 0xFD;SCON = 0x50;PCON &= 0xef;TR1 = 1;}/数据接收函数/void ReceiveBuf{int i;fori=0;i<11;i++{bufi = SBUF;whileRI == 0;RI=0;}}/角度控制函数/void Control{ifbai==buf5&shi==buf6&ge==buf7{shi_neng=0;};ifbai<buf5{shi_neng=1;fang_xiang=0;}else ifbai>buf5{shi_neng=1;fang_xiang=1;};ifbai==buf5&shi<buf6{shi_neng=1;fang_xiang=0;}else ifbai==buf5&shi>buf6{shi_neng=1;fang_xiang=1;};ifbai==buf5&shi==buf6&ge<buf7{shi_neng=1;fang_xiang=0;}else ifbai==buf5&shi==buf6&ge>buf7 {shi_neng=1;fang_xiang=1;};ifbai==buf5&shi==buf6&ge==buf7{shi_neng=0;};delay1ms3;bai=buf5;shi=buf6;ge=buf7;}/主函数/main{EA=1;T0_Init;Uart_Init;while1{// shi_neng=1; // 使能控制位fang_shi=1; // 工作方式控制ReceiveBuf;delay1ms1;Control;delay1ms10;}}/结束/。
基于51单片机控制步进电机毕业设计论文LTDesign of stepping motor control system based on single chip microcomputerAbstractStepping motor is a kind of by electric pulse signal to control actuator, because it is easy to control, small size and other characteristics, so in the CNC system, automatic production lines, automatic instrument, drawing machine and printer has a widely application. The popularization and application of microelectronic technology and rapid development of micro computer, and gradually into the application field of the motor, which makes before hardware circuit controller of large and complex can now be used software to achieve. This not only reduces the cost of hardware, but also improves the flexibility, reliability and functionality of the control. Because of the stepper motor with instantaneous start, rapid stop, high accuracy, and with the composition of the open loop system is simple, cheap, and very practical. Therefore, the design of based on single-chip stepper motor control system has great value and broad application.This paper mainly studies the design of the stepper motor system based on single chip microcomputer. The content of the subject includes the principle of step motor and single chip microcomputer, the stepper motor drive circuit is analyzed, and the system hardware circuit and program are designed and tested. The design of stepping motor control system adopts the method of software and hardware co simulation, which can effectively reduce the time and cost of the system development. Using Protues simulation software to complete the motor positive inversion, deceleration and stop start and other basic functions, using single chip microcomputer, stepping motor drive chip, character type LCD and keyboard array element module, the design of the controller and the driver for one step into the simulation of motor control system, realizes the function of the stepper motor range setting, position control and real-time display of a step into the working state of the motor. The hardware of the system consists of control circuit, display circuit, alarm feedback circuit and drive circuit, the corresponding software program is designed according to the hardware circuit, and the debugging and analysis are carried out. The design system has the characteristics of clear thinking, high reliability, strong stability and so on.Keywords: stepping motor ;drive circuit;single chip microcomputer;simulation and control system目录第一章绪论 (1)1.1课题背景 (1)1.2课题的目的和意义 (1)1.3课题的内容 (2)第二章步进电机的结构与特点 (3)2.1步进电机的构造 (3)2.2步进电机的工作原理 (4)2.3步进电机的主要特征 (5)2.4步进电机绕组的电气特性 (7)2.5步进电机的选型 (8)第三章设计原理分析 (9)3.1设计目的 (9)3.2设计要求 (9)3.3总体设计方框图 (10)3.4设计方案论证 (10)3.4.1系统控制方案 (10)3.4.2驱动模块方案选择 (13)3.4.3最终方案确定 (15)第四章步进电机控制系统硬件设计 (15)4.1单片机最小系统 (15)4.2 控制电路 (17)4.3 驱动电路 (19)4.4 显示电路 (20)4.5 位移越界报警电路 (21)4.6 状态指示灯显示电路 (22)第五章步进电机控制系统软件设计 (23)5.1主程序设计 (23)5.2 LCD显示程序设计 (25)5.3转速控制程序设计 (27)5.4程序设计 (28)5.5角度设定程序设计 (29)5.6位移设定程序设计 (31)第六章仿真结果与分析 (34)6.1整体硬件设计图 (34)6.2测试 (34)6.3误差分析 (39)第七章总结 (40)参考文献 (42)致谢 (45)第一章绪论1.1课题背景步进电机作为控制执行器,广泛应用于各种控制领域[1]。
基于单片机的步进电机控制电路设计
步进电机是一种应用广泛的电机,它的控制方式是通过逐步改变电流来驱动电机转动。
基于单片机的步进电机控制电路设计可以使步进电机的控制更加精确、方便和自动化。
下面将介绍一下如何设计一台基于单片机的步进电机控制电路。
首先,我们需要选择合适的单片机。
对于步进电机控制,需要一个I/O口数目足够的单片机,并且要求计算速度快、性能稳定。
常用的单片机有AT89C51、AVR、PIC、STM32等,其
中STM32拥有强大的计算能力和外设支持,非常适合用于步
进电机控制电路的设计。
接下来,我们需要考虑步进电机的驱动方式。
步进电机可以采用全步进或半步进两种方式驱动。
全步进控制方式会让电机一步步转动,步距为180度,转速慢但精确度高,而半步进控制方式可以让电机先半步,再进入全步进控制,提高了转速同时又保持了较高的精度。
最后,我们需要设计电路连接和代码编写。
在电路连接方面,需要将单片机输出引脚和驱动芯片的控制引脚相连,同时将驱动芯片输出端和电机的相应引脚相连。
在代码编写方面,需要根据所选单片机的指令集来编写步进电机控制引脚输出的程序,实现步进电机转速和方向的控制。
综上所述,基于单片机的步进电机控制电路设计需要选取合适的单片机,选择合适的步进电机驱动方式,并根据电路连接和
代码编写来实现电机的精确控制。
这样设计出的步进电机控制电路可以应用于各种机械设备控制,使之更加智能化和自动化。
正反转可控的步进电机1 引言本课程设计目的是为了进一步掌握单片机系统,加强对系统设计和应用能力的培养而开设的综合设计训练环节。
本系统用51单片机和ULN2003A电机驱动芯片并加入控制按钮来实现步进电机的正、反转控制。
2 设计方案及原理步进电机可以对旋转角度和转动速度进行高精度的控制。
作为控制执行部件,广泛应用于自动控制和精密仪器等领域。
例如在仪器仪表、机床设备以及计算机的外围设备中(如打印机和绘图仪),常有对精确的、可控制的回转源的需要。
在这种情况下,使用步进电机最为理想。
2.1 步进电机控制步进电机两个相邻磁极之间的夹角为60°,线圈绕过相对的两个磁极构成一相。
此外各磁极上还有5个分布均匀的锯形小齿。
电机转子上没有绕组。
当某相绕组通电时,响应的两个磁极就分别形成N-S极,产生磁场,并与转子形成磁路。
如果这是定子的小齿与转子的小齿没有对齐,则在磁场的作用下,转子将转动一定的角度,使转子齿与定子齿对齐,从而使步进电机向前“走”一步。
如果通过单片机按顺序给绕组施加有序的脉冲电流,就可以控制电机的转动,从而进行了数字到角度的转换。
转动的角度大小与施加的脉冲数成正比,转动的速度与脉冲频率成正比,而转动方向则与脉冲的顺序有关。
2.2 步进电机驱动方式步进电机常用的驱动方式是全电压驱动,即在电机移步与锁步时都加载额定电压。
为防止电机过流及改善驱动特性需加限流电阻。
由于步进电机锁步时,限流电阻要消耗掉大量的功率。
因此,限流电阻要有较大功率容量,并且开关管也要有较高的负载能力。
步进电机也可以使用软件方法,即使用单片机实现,这样不但简化了电路,同时降低了成本。
使用单片机以软件方式驱动步进电机,不但可以通过编程方法在一定范围之内自由的设定步进电机的转速,往返转动的角度以及转动次数等;还可以方便灵活的控制步进电机的运行状态,以满足不同用户的需求。
因此常把单片机步进电机控制电路称之为可编程步进电机控制驱动器。
2.3 51单片机增强型学习系统各组成部份原理图及功能简介2.3.1 共阴极数码管动态扫描控制图2.2 51单片机增强型学习系统的四位共阴极数码管动态扫描硬件连接原理图AT89S51单片机P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上接电阻。
AT89S51单片机P2口是一个带有内部上拉电阻的8位双向I/O 口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL 逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX @Ri 指令)时,P2口线上的内容(也即特殊功能寄存器SFR 区中P2寄存器的内容),在整个访问期间不改变。
Flash 编程或校验时,P2亦接收高位地址和其它控制信号。
在上面的硬件连接原理图里,我们用到的是P0和P2口控制四位数码管显示的。
四位数码管显示的方式是动态扫描显示,动态扫描显示是单片机中应用最为广泛的一种显示方式之一。
其接口电路如上图是把所有显示器的8个笔划段a-h同名端连在一起由单51单片机增强型学习系统片机的P0.0~P0.7控制,而每一个数码管的公共极(阴极)是各自独立地受单片机P2.7~P2.4控制。
CPU向字段输出口P0口送出字形码时,所有数码管接收到相同的字形码,但究竟是那个数码管亮则取决于P2.7~P2.4的输入结果,所以我们就可以自行决定何时显示哪一位了。
单片机控制步进电机正反转的实际应用程序/*这是一个控制步进电机正反转的实际应用程序*//*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*//*p13口线用做步进电机的方向控制。
p15,p16,p17是光耦开关量输入*//*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*//*k7,k8键是设定步进电机转动速度参数的加减键*//*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/ /*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*//*k11是步进运行键,按一下,步进电机动一下*//*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/ /*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。
*/START:do;$INCLUDE(REG51.DCL)DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/declare l(5) byte;declare (dat,data) byte at (30h);declare delay word;DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/ 41h,1fh,01h,09h,00h);declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/declare so literally 'p22',cs literally 'p23';dog:procedure; /* 初始化看门狗x25045 */cs=1;call time(1);cs=0;call time(1);cs=1;end dog;run:procedure; /*步进电机运行脉冲输出程序*/if ok=1 thencall dog;do;p14=0;call time(1);p14=1;call time(1);end;end run;DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/DECLARE (L0,L10) BYTE; /*定义显示二位*/n=L10;n=aco(n); /*十位数BCD码译成段码*/sbuf=n; /*十位数送164显示*/do while ti=0; /*等待发送结束*/call dog; /*看门狗定时器复位*/end;n=L0;n=aco(n);sbuf=n; /*个位数送164显示*/do while ti=0;call dog;end;end display;outbyt: procedure(da); /*向看门狗存储器写入一字节*/ declare (i,da) byte;j=da; /*将要写入的字节赋给临时变量J */do i=0 to 7; /*左移8位,送到口线si */sck=0;j=scl(j,1);si=cy;sck=1; /*每移一位数据,跟一个时钟信号*/end;end outbyt;inbyt: procedure; /* 从看门狗存储器读出一字节*/ declare (i,di) byte;j=0;do i=0 to 7;sck=1;sck=0;cy=so;j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/ end;dat=j;end inbyt;wrenable: procedure; /* 置看门狗写使能*/sck=0;cs=0;; /* write enable command */call outbyt(06h); /* x25045 写使能指令06h */cs=1;sck=0;end wrenable;wrdisable: procedure; /* 置看门狗写禁止*/sck=0;cs=0;; /* write disable command */call outbyt(04h);sck=0;cs=1;end wrdisable;wrregister: procedure; /* 写状态寄存器*/sck=0;cs=0;dat=01h; /* write register command */call outbyt(dat);; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */ call outbyt(00h); /* 设定看门狗定时时间*/;sck=0;cs=1;call time(200); /* wait to complete writting cycle */end wrregister;rdregister:procedure; /* 读看门狗状态寄存器*/sck=0;cs=0;; /* register read command */call outbyt(05h);call inbyt; /* status register read in <DAT> */sck=0;cs=1;end rdregister;wbyte:procedure; /* 看门狗存储器字节写入子程序*/ declare comm byte;sck=0;cs=0;comm=02h; /* 写指令02h */call outbyt(comm);call outbyt(addrl);call outbyt(dat); /* send one byte data to X25043 */cs=1;sck=0;call time(150);end wbyte;rbyte:procedure; /*看门狗存储器字节读出子程序*/declare comm byte;sck=0;cs=0;comm=03h; /* read command */call outbyt(comm);call outbyt(addrl);call inbyt; /* read one byte to <DAT> */sck=0;cs=1;end rbyte;incdata: procedure; /* 参数修改--"加"键处理子程序+ */if p10=0 then /* 如果K7键按下*/do;do while p10=0; /* 等待键松开有效*/call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/ end;data=data+1; /* 设定值+1 */if data>99 then data=1; /* 规定设定值的上限*/L(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */L(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/call time(200); /* 延时*/call dog;call time(200);call dog;call wrenable; /* 置存储器写使能*/addrl=00h; /* 置存储器地址*/dat=l(1);call wbyte; /* 将变量L(1)的值写入存储器00h位置*/call wrenable;addrl=01h;dat=l(2);call wbyte; /* 将变量L(2)的值写入存储器01h位置*/end;end incdata;decdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */IF p11=0 THEN /* k8 键处理子程序*/do;do while p11=0;call dog;end;DATA=DATA-1; /* 设定值-1 */if data=0 then data=99;L(1)=data MOD 10;L(2)=data/10;call display(l(1),l(2));call dog;call time(200);call dog;call time(200);call dog;call wrenable;addrl=00h;dat=l(1);call wbyte;call wrenable;addrl=01h;dat=l(2);call wbyte;end;END decdata;starton: PROCEDURE; /* start */declare sd byte;if p12=0 THEN /* K9键处理子程序*/do;do while p12=0;call dog;end;if p17=0 then ok=0; /* 如果p17 口线上有信号输入,则运行标志置0 (停止运行)*/ p13=1; /* 置步进电机正向运转*/call time(200);call dog;do while ok=1; /* 当运行标志为1时,执行速度延时操作*/do sd= 0 to data; /* 根据设定值data的数值延时来确定步进电机运行时的脉冲给定速度*/call dog;end;end;END starton;step: PROCEDURE; /* step */declare sd byte;p13=1; /* 置步进电机正向运转*/call time(200);IF p33=0 THEN /* k11键处理子程序*/do;if p17=0 then ok=0; /* 如果p17上有信号输入,则停止运行*/do while p33=0;do sd= 0 to data; /* 调用延时,调整步进电机的运行速度*/call dog;call time(2);end;call run;call dog;end;end;ok=0;END step;back: PROCEDURE; /* 反向运行处理子程序*/declare sd byte;IF p34=0 THENdo;do while p34=0;call dog;end;if p15=0 then ok=0; /* 反向运行时,如果遇到p15上有信号输入,则停止步进电机运行*/ p13=0; /* 置步进电机反向运行*/call time(200);call dog;do while ok=1;do sd=0 to data; /*根据设定值调节步进电机的运行速度*/call dog;call time(2);end;call run;if (p15=0 or p32=0 ) then ok=0; /* p15 或p32 口线任意一个有信号输入,停止运行*/ end;end;END back;MAIN$PROGRAM: /* 初始化主程序*/ea=0; /* 关中断*/SCON=00h; /*置串口方式0 ,串行数据输出模式*/PCON=00h;tmod=11h;enable; /* 开中断(ea=1) */SCK=0;cs=1; /* 定义存储器口线初始状态*/call wrenable;call wrregister; /* 看门狗存储器初始化*/call wrenable;call dog;p2=0ffh; /* 初始化各个口线的状态*/p1=0ffh;ok=0;p14=1;p32=1;p33=1;p34=1;p13=1;ADDRL=00h; /* 上电复位后从存储器中读出设定的速度值*/CALL rbyte;l(1)=dat;addrl=01h;call rbyte;l(2)=dat;DATA=L(1)+L(2)*10; /*将读出的值合并成十进制,存入变量data中*/ /* 以下是主循环程序*/LOOP:IF p10=0 THEN CALL incdata; /* 检测各个按键是否有按下*/IF p11=0 THEN CALL decdata;if p12=0 thendo;ok=1;call starton;end;if p34=0 thendo;ok=1;call back;end;if p33=0 thendo;ok=1;call step;end;call dog;CALL DISPLAY(L(1),L(2)); /* 将设定值送164显示*/call dog;CALL TIME(100);call dog;GOTO LOOP;END START;。
51单片机驱动步进电机电路及程序
在这里介绍一下用51单片机驱动步进电机的方法。
这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!
该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。
采用51驱动ULN2003的方法进行驱动。
ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。
;*********************************************************************************
;****************************步进电机的驱动***************************************
; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19
;---------------------------------------------------------------------------------
; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!!
; 本步进电机步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!
;---------------------------------------------------------------------------------
; A组线圈对应 P2.4
; B组线圈对应 P2.5
; C组线圈对应 P2.6
; D组线圈对应 P2.7
; 正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转 7.5 度)
;----------------------------------------------------------------------------------
;----------------------------正转--------------------------
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV R3,#144 正转 3 圈共 144 脉冲
START:
MOV R0,#00H
START1:
MOV P2,#00H
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ START 对 A 的判断,当 A = 0 时则转到 START
MOV P2,A
LCALL DELAY
INC R0
DJNZ R3,START1
MOV P2,#00H
LCALL DELAY1
;-----------------------------反转------------------------
MOV R3,#144 反转一圈共 144 个脉冲
START2:
MOV P2,#00H
MOV R0,#05
START3:
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ START2
MOV P2,A
CALL DELAY
INC R0
DJNZ R3,START3
MOV P2,#00H
LCALL DELAY1
LJMP MAIN
DELAY: MOV R7,#40 步进电机的转速
M3: MOV R6,#248
DJNZ R6,$
DJNZ R7,M3
RET
DELAY1: MOV R4,#20 2S 延时子程序
DEL2: MOV R3,#200
DEL3: MOV R2,#250
DJNZ R2,$
DJNZ R3,DEL3
DJNZ R4,DEL2
RET
TABLE:
DB 30H,60H,0C0H,90H 正转表
DB 00 正转结束
DB 30H,90H,0C0H,60H 反转表
DB 00 反转结束
END