步进电机仿真和源代码
步进电机控制-C程序及仿真

步进电机控制-C程序及仿真步进电机步进电机和普通电动机不同之处是步进电机接受脉冲信号的控制。
步进电机可以直接接受数字信号,不需要进行数字与模拟量的转换,具有高精度快速启停能力。
在非超载的情况下,步进电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。
使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
一、步进电机的结构和工作原理步进电机是一种专门用于位置和速度精确控制的特种电机。
步进电机的最大特点是其“数字性”,对于微电脑发过来的每一个脉冲信号,步进电机在其驱动器的推动下运转一个固定角度(简称一步),如下图所示。
如接收到一串脉冲步进电机将连续运转一段相应距离。
同时可通过控制脉冲频率,直接对电机转速进行控制。
步进电机在构造上有三种主要类型:反应式(Variable Reluctance,VR)、永磁式(Permanent Magnet,PM)和混合式(Hybrid Stepping,HS)。
反应式定子上有绕组、转子由软磁材料组成。
结构简单、成本低、步距角小,可达1.2°、但动态性能差、效率低、发热大,可靠性难保证。
永磁式永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。
其特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大(一般为7.5°或15°)。
混合式混合式步进电机综合了反应式和永磁式的优点,其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。
其特点是输出力矩大、动态性能好,步矩角小,但结构复杂、成本相对较高。
混合型,因具有高精度、高转矩、微小步进角和数个优异的特征,所以刚开始在OA 关系,其它的分类上也大幅的被使用,特别是在生产量上大半是使用在盘片记忆关系的磁头转送上。
按定子上绕组来分,共有二相、三相和五相等系列。
89C2051驱动步进电机的电路和源码

89C2051驱动步进电机的电路和源码时间:2006-10-26 来源: 作者: 点击:1434 字体大小:【大中小】程序stepper.cstepper.hex/** STEPPER.C* sweeping stepper's rotor cw and cww 400 steps* Copyright (c) 1999 by W.Sirichote*/#include c:\mc51\8051io.h /* include i/o header file */#include c:\mc51\8051reg.hregister unsigned char j,flag1,temp;register unsigned int cw_n,ccw_n;unsigned char step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}#define n 400/* flag1 mask byte0x01 run cw()0x02 run ccw()*/main(){flag1=0;serinit(9600);disable(); /* no need timer interrupt */cw_n = n; /* initial step number for cw */flag1 |=0x01; /* initial enable cw() */while(1){{tick_wait(); /* wait for 10ms elapsed */energize(); /* round-robin execution the following tasks every 10ms */ cw();ccw();}}}cw(){if((flag1&0x01)!=0){cw_n--; /* decrement cw step number */if (cw_n !=0)j++; /* if not zero increment index j */else{flag1&=~0x01; /* disable cw() execution */ccw_n = n; /* reload step number to ccw counter */flag1 |=0x02; /* enable cww() execution */}}}ccw(){if((flag1&0x02)!=0){ccw_n--; /* decremnent ccw step number */if (ccw_n !=0)j--; /* if not zero decrement index j */else{flag1&=~0x02; /* disable ccw() execution */cw_n = n; /* reload step number to cw counter */flag1 |=0x01; /* enable cw() execution */}}}tick_wait(){ /* cputick was replaced by simpler ASM code 10ms wait */asm" JNB TCON.5,*"; /* wait for TF0 set */asm" CLR TCON.5"; /* clear TF0 for further set */asm" ORL TH0,#$DC"; /* reload TH0 with $DC, TL0 = 0 */}energize(){P1 = step[(j&0x07)]; /* only step 0-7 needed */}电路图Tags:步进电机89C2051如何用单片机控制步进电机时间:2006-10-26 来源: 作者: 点击:2106 字体大小:【大中小】步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
大学毕业设计 C51程序控制步进电机

