完整的单片机控制步进电机程序
单片机控制步进电机程序设计
单片机控制步进电机程序设计1.引言步进电机是一种常用的电机类型,其特点是精度高、稳定性好、速度可调。
在很多自动控制系统中,步进电机被广泛应用于位置控制、定位、打印机等领域。
本文将介绍如何使用单片机来控制步进电机,并给出一个简单的步进电机程序设计示例。
2.步进电机简介步进电机是一种将电脉冲信号转换为角位移或线位移的电机。
其优点包括:-分辨率高:每个步进电机的旋转角度可以非常小,可实现较高的位置精度。
-可控制性强:通过控制电压脉冲的频率和顺序,可以精确控制步进电机的转动方向和步数。
-响应快速:步进电机的响应速度较快,可达数千转每分钟。
3.单片机选型与连接在实现步进电机的控制过程中,我们选择了一款适用于步进电机控制的单片机。
这款单片机具有以下特点:-高效的运算能力和大容量存储空间,适用于复杂的控制算法。
-可编程性强,支持多种开发环境,开发过程相对简便。
-丰富的外设接口,方便与步进电机的连接和控制。
连接单片机与步进电机的基本电路如下所示:步进电机驱动引脚1--单片机引脚A步进电机驱动引脚2--单片机引脚B步进电机驱动引脚3--单片机引脚C步进电机驱动引脚4--单片机引脚D4.步进电机控制原理步进电机控制原理基于对步进电机驱动引脚输入电压脉冲信号的控制。
针对不同的步进电机类型,控制方式可以有所不同,常见的控制方式包括全步进控制和半步进控制。
4.1全步进控制全步进控制方式是将电流依次施加到步进电机的每个驱动相,使其按照一定顺序正转或反转。
控制步骤如下:1.给引脚A和引脚B施加电压,使电机顺时针转动一个步距。
2.给引脚B和引脚C施加电压,使电机顺时针转动一个步距。
3.给引脚C和引脚D施加电压,使电机顺时针转动一个步距。
4.给引脚D和引脚A施加电压,使电机顺时针转动一个步距。
4.2半步进控制半步进控制方式是在全步进控制的基础上,通过控制相邻两个相的电流互补关系,实现更细微的步距调整。
控制步骤如下:1.给引脚A施加电压,使电机顺时针转动半个步距。
51单片机步进电机控制汇编语言程序
51单片机步进电机控制汇编语言程序;本程序是通过秒信号触发中断来实现的,要求中断程序必须在1S内执行完毕;步进电机转速控制是通过8255输入信号在每次执行中断程序内调整控制信号的循环次数来实现的CODE SEGMENTASSUME CS:CODESTART: PUSH CSPOP DS;数据段和代码段共用一个地址JMP MAINNUM DB 08H,04H,02H,01H; 定义循环控制信号DAT1 DB 0H ;定义循环参量DAT2 DB 0H;---------初始化8253计数器-----------MAIN:MOV DX,203H;计数器0初始化,工作在方式3 MOV AL,36HOUT DX,ALMOV DX,200H;给计数器0赋计数初值960H(2400)MOV AL,60H ;低8位OUT DX,ALMOV AL,09H ;高8位OUT DX,ALMOV DX,203H;计数器1初始化,工作在方式3 MOV AL,76HOUT DX,ALMOV DX,201H;给计数器1赋计数处值80H(128) MOV AL,80H ;低8位OUT DX,ALMOV AL,00H ;高8位OUT DX,AL;-----------初始化8255--------------- MOV DX,021BH;A口输入,B口输出MOV AL,90HOUT DX,AL;-----------初始化向量表8号中断-------- MOV AX,0;ES:DIMOV ES,AXMOV DI,20H;4*8=32MOV AX,OFFSET INTP;装载中断函数的偏移地址MOV ES:[DI],AXMOV AX,8100H;MOV ES:[DI+2],AX;-------------初始化8259A--------------MOV DX,210H;ICW1初始化MOV AL,13H;上升沿触发,单片,要ICW4OUT DX,ALMOV DX,211H;ICW2初始化MOV AL,08H;初始化中断类型码范围,08-0F对应INT0-INT7OUT DX,ALMOV DX,211H;ICW4初始化MOV AL,01H;OUT DX,AL;--------------打开中断-------------- MOV DX,211H;打开8259A八号中断IN AL,DXAND AL,0FEH;1111 1110OUT DX,ALSTI;开CPU中断,IF=1MOV BX,OFFSET NUM;取控制信号的偏移地址MOV SI,0 ;将SI循环归零LOP: MOV AX,0JMP LOP;死循环,等待中断到来;------------中断程序开始----------INTP PROC FAR;LTP:MOV DX,219HMOV AL,[BX+SI]OUT DX,ALINC SICMP SI,04HJNZ NEXTMOV SI,0NEXT: MOV CX,03FFFH ;简短延时LOOP $CALL REFRESH;调用按键扫描子程序DEC DAT1 ;循环次数减一JNZ LTP ;循环次数减为零时跳出循环MOV AL,DAT2;重新填装DAT1的值MOV DAT1,ALMOV DX,210H;中断结束命令MOV AL,20HOUT DX,ALIRET;中断返回INTP ENDP;-------按键扫描程序---------- REFRESH PROC FARMOV DX,218HIN AL,DXCMP AL,00HJNZ NEXT1 ;若输入信号为00,则循环参量置为1 MOV DAT2,01HNEXT1: CMP AL,01HJNZ NEXT2 ;若输入信号为01,则循环参量置为2 MOV DAT2,02HNEXT2: CMP AL,03HJNZ NEXT3 ;若输入信号为11,则循环参量置为3 MOV DAT2,03HNEXT3: CMP AL,07HJNZ NEXT4 ;若输入信号为111,则循环参量置为4 MOV DAT2,04HNEXT4 MOV DAT1,0HRETREFRESH ENDP;-------按键扫描结束----------CODE ENDSEND START。
步进电机控制(单片机C语言)
步进电机控制(单⽚机C语⾔)模块⼆简单应⽤实例调试任务2 步进电机控制(H22)⼀、任务要求⽤单⽚机P1端⼝控制步进电机,编写程序输出脉冲序列到P1⼝,控制步进电机正转、反转,加速,减速。
⼆、任务⽬的1.了解步进电机控制的基本原理。
2.掌握控制步进电机转动的编程⽅法。
三、电路连线框图步进电机电流⼩于0.5A时可采⽤ULN2003A进⾏驱动(反相)四、原理控制说明步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。
切换是通过单⽚机输出脉冲信号来实现的。
所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转⽅向。
步进电机的转速应由慢到快逐步加速。
电机驱动⽅式可以采⽤双四拍(AB→BC→CD→DA→AB)⽅式,也可以采⽤单四拍(A→B→C→D→A)⽅式,或单、双⼋拍(A→AB→B→BC→C→CD→D→DA→A)⽅式。
控制时公共端是接在VCC上的,所以实际控制脉冲是低电平有效。
单⽚机的P1⼝输出的脉冲信号经(MC1413或ULN2003A)倒相驱动后,向步进电机输出脉冲信号序列。
五、程序框图# include#define Astep 0x01#define Bstep 0x02#define Cstep 0x04#define Dstep 0x08unsigned char dly_c;void delay(){unsigned char tt,cc;cc = dly_c; //外循环次数tt = 0x0; //内循环次数do{do {}while(--tt);}while(--cc);}void main(){dly_c = 0x10;// 双四拍⼯作⽅式while(1){P1= Astep+Bstep;delay();P1= Bstep+Cstep;delay();P1= Cstep+Dstep;delay();P1= Dstep+Astep;delay();if (dly_c>3) dly_c --; // 加速控制};。
完整的单片机控制步进电机程序
#include "reg52.h"#include "INTRINS.H"#include <absacc.h>#include <math.h>#define uint unsigned int#define uchar unsigned charvoid check_addr(void); /* 地址核对*/uchar code slave_addr[4]={00, 01, 02, 255}; /* 从机地址*/uchar idata T0low, T0high,common_count,input_order,cmd_in_permit,interval; ucharsent_ok,speed_change,start_up,start_end,address_true,i;uint y1;uint codeadd[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,651 11,65141,65167,65190,65211,65229,65245,65260,65273,65285,65296,65306,65315,65323,65331 , 65339,65345,65352,65358,65363,65368,65373,65378,65382,65387,65390,65394,65398,65401,6 5404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,654 37,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65453,65455,65456,65457 , 65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65469,65470,6 5471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,654 80,65481};sbit P2_0=P2A0; sbit P2_2=P2A2; sbit P1_0=P1A0; sbit WD=P1A7; /* 作输入步进电机的脉冲信号发送口*//* 作输入步进电机的旋转方向信号发送口*//*作串口输出信号的使能口,P1_0=0时接通串口,输出信号*/ /* 看门狗*/main(){P2_0=0;P2_2=0; /* 步进电机的旋转方向待试验后确定*/P1_0=1; /* 开机时需要关断,串口发送功能,需要时再接通*/ WD=1; /* 看门狗先为1,电平翻转为喂狗*/ i=0;common_count=0; cmd_in_permit=0;input_order=0;interval=0; address_true=1;speed_change=0;start_up=0;start_end=0;sent_ok=0; // 允许发送EA=1; /* 开放总中断*/ TMOD=0x21;TH1 = 0xFD; TL1 = 0xFD; SCON = 0xd0; PCON &= 0x00; SM2=1;TR1 = 1;ES=1; // 波特率9600// 设定串行口工作方式// 波特率不倍增// 启动定时器1T2MOD=00;T2CON=0x00;RCAP2H =0xEE; //赋T2 的预置值0xA600,25MS ,0xB800 ,20MS,0xCA00 ,15MS,0xDC00 ,10MS,0xEE00 ,5MSRCAP2L =0x00;TR2=1; //启动定时器ET2=1; //打开定时器2 中断do{if(address_true==1){ address_true=0; check_addr();} if(start_up==1&&start_end==0) //第一次启动{y1=add[common_count];T0high = (uchar)(y1>>8) ; /* 取y1 的高8 位*/T0low = (uchar)(y1&0x00ff); /*取y1的低8位*/TR0 = 1;ET0=1; /* 允许T/C0 中断*/start_end=1;}if(speed_change==1){ if(interval>=0&&interval<=0x63) {if(interval>common_count){common_count=common_count+1; }if(interval<common_count){common_count=common_count-1; }speed_change=0;} if(sent_ok==1){ sent_ok=0; P1_0=0; for(i=0;i<=20;i++) {_nop_();}TI=0; SBUF=T0high; while(TI==0);TI=0; TI=0; SBUF=T0low; while(TI==0);TI=0;P1_0=1; for(i=0;i<=20;i++) {_nop_();}SM2=1;}} while(1);}void timer0(void) interrupt 1 using 3{ P2_0=~P2_0; y1=add[common_count];T0high = (uchar)(y1>>8) ; /* 取y1 的高8 位*/ T0low = (uchar)(y1&0x00ff); /* 取y1 的低8 位*/ THO=TOhigh; /*高8 位TOhigh 送定时器0 的TH0*/ TL0=T0low; /*低8 位T0low 送定时器0 的TL0*/}void timer2(void) interrupt 5 using 2{TF2=0; /*T2 溢出中断需软件清0*/ speed_change=1; //速度可以改变标示,以便主程序处理WD=!WD; /*MAX813 喂狗*/}void inte_SERIAL() interrupt 4 using 1 /*串口0 中断服务子程序*/{uchar key_in ; key_in=0;if(RI){key_in=SBUF;RI=0;if (SM2==1){ if(key_in==slave_addr[2]){SM2=0; address_true=1;}}if ((SM2==0)&& (RB8==0)){ if(key_in==0xff){SM2=1;}if(key_in==0xfe){ /* 接收主机命令引导字节,准备接收主机命令*/ cmd_in_permit=1;} if(cmd_in_permit==1){ input_order=input_order+1;}if (input_order==2){ /* 接收主机命令,使从机开始调节电机*/ cmd_in_permit=0; input_order=0;/*interval 代表控制器发给电机的转速期望值*/ interval= key_in;sent_ok=1; if(start_up==0){start_up=1;}}}}}void check_addr(void){ /* 地址核对成功,发送从机地址给主机*/TB8=1;RB8=0;P1_0=0;for(i=0;i<=25;i++) {_nop_();}SBUF=slave_addr[2]; /* 发送地址核对成功,发送从机地址给主机*/ do{} while(TI==0); TI=0;P1_0=1;for(i=0;i<=25;i++) {_nop_();}TB8=0;。
单片机控制步进电机程序
StartEnd bit 01H ;起动及停止标志MinSpd EQU 25 ;起始转动速度MaxSpd EQU 100 ;最高转动速度Speed DATA 23H ;流动速度计数DjCount DATA 24H ;控制电机输出的一个值,初始为11110 111Hidden EQU 10H ;消隐码Counter DATA 57H ;显示计数器DISPBUF DATA 58H ;显示缓冲区ORG 0000HAJMP MAINORG 000BHJMP DISPORG 001BHJMP DJZDORG 30HMAIN:MOV SP,#5FHMOV P1,#0FFHMOV A,#HiddenMOV DispBuf,AMOV DispBuf+1,AMOV DispBuf+2,AMOV DjCount,#11110111BMOV SPEED,#MinSpd ;起始转动速度送入计数器CLR StartEnd ;停转状态MOV TMOD,#00010001B ;MOV TH0,#HIGH(65536-3000)MOV TL0,#LOW(65536-3000)MOV TH1,#0FFH;MOV TL1,#0FFHSETB TR0SETB EASETB ET0SETB ET1LOOP: ACALL KEY ;键盘程序JNB F0,m_NEXT1 ;无键继续ACALL KEYPROC ;否则调用键盘处理程序m_NEXT1:MOV A,SpeedMOV B,#10DIV ABMOV DispBuf+5,B ;最低位MOV B,#10DIV ABMOV DispBuf+4,BMOV DispBuf+3,AJB StartEnd,m_Next2CLR TR1 ;关闭电机JMP LOOPORL P1,#11110000Bm_Next2:SETB TR1 ;启动电机AJMP LOOP ;主程序结束;---------------------------------------D10ms:……;---------延时程序,键盘处理中调用KEYPROC:MOV A,B ;获取键值JB ACC.2,StartStop ;分析键的代码,某位被按下,则该位为1JB ACC.3,KeyStyJB ACC.4,UpSpdJB ACC.5,DowSpdAJMP KEY_RETStartStop:SETB StartEnd ;启动AJMP KEY_RETKeySty:CLR StartEnd; ;停止AJMP KEY_RETUpSpd:INC SPEED;MOV A,SPEEDCJNE A,#MaxSpd,K1 ;到了最多的次数?DEC SPEED ;是则减去1,保证下次仍为该值K1:AJMP KEY_RETDowSpd:DEC SPEEDMOV A,SPEEDCJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回MOV SPEED,#MinSpd;KEY_RET:RETKEY:……获取键值的程序RETDjZd: ;定时器T1用于电机转速控制PUSH ACCPUSH PSWMOV A,SpeedSUBB A,#MinSpd ;减基准数MOV DPTR,#DjHMOVC A,@A+DPTRMOV TH1,AMOV A,SpeedSUBB A,#MinSpdMOV DPTR,#DjLMOVC A,@A+DPTRMOV TL1,AMOV A,DjCountCPL AORL P1,AMOV A,DjCountJNB ACC.7,d_Next1JMP d_Next2d_Next1:MOV DjCount,#11110111Bd_Next2:MOV A,DjCountRL AMOV DjCount,A ;回存ANL P1,APOP PSWPOP ACCRETIDjH: DB76,82,89,95,100,106,110,115,119,123,12……DjL: DB 0,236,86,73,212,0,214,96,163,165 ……DISP: ;显示程序POP PSWPOP ACC……RETIBitTab: DB7Fh,0BFH,0DFH,0EFH,0F7H,0FBH DISPTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0F FHEND。
单片机控制步进电机转动程序设计_概述及说明
单片机控制步进电机转动程序设计概述及说明1. 引言1.1 概述在现代工业和科技领域中,步进电机常被用于各种自动化设备和精密控制系统中。
步进电机以其精准的定位和可控性而被广泛应用于数控机床、印刷设备、医疗仪器等领域。
单片机是一种高度集成的微处理器,具有强大的计算能力和丰富的外设接口,可以为步进电机提供有效的控制信号和驱动能力。
本文将介绍单片机对步进电机转动程序设计的概念、原理和实现过程,并进行相关实验与结果分析。
通过深入了解单片机与步进电机之间的关系,我们可以更好地理解并合理设计步进电机转动程序,提高整个系统的稳定性和效率。
1.2 文章结构本文分为五个主要部分。
引言部分旨在说明文章背景、目的及结构安排,从而使读者对文章内容有清晰的认识。
接下来将介绍单片机控制步进电机转动程序设计的相关概念、原理和要点,并详细描述硬件准备与连接配置。
然后,将着重阐述步进电机驱动程序的设计与编码实现过程。
随后,将介绍转动程序的测试方法和优化技巧。
最后,通过实验数据的分析和讨论,总结结论并展望未来针对问题的研究方向及相关工程应用前景。
1.3 目的本文的目的是探讨单片机控制步进电机转动程序设计的相关要点,并提供具体的硬件连接配置、驱动程序设计和优化方法。
通过阅读本文,读者将能够了解并应用单片机在步进电机控制中的原理和技巧,从而实现更加精确和可靠的步进电机转动控制。
同时,本文还旨在为有关领域研究者提供有关步进电机转动程序设计的参考资料,并预测其未来在工程应用中可能展示出来的前景及意义。
2. 单片机控制步进电机转动程序设计:2.1 步进电机概述:步进电机是一种将电动机转换为角位移输出的装置。
与直流电机不同,步进电机可以精确地控制角度和位置。
它由多个绕组(相)构成,每个绕组都被称为一个相位。
通过在不同的相之间交替通电,可以使步进电机转动一个固定的角度。
2.2 单片机控制步进电机原理:单片机是一种微处理器芯片,它具有强大的计算和控制能力。
单片机控制步进电机正反转的实际应用程序
单片机控制步进电机正反转的实际应用程序/*这是一个控制步进电机正反转的实际应用程序*//*选用的是三相步进电机驱动器,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;。
步进电机控制程序(c语言51单片机)
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; }
}
P1 = 0xff;
if ( pri_dj ) break;
if ( !key_puse ) {
fx_run();
}
}
}
void run () {
#define Delay_time 180
/* 转一圈 50 次循环,每循环 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */
one_round_flg = 1;
tmp = round_num / Chilun_Num ;
set_display_num();
P0 = 0xf0;
void display ();
void delay(uint delay_time) { uint i; for (i=0; i < delay_time ; i++) ; }
void run ();
void fx_run();
uint round_num = 0; /* 记录已转的 齿轮数 , 中断1次 加 1*/
for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){
P1 = 0xf9;
delay ( Delay_time ); // bujin_zx_stop = P3^3;
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”延时子程序,用循环语句延时。
用单片机按键控制步进电机转动的程序怎么写
用单片机按键控制步进电机转动的程序怎么写结合按键程序,我们设计这样一个功能程序:按数字键1~9,控制电机转过1~9 圈;配合上下键改变转动方向,按向上键后正向转1~9 圈,向下键则反向转 1~9 圈;左键固定正转 90 度,右键固定反转90;Esc 键终止转动。
通过这个程序,我们也可以进一步体会到如何用按键来控制程序完成复杂的功能,以及控制和执行模块之间如何协调工作,而你的编程水平也可以在这样的实践练习中得到锻炼和提升。
#includesbit KEY_IN_1 = P2^4;sbit KEY_IN_2 = P2^5;sbit KEY_IN_3 = P2^6;sbit KEY_IN_4 = P2^7;sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2;sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表{ 0x31, 0x32, 0x33, 0x26 }, //数字键 1、数字键 2、数字键 3、向上键{ 0x34, 0x35, 0x36, 0x25 }, //数字键 4、数字键 5、数字键 6、向左键{ 0x37, 0x38, 0x39, 0x28 }, //数字键 7、数字键 8、数字键 9、向下键{ 0x30, 0x1B, 0x0D, 0x27 } //数字键 0、ESC 键、回车键、向右键};unsigned char KeySta[4][4] = { //全部矩阵按键的当前状态{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}};signed long beats = 0; //电机转动节拍总数void KeyDriver();void main(){EA = 1; //使能总中断TMOD = 0x01; //设置 T0 为模式 1TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1msTL0 = 0x67;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0while (1){KeyDriver(); //调用按键驱动函数}}/* 步进电机启动函数,angle-需转过的角度 */void StartMotor(signed long angle){//在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误EA = 0;beats = (angle * 4076) / 360; //实测为 4076 拍转动一圈EA = 1;}/* 步进电机停止函数 */void StopMotor(){EA = 0;beats = 0;EA = 1;}/* 按键动作函数,根据键码执行相应的操作,keycode-按键键码*/void KeyAction(unsigned char keycode){static bit dirMotor = 0; //电机转动方向//控制电机转动 1-9 圈if ((keycode>=0x30) && (keycode<=0x39)){if (dirMotor == 0){StartMotor(360*(keycode-0x30));}else{StartMotor(-360*(keycode-0x30));}}else if (keycode == 0x26){ //向上键,控制转动方向为正转dirMotor = 0;}else if (keycode == 0x28){ //向下键,控制转动方向为反转dirMotor = 1;}else if (keycode == 0x25){ //向左键,固定正转 90 度StartMotor(90);}else if (keycode == 0x27){ //向右键,固定反转 90 度StartMotor(-90);}else if (keycode == 0x1B){ //Esc 键,停止转动StopMotor();}}/* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */void KeyDriver(){unsigned char i, j;static unsigned char backup[4][4] = { //按键值备份,保存前一次的值{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}};for (i=0; i<4; i++){ //循环检测 4*4 的矩阵按键for (j=0; j<4; j++){if (backup[i][j] != KeySta[i][j]){ //检测按键动作if (backup[i][j] != 0){ //按键按下时执行动作KeyAction(KeyCodeMap[i][j]); //调用按键动作函数}backup[i][j] = KeySta[i][j]; //刷新前一次的备份值}}}}/* 按键扫描函数,需在定时中断中调用,推荐调用间隔 1ms */ void KeyScan(){unsigned char i;static unsigned char keyout = 0; //矩阵按键扫描输出索引static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}};//将一行的 4 个按键值移入缓冲区keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;//消抖后更新按键状态for (i=0; i<4; i++){ //每行 4 个按键,所以循环 4 次if ((keybuf[keyout][i] & 0x0F) == 0x00){//连续 4 次扫描值为 0,即 4*4ms 内都是按下状态时,可认为按键已稳定的按下KeySta[keyout][i] = 0;}else if ((keybuf[keyout][i] & 0x0F) == 0x0F){//连续 4 次扫描值为 1,即 4*4ms 内都是弹起状态时,可认为按键已稳定的弹起KeySta[keyout][i] = 1;}}//执行下一次的扫描输出keyout++; //输出索引递增keyout = keyout & 0x03; //索引值加到 4 即归零//根据索引,释放当前输出引脚,拉低下次的输出引脚switch (keyout){case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;default: break;}}/* 电机转动控制函数 */void TurnMotor(){unsigned char tmp; //临时变量static unsigned char index = 0; //节拍输出索引unsigned char code BeatCode[8] = { //步进电机节拍对应的 IO 控制代码0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};if (beats != 0){ //节拍数不为 0 则产生一个驱动节拍if (beats > 0){ //节拍数大于 0 时正转index++; //正转时节拍输出索引递增index = index & 0x07; //用&操作实现到 8 归零beats--; //正转时节拍计数递减}else{ //节拍数小于 0 时反转index--; //反转时节拍输出索引递减index = index & 0x07; //用&操作同样可以实现到-1 时归 7beats++; //反转时节拍计数递增}tmp = P1; //用 tmp 把 P1 口当前值暂存tmp = tmp & 0xF0; //用&操作清零低 4 位tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低 4 位P1 = tmp; //把低 4 位的节拍代码和高 4 位的原值送回 P1}else{ //节拍数为 0 则关闭电机所有的相P1 = P1 | 0x0F;}}/* T0 中断服务函数,用于按键扫描与电机转动控制 */void InterruptTimer0() interrupt 1{static bit p = 0;TH0 = 0xFC; //重新加载初值TL0 = 0x67;KeyScan(); //执行按键扫描//用一个静态 bit 变量实现二分频,即 2ms 定时,用于控制电机p = ~p;if (p == 1){TurnMotor();}}这个程序是第 8 章和本章知识的一个综合——用按键控制步进电机转动。
步进电机控制实验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。
使用单片机89C51控制步进电机程序详细介绍
使用单片机89C51控制步进电机程序详细介绍;步进电机控制程序例程p3.2 正转,p3.3 反转,p3.4停止。
步进电机接p0.0 p0.1 p0.2 p0.3;具体程序如下:org 00hstop: ORL p0,#0ffh ; 步进电机停止loop:jnb p3.2,for2 ; 如果p3.2 按下正转jnb p3.3,rev2 ; 如果p3.3 按下反转jnb p3.4,stop1 ; 如果p3.4按下停止jmp loop ;反复监测键盘for: mov r0,#00h ;正转到tab取码指针初值for1:mov a,r0 ;取码mov dptr,#table ;movc a,@a+dptrjz for ;是否到了结束码00hcpl a ;把acc 反向mov p0,a ;输出到p0开始正转jnb p3.4,stop1 ; 如果p3.4 按下停止jnb p3.3,rev2 ; 如果p3.3按下反转call delay ;转动的速度inc r0 ;取下一个码jmp for1 ;继续正转rev:mov r0,#05h ;反转到tab取码指针初值rev1:mov a,r0mov dptr,#table ;取码movc a,@a+dptrjz rev ;是否到了结束码00hcpl a ;把acc 反向mov p0,a ;输出到p0开始反转jnb p3.4,stop1 ; 如果p3.4 按下停止jnb p3.3,rev2 ; 如果p3.3按下反转call delay ;转动的速度inc r0 ;取下一个码jmp rev1 ;继续反转stop1:call delay ; 按p3.4 的消除抖动jnb p3.4,$ ; p3.4 放开否?call delay ;放开消除抖动jmp stopfor2:call delay ; 按p3.2 的消除抖动jnb p3.2,$ ; p3.2 放开否?call delay ;放开消除抖动jmp forrev2:call delay ; 按p3.3的消除抖动jnb p3.3,$ ; p3.3 放开否?call delay ;放开消除抖动jmp revdelay:mov r1,#40 ;步进电机的转速20ms d1:mov r2,#248 djnz r2,$djnz r1,d1rettable:db 03h,09h,0ch,06h ;正转表db 00 ;正转结束db 03h,06h,0ch,09h ;反转db 00 ;反转结束end。
单片机控制步进电机程序+视频
单片机控制步进电机程序+视频展开全文完善二源程序:/*-----------------------------------------------------------------------------工作板源程序-----------------------------------------------------------------------------*/#include <REG52.H> //各个特殊功能寄存器地址定义#include <intrins.h>/*-----------------------------------------------------------------------------用于串行输入SPI的数据接收口-----------------------------------------------------------------------------*/volatile unsigned int data zd0; //功能1的时候调整蜂鸣器时间volatile unsigned char data SPI_DH,SPI_DL;//串行口高位和低位高位用于识别功能指令和地址指令,低位用于数据传输volatile unsigned char data SPI_ZL,SPI_DZ,SPI_SJ;volatileunsigned int data m,z;/*-----------------------------------------------------------------------------三变量用于默认的速度,宽度,高度。
-----------------------------------------------------------------------------*/volatile unsigned char data b=100; //单位是rpm/minvolatile unsigned char data BBZ;volatile unsigned char data c=1; // 宽度单位是毫米volatile unsigned char data CBZ;volatile unsigned char data d=4; // 高度单位是毫米volatile unsigned char data DBZ;/*-----------------------------------------------------------------------------三变量用于速度,宽度,高度的翻译中间变量-----------------------------------------------------------------------------*/unsigned char data e;// 用于速度unsigned char data f; //用于宽度unsigned char data g;//用高度/*-------------------------------------------------------------P0引脚定义: P0口有5种定义,每种定义根据P2口给定功能不同而不同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar idata T0low, T0high,common_count,input_order,cmd_in_permit,interval;
uchar sent_ok,speed_change,start_up,start_end,address_true,i;
uint y1;
uint code add[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,65111,65141,65167,65190,65211,65229,65245,65260,65273,65285,65296,65306,65315,65323,65331,65339,65345,65352,65358,65363,65368,65373,65378,65382,65387,65390,65394,65398,65401,65404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,65437,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65453,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65469,65470,65471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,65480,65481};
P2_2=0;/*步进电机的旋转方向待试验后确定*/
P1_0=1;/*开机时需要关断,串口发送功能,需要时再接通*/
WD=1; /*看门狗先为1,电平翻转为喂狗*/
i=0;
common_count=0;
cmd_in_permit=0;
input_order=0;
interval=0;
address_true=1;
#include "reg52.h"
#include "INTRINS.H"
#include <absacc.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
void check_addr(void); /*地址核对*/
ET2=1; //打开定时器2中断
do
{
if(address_true==1)
{
address_true=0;
check_addr();
}
if(start_up==1&&start_end==0) //第一次启动
{
y1=add[common_count];
T0high = (uchar)(y1>>8) ;/*取y1的高8位*/
}
void timer2(void) interrupt 5 using 2
{
TF2=0;/*T2溢出中断需软件清0*/
speed_change=1; //速度可以改变标示,以便主程序处理
SM2=1;
TR1 = 1;
ES=1;//启动定时器1
T2MOD=00;
T2CON=0x00;
RCAP2H =0xEE; //赋T2的预置值0xA600,25MS,0xB800,20MS,0xCA00,15MS,0xDC00,10MS,0xEE00,5MS
RCAP2L =0x00;
TR2=1; //启动定时器
speed_change=0;
start_up=0;
start_end=0;
sent_ok=0; //允许发送
EA=1;/*开放总中断*/
TMOD=0x21;
TH1 = 0xxFD;
SCON = 0xd0;//设定串行口工作方式
PCON &= 0x00;//波特率不倍增
{common_count=common_count+1; }
if(interval<common_count)
{common_count=common_count-1; }
}
speed_change=0;
}
if(sent_ok==1)
{
sent_ok=0;
P1_0=0;
for(i=0;i<=20;i++) {_nop_();}
sbit P2_0=P2^0;/*作输入步进电机的脉冲信号发送口*/
sbit P2_2=P2^2;/*作输入步进电机的旋转方向信号发送口*/
sbit P1_0=P1^0;/*作串口输出信号的使能口, P1_0=0时接通串口,输出信号*/
sbit WD=P1^7; /*看门狗*/
main()
{
P2_0=0;
{
P2_0=~P2_0;
y1=add[common_count];
T0high = (uchar)(y1>>8) ;/*取y1的高8位*/
T0low = (uchar)(y1&0x00ff);/*取y1的低8位*/
TH0=T0high;/*高8位T0high送定时器0的TH0*/
TL0=T0low;/*低8位T0low送定时器0的TL0*/
T0low = (uchar)(y1&0x00ff);/*取y1的低8位*/
TR0 = 1;
ET0=1;/*允许T/C0中断*/
start_end=1;
}
if(speed_change==1)
{
if(interval>=0&&interval<=0x63)
{
if(interval>common_count)
TI=0; SBUF=T0high;
while(TI==0);TI=0;
TI=0; SBUF=T0low;
while(TI==0);TI=0;
P1_0=1;
for(i=0;i<=20;i++) {_nop_();}
SM2=1;
}
}
while(1);
}
void timer0(void) interrupt 1 using 3