题目:简易步进电机控制步进电机控制摘要:本设计采用ATMEL公司DIP-40封装的AT89S52单片机实现对四相步进电机的手动和按键控制。
由单片机产生的脉冲信号经过分配后分解出对应的四相脉冲,分解出的四相脉冲经驱动电路功率放大后驱动步进电机的转动。
转速的调节和状态的改变由按键进行选择,此过程由程序直接进行控制。
通过键盘扫描把选择的信息反馈给单片机,单片机根据反馈信息做出相应的判断并改变输出脉冲的频率或转动状态信号。
电机转动的不同状态由液晶LCD1602显示出来。
而设计的扩展部分可以通过红外信号的发射由另一块单片机和红外线LED完成,用红外万能接收头接收红外信号,可以实现对电机的控制进行红外遥控。
关键字:四相步进电机单片机功率放大 LCD1602步进电机控制 (1)摘要 (1)关键字 (1)前言 (3)1系统总体方案设计及硬件设计 (4)1.1步进电机 (4)1.1.1 步进电机的种类 (4)1.1.2 步进电机的特点 (4)1.1.3 步进电机的原理 (5)1.2 控制系统电路设计 (7)1.3 液晶显示LCD1602 (7)1.4 AT89S52核心部件及系统SCH原理图 (9)1.5 LN2003A驱动 (10)2软件设计及调试 (13)2.1程序流程 (13)2.2软件设计及调试 (14)3 扩展功能说明 (15)4设计总结 (16)5 设计源程序 (16)6 附录 (21)参考文献 (22)附2:系统原理图及实物图 (23)步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。
目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。
分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。
EMU8086 仿真软件在《 微机原理》 课程教学中的应用

EMU8086 仿真软件在《微机原理》课程教学中的应用楼俊君(上海电力学院电自学院信控系,上海200090)摘要:针对微机原理教学中存在的问题,提出了用EMU8086 仿真软件来解决的办法,并通过两个实例说明了该软件在汇编程序设计和接口技术方面的应用。
关键词:微机原理;EMU8086;应用0 前言《微机原理》课程是目前高校计算机专业及其相关专业学生必修的一门专业基础课,是学生学习后续课程、毕业设计和今后工作的重要技术基础。
该课程的任务是以美国Intel公司生产的16位CPU8086 为主线,介绍微型计算机的硬件结构、工作原理、汇编语言程序设计方法及微型计算机的接口技术[1]。
由于该门课程对实践动手能力要求高,涉及的信息量大、知识点多、教学内容较抽象,学生普遍反映该门课很难学。
其中汇编语言程序设计和接口技术是学生学习的两大难点。
因为汇编程序设计涉及到汇编指令系统中相应指令的使用,而8086/8088CPU的指令系统共包含92种基本指令,对指令系统的学习即是对这92 种基本指令的功能和用法的介绍,这很容易让学生感到枯燥乏味,提不起学习兴趣。
并且汇编程序运行的传统方法界面不直观,无论是教师演示或是学生实验使用起来都感到不方便。
接口技术涉及到对可编程接口芯片的访问,这部分内容较抽象,学生学习起来感觉到很难理解。
作为该课程的授课教师,如何才能解决教学中存在的上述两大难点问题呢?笔者经过较长时间的探索和实践,发现用EMU8086这款仿真软件可较好地解决上述问题。
1 EMU8086 介绍EMU8086 是Digital River 公司推出的16位CPU8086的仿真软件,它将汇编语言程序设计和虚拟接口技术有机地结合起来,其内部集成了汇编程序编译器、连接器、参考例程、学习指南,并提供了交通灯、机器人、步进电机等七个虚拟外设,是学习Intel 8086 微处理器的理想工具。
EMU8086 的工作界面为纯WINDOWS,界面友好,由菜单栏、快捷按钮栏和用户工作区构成,它能模拟真实微处理器工作的每一步骤,通过单步调试显示指令执行后CPU 内部寄存器、存储器、堆栈、变量和标志寄存器的当前值,操作简单直观,通过它学生可以很快掌握汇编程序设计和接口技术等知识。
stm32步进电机控制教程

本教程介绍步进电机驱动和细分的工作原理,以及stm32103为主控芯片制作的一套自平衡的两轮车系统,附带原理图pcb图和源代码,有兴趣的同学一起来吧.本系统还有一些小问题,不当之处希望得到大家的指正.一.混合式步进电机的结构和驱动原理电机原理这部分不想讲的太复杂了,拆开一台电机看看就明白了。
电机的转子是一个永磁体,它的上面有若干个磁极SN组成,这些磁极固定的摆放成一定角度。
电机的定子是几个串联的线圈构成的磁体。
出线一般是四条线标记为A+,A-,B+,B-。
A相与B相是不通的,用万用表很容易区分出来,至于各相的+-出线实际是不用考虑的,任意一相正负对调电机将反转。
另外一种出线是六条线的只是在A相和B相的中间点做两条引出线别的没什么差别,六出线的电机通过中间出线到A+或A-的电流来模拟正向或负向的电流,可以在没有负相电流控制的电路中实现电机驱动,从而简化驱动电路,但是这种做法任意时刻只有半相有电流,对电机的力矩是有损失的。
步进电机的转动也是电磁极与永磁极作用力的结果,只不过电磁极的极性是由驱动电路控制实现的。
我们做这样的一个实验就可以让步进电机转动起来。
1找一节电池正负随意接入到A相两端;然后断开;(记为A正向)2再将电池接入到B相两端; 然后断开;(记为B正向)3电池正负对调再次接入A相; 然后断开;(记为A负向)4保持正负对调接入B 相;然后断开;(记为B负向)…如此循环你会看到步进电机在缓慢转动。
注意电机的相电阻是很小的接通时近乎短路。
我们将相电流的方向记录下来应该为:A+B+A-B-A+…,如果我们更换接线顺序使得相电流顺序为A+B-A-B+A+…这时我们会看到电机向反方向运动。
这里每切换一次相电流电机都会转动一个很小的角度,这个角度就是电机的步距角。
步距角是步进电机的一个固有参数,一般两相电机步距角为1.8度即切换200次可以让电机转动一圈。
这里我们比较正反转的电流顺序可以看出A+和A-;B+和B-的交换后的顺序和正反顺序是一致的,也就是前面所说的”任意一相正负对调电机将反转”。
FPGA实现步进电机控制源代码

FPGA实现步进电机控制源代码.txt我爸说过的最让我感动的一句话:“孩子,好好学习吧,爸以前玩麻将都玩儿10块的,现在为了供你念书,改玩儿1块的了。
”module fenpin(clk_48m,reset,out_door,addr,data,data_rd,rd,rw,Grating_a,Grating_b); input clk_48m,data_rd,reset,rd,rw,Grating_a,Grating_b;input [8:0]addr;output out_door;inout [7:0]data;reg flag;reg [23:0]step;reg [23:0]pul_counter;reg [5:0]clk_div1m;reg [23:0]den;reg [23:0]counter;reg [23:0]counter_now;reg [19:0]Grating_counter;reg [7:0]com;reg [7:0]databuff;reg out=0;reg data_link;reg direct;assign data=data_link?databuff:8'bzzzzzzzz;assign out_door=out&flag;always@(posedge clk_48m)if(clk_div1m<6'h2e)clk_div1m <=clk_div1m+1;elseclk_div1m<=0;assign clk_1m=(clk_div1m==6'h2e);always @(posedge clk_1m)beginif(!reset)begincounter_now<=24'b1111_1111_1111_1111_1111_1111; endelse if(com[0:0]==1'b1)beginif(counter_now>den)begincounter_now<=counter_now-1;endelsebeginendendelsebeginendendalways @(posedge clk_48m)beginif(!reset)begincounter<=0;endelse if(com[0:0]==1'b1)beginif(counter==counter_now-1)begincounter<=0;out=~out;endelsebegincounter<=counter+1;endendelsebeginendendalways @ (posedge out)beginif(!reset)beginflag<=1;pul_counter<=0;endelsebeginif(pul_counter==step)beginflag<=0;pul_counter<=0;endelse pul_counter<=pul_counter+1;endendalways@(posedge Grating_a)if(Grating_b==1)direct=1;else direct=0;always@(posedge Grating_a)beginif(!reset)Grating_counter=0;else if(direct==1)Grating_counter<=Grating_counter+1;else Grating_counter<=Grating_counter-1; endalways @(posedge clk_48m)beginif(!reset)begindata_link<=1'b0;endelse if(rw)begindata_link<=1'b1;endendalways @( posedge clk_48m )beginif(!reset)beginstep<=0;den<=0;com<=0;endelse if(data_rd&rw&!rd)case(addr)3'b000 : den[7:0]<= data;3'b001 : den[15:8]<= data;3'b010 : den[23:16]<=data;3'b011 : step[7:0]<= data;3'b100 : step[15:8]<= data;3'b101 : step[23:16]<=data;3'b110 : com[7:0]<=data;//数据传送完毕endcaseelsebeginendendalways @(posedge clk_48m)beginif(!reset)begindatabuff<=0;endelse if(data_rd&rd&!rw)case(addr)8'h00:databuff<=den[7:0];8'h01:databuff<=den[15:8];8'h02:databuff<=den[23:16];8'h03:databuff<=step[7:0];8'h04:databuff<=step[15:8];8'h05:databuff<=step[23:16];8'h06:databuff<=com[7:0];8'h07:databuff<=Grating_counter[7:0];8'h08:databuff<=Grating_counter[15:8];8'h09:databuff<={4'h0,Grating_counter[19:16]}; endcaseelsebeginend end endmodule。
用proteus学习步进电机

用proteus学习步进电机步进电机是一种将电脉冲转化为角位移的执行机构。
通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
2.步进电机分哪几种?步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB)永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。
在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。
它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为0.72度。
这种步进电机的应用最为广泛。
上面是我在网上搜到的,重复的事情就不要做了,所以我直接给粘过了,我简单的解释一下,步进电机了,一般有,二相的,三相的,五相的,所谓的的相,就是电机里面推动电机的转的东西,叫绕组,二相的了,就是有两个绕组,如果说分A,B的话,A转一下,B再转一下,一圈了是360度,一个可以转1.8度,算一算,就是20次,AB它们就像接力一样,你推着轴转一些,我在接着转。
很显然,如果有三项,或是五项的话,那么就会比较精细,也就是说,每次转度的角度,可以更小,可以更精确的控制,反正就是这么回事。
上图。
一开始,我看了这个MOTOR的线不知道怎么接,有6根,其实,中间的两根是接电源的,上面的两根,下面的两根,分别接单片机的IO口。
驱动步进电机的,用的是ULN2003 还有L297/L298 我问下朋友,他们说L297/298现在用的多些,今天先用ULN2003联下,有时间再用L297/L298试下,另我买的开发板是个两相的,是用H式三极管来驱动的,很有意思,for(i=0;i<speed;i++){}}void main(){uint j,count= 20;uint speed = 2000;while(1){for(j=0;j<count;j++){P1=0x03;//4个引脚轮流转动delay(speed);P1=0x06;delay(speed);P1=0x0c;delay(speed);P1=0x09;delay(speed);}}}步进电动机(Step Motor)是一种数字控制电动机,它能将数字脉冲信号转换成角位移,即向其输出一个脉冲信号,步进电机就转动一个角度或者直线位移一步,所以称其为步进电机。
单片机控制步进电机系统(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:
功能特性描述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #include "keyboard.h" #define OSC 12000000 void CheckKey(unsigned char key);//判判长按 void DisplayNum(unsigned int count);//每扫扫数数左左 unsigned long Round;//保保正每保保用用 unsigned char THR0,TLR0; unsigned char code LedChar[] = { 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xBF,/*-*///保保0~9,-,每扫扫真数数 }; unsigned char code BeatCode[] = {0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06};//定定步进电机每拍扫 unsigned long beats;//左左计每拍每 unsigned char ledBuff[] = {0xFF,0xFF,0xFF,0xFF};//保保但数数保每 unsigned char set = 0;//2为正每,1为用用 bit CLW = 0;//0为正正,1正正 bit RUN = 0;//0为暂为,1运执 bit Pause = 0;//暂暂 bit flag2ms = 0;//2毫毫毫毫 sbit Dig1 = P2^4;//每数从左到左1,2,3,4并 sbit Dig2 = P2^5; sbit Dig3 = P2^6; sbit Dig4 = P2^7; void ConfigTimer0(unsigned int ms)//设设左每设设每 { unsigned long tmp = ms; tmp = (tmp*OSC)/12/1000; tmp = 65536 - tmp; THR0 = (unsigned char)(tmp >> 8); TLR0 = (unsigned char)tmp; TMOD &= 0xF0;//左每设0,模模1 TMOD |= 0x01; ET0 = 1;//开启开判 TR0 = 1;//启启定启设0 TH0 = THR0;//给TH0,TL0初数 TL0 = TLR0; } void main() { unsigned char tmp; unsigned char index = 0;//保保保保每拍保保 unsigned char cindex = 0; unsigned char rindex = 6; ConfigTimer0(1); EA = 1;//开启开并开判 ledBuff[0] = LedChar[set]; DisplayNum(0); while(1) { KeyDrive();// if(flag2ms) { flag2ms = 0; if(beats != 0) { tmp = P2; tmp &= 0xF0; tmp |= BeatCode[index]; P2 = tmp;//正启步进电机 if(!CLW) { cindex++; cindex &= 0x07; index = cindex; } else { rindex--; rindex &= 0x07;
Page 3
E:\Altium Designer Workspace\已经完成\步进电机\仿真\步进电机\keyboard.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #include "keyboard.h" unsigned char keySta[] = {1,1,1,1,1,1,1};//长按按按 unsigned int keyTime[] = {0,0}; unsigned char keyCnt[] = {0,0}; extern void CheckKey(unsigned char key); void ScanKey() { static unsigned char keyBuff[] = {0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F};//保保长按按按 unsigned char i; keyBuff[0] = (keyBuff[0] << 1)|Key0;//读取长按按按 keyBuff[1] = (keyBuff[1] << 1)|Key1;//读取长按按按 keyBuff[2] = (keyBuff[2] << 1)|Key2;//读取长按按按 keyBuff[3] = (keyBuff[3] << 1)|Key3;//读取长按按按 keyBuff[4] = (keyBuff[4] << 1)|Key4;//读取长按按按 keyBuff[5] = (keyBuff[5] << 1)|Key5;//读取长按按按 keyBuff[6] = (keyBuff[6] << 1)|Key6;//读取长按按按 for(i = 0;i < 7;i++) { if((keyBuff[i]&0x0F) == 0x0F)//判判长按判判判判判 { keySta[i] = 1; if(i == 2) { keyCnt[0] = 0; keyTime[0] = 0; } else if(i == 3) { keyCnt[1] = 0; keyTime[1] = 0; } } else if((keyBuff[i]&0x0F) == 0x00)//判判长按判判判长判 { keySta[i] = 0; if(i == 2) { keyCnt[0]++; if(keyCnt[0] >= 200) { keyCnt[0] = 0; keyTime[0]++;//为长长按为为加 } } else if(i == 3) { keyCnt[1]++; if(keyCnt[1] >= 200) { keyCnt[1] = 0; keyTime[1]++;//为长长按为为减 } } } } } void KeyDrive() { static unsigned char keyBack[] = {1,1,1,1,1,1,1};//保保保保保保长按 static unsigned int keyTim[] = {3,3};//第第第第第600毫毫毫长长为为,以保以200毫毫为为第第 unsigned char i; for(i = 0;i < 7;i++) { if((keyBack[i] != keySta[i]))//如如长按按按保保 { if(keySta[i] == 0)//如如判长判如如如长按 { CheckKey(i); } keyBack[i] = keySta[i]; } } if(keyTime[0] > 0)//长长加 { if(keyTime[0] > keyTim[0])
} void InterruptTimer0() interrupt 1 { static unsigned char cnt = 0; TH0 = THR0; TL0 = TLR0; if(RUN) { if(!Pause) cnt++; if(cnt > 20)//模模模模以20毫毫判启第如每拍,判不不不每拍,实实第第2毫毫 { cnt = 0; flag2ms = 1; } } else cnt = 0; ScanKey();//扫扫长按 LedScan();//扫扫每扫扫 }
Page 1
E:\Altium Designer Workspace\已经完成\步进电机\仿真\步进电机\main.c
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 index = rindex; } beats--; if(beats > 999) DisplayNum(999); else DisplayNum(beats); } else if(beats == 0) { RUN = 0; DisplayNum(beats); } } } } void DisplayNum(unsigned int count) { unsigned int tmp; unsigned char i,j; tmp = count;//左左每扫扫,并并如如并但并从左到左如如并并1~9保每,每扫扫判数 for(i = 3;i > 0;i--) { ledBuff[i] = LedChar[tmp%10]; tmp /= 10; } for(i = 1;i < 3;i++) { if(ledBuff[i] != 0xC0) break; } for(j = 1;j < i;j++) ledBuff[j] = 0xFF; } void CheckKey(unsigned char key)//判判长按 { if(RUN) { if((key != 5)&&(key !=6)) return; } if(key == 0)//设设判长用用设判长设每 { set++; if(set > 2) set = 1; ledBuff[0] = LedChar[set]; DisplayNum(Round); } if(set == 0) return; if(key == 1)//正正正 { CLW = !CLW; if(CLW) { ledBuff[0] = LedChar[10]; } else { ledBuff[0] = LedChar[CLW]; } DisplayNum(Round); } else if(key == 2)//加 { if(Round < 1000) Round++; DisplayNum(Round); } else if(key == 3)//减 { if(Round > 0) Round--; DisplayNum(Round); } else if(key == 4)//运执长按长判