单片机控制步进电机c语言程序
89C51单片机对步进电动机的C语言控制程序
89C51单片机对步进电动机的控制程序啊?兄弟做的如何了?我也是不懂啊,真是有点同病相怜了这个程序是课程设计的,现在老师要复杂点的,不让用延时程序了,因为浪费CPU时间,改为定时器扫描防抖,还有显示是用四个数码管,用四个键控制,其中一个起停,一个正反转,两个加减速。
我只能写到这些了,你有何进展,交流一下吧#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52标准内核的头文件sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit K1 = P3^2;sbit K2 = P3^5;sbit K3 = P3^6;sbit K4 = P3^7;sbit P20=P2^0;sbit P21=P2^1;bit ldelay=0; //长定时溢出标记,预置是0uchar a,m=50;uchar result;uint b,n;uint i,j;char code dx516[3] _at_ 0x003b;//这是为了仿真设置的/*********************************************************************** ***********///电机正转void zheng_z(){ uchar code ledp1[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//预定的写入P1的值正转uchar ledi1; //用来指示正转显示顺序P1=ledp1[ledi1];//读出一个值送到P1口ledi1++;//指向下一个if(ledi1==8)ledi1=0; //到了最后一个灯就换到第一个}//电机反转void fan_z(){ uchar code ledp2[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//预定的写入P1的值反转uchar ledi2; //用来指示反转显示顺序P1=ledp2[ledi2];//读出一个值送到P1口ledi2++; //指向下一个if(ledi2==8)ledi2=0; //到了最后一个灯就换到第一个}//减速void jian_s(){m+=5;if(m>=50)m=50;}//加速void jia_su(){ m-=5;if(m<=10)m=10;}/*******************************************************************/ void delay(uint j){j=100;for(i=0;i<j;i++){;}}void display(uint x){switch(x){case 0: P0=0xC0;break;case 1: P0=0xF9;break;case 2: P0=0xA4;break;case 3: P0=0xB0;break;case 4: P0=0x99;break;case 5: P0=0x92;break;case 6: P0=0x82;break;case 7: P0=0xF8;break;case 8: P0=0x80;break;case 9: P0=0x90;break;}}void sudu(uint c){switch(c){case 50: result=15;break;case 45: result=17;break;case 40: result=19;break;case 35: result=21;break;case 30: result=25;break;case 25: result=30;break;case 20: result=38;break;case 15: result=50;break;case 10: result=75;break;}}/*******************************************************************/ //主程序void main(void){TMOD = 0x01; //设定时器0为16位模式TH0 =0xdb; //赋T0的预置值0xdbTL0 =0xff;TR0=1; //启动定时器ET0=1; //打开定时器0中断EA=1; //打开总中断while(1) //主程扫描各键值{if(ldelay) //发现有时间溢出标记,进入处理{ldelay=0; //清除标记zheng_z();if(!K3)a=1; //如果读到K3为0if(!K4)a=0; //如果读到K4为0if(a==1)zheng_z();elsefan_z();if(!K1) //如果读到K1为0jian_s(); //减速if(!K2) //如果读到K2为0jia_su(); //加速/*********************************************************************** ************/sudu(m);b=result/10;n=result%10;P20=1;P21=0;display(b);delay (2);P20=~P20;P21=~P21;display(n);delay (2);}}}//定时器0中断timer0() interrupt 1{static uchar t;TH0 =0xdb; //赋T0的预置值0xdbTL0 =0xff;//TF0=0;t++;if(t==m){ t=0;ldelay=1;}}//定时器1中断/*timer1() interrupt 3{static uchar t;TF0=0;t++;if(t==20) { t=0; ldelay=1; } }*/。
(毕业设计)基于单片机的步进电机控制系统(汇编及C语言程序各一个)
基于单片机的步进电机控制系统设计前言步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。
控制系统通过单片机存储器、I/O接口、中断、键盘、LED 显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,急停等功能。
为实现单片机控制步进电机系统在数控机床上的应用,系统设计了两个外部中断,以实现步进电机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动,随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,自六十年代初期以来,步进电机的应用得到很大的提高。
人们用它来驱动时钟和其他采用指针的仪器,打印机、绘图仪,磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等机械装置。
此外作为执行元件,步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中,随着微电子和计算机技术的发展,它的需要量与日俱增,在各个国民经济领域都有应用。
步进电机是机电数字控制系统中常用的执行元件,由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用,大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。
1.步进电机原理及硬件和软件设计1.1步进电机原理及控制技术由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专业设备一步进电机控制驱动器,典型步进电机控制系统如图1所示:控制器可以发出脉冲频率从几赫兹到几千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列,环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输入端,以驱动步进电机的转动,环形分配器主要有两大类:一类是用计算机软件设计的方法实现环形分配器要求的功能,通常称软环形分配器。
单片机控制步进电机系统(C语言源代码)
题目:单片机控制步进电机系统摘要很多工业控制设备对位移和角度的控制精度要求较高, 一般电机很难实现, 而步进电机可精确实现所设定的角度和转数。
本设计主要是运用51 单片机控制六线4相步进电机系统, 由单片机产生驱动脉冲信号, 控制步进电机以一定的转速向某一方向产生一定的转动角度。
同时能够利用单片机实现电机的正、反转及速度控制,并能在数码管上显示出相应的速度。
本文中给出了该系统设计的硬件电路,软件设计,人机交互等。
并对各个功能模块进行了详细的说明。
主要内容包括以下几个方面:单片机控制步进电机的一般原理。
电机驱动及控制的实现。
控制系统整体设计以及模块划分说明。
原理图。
代码。
关键词:单片机;步进电机;系统;驱动AbstractMany Industrial control equipment have a highly requirement in displacement and angle with control accuracy, the most motor can't carry out .but the step motor can carry out the displacement and angle that you enactmented in accuracy. This design mainly used SCM to control step motor system.The step motor is formed six lines and four phasic.Through SCM generate the drive pulse signal.Control stepper motor through a certain speed in a direction to get a certain degree of rotation angle.At the same time, It can use SCM to realization of the motor is , reverse and speed control. and showed the speed in the digital tube.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) The general principles of signal_chip controlling step motor.(2) The realization of motor driving and controlling(3) Control system overall design and description module division(4) Schematic Diagram(5) CodeKey Words:SCM; stepper motor; system; drive目录引言41 单片机控制步进电机的一般原理41.1 步进电机41.1.1 步进电机介绍41.1.2 步进电机分类51.1.3 技术指标51.1.4 步进电机工作原理51.2 单片机72 步进电机驱动实现82.1简介82.2驱动选择83 系统硬件设计93. 1 单片机控制电机93.2 键盘93.3 显示部分10程序流程图11总结12致谢13参考文献13附录13C代码13引言目前,在工业控制生产以及仪器上应用十分广泛。
基于单片机ULN2003的步进电机控制系统(汇编及C语言程序各一个)
1.3.4软件设计速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成 4个部 分的工作才能满足课题要求,即主程序部分、定时器中断部分、外部中断0和外部中断1部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测, 若启动开关合上则系统开始工作,反之系统停止工作;定时器部分控制脉冲频率, 它决定了步进电机转速的快慢;两个外部中断程序要做的工作都是为了完成改变 速度这一功能。
下面分析主程序与定时器中断程序及外部中断程序。
(1) 主程序设计主程序中要完成的工作主要有系统初始值的设置、系统状态的显示以及各种 开关状态的检测判断等。
其中系统初始状态的设置内容较多,该系统中,需要初始化定时器、外部中断;对P1 口送初值以决定脉冲分配方式,速度值存储区送初 值决定步进电机的启动速度,对方向值存储区送初值决定步进电机旋转方向等内 容。
若初始化P 1=11H 、速度和方向初始值均设为0,就意味着步进电机按四相单四拍运行,系统上电后在没有操作的情况下,步进电机不旋转,方向值显示“ 0”速度值显示“ 0”主程序流程图如图9所示。
C1iH:TC TC3 -> W需ReC2<TE>cTExTT^X2<TE><r>R5vTEKTtWflAMPCI.KADIPCI®削 D*PCUSAKRSTre.?;AP7PZITAEPZ.VAfiFZ^A-nALEFZ.4fl^-E日M*3M3FZ.T^-e Pin P1JP3IVnXDPJ.1l™p-IJPI.4 心旳P1SPliTI P1J <raacmP1Jpi.Tmis37KI10 F JIg工IlorsaT= -5-LC二r-EX图8总体电路图哥孰 ISC Si r •卞-TTWHprrr-Ex-K2lor FR4ft S通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加图9主程序流程图(2)定时中断设计步进电机的转动主要是给电机各绕组按一定的时间间隔连续不断地按规律通入电流,步进电机才会旋转,时间间隔越短,速度就越快。
步进电机实验C语言程序
c语言实现单片机控制步进电机加减速源程序
C 语言实现单片机控制步进电机加减速源程序1. 引言在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。
而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。
本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。
2. 单片机控制步进电机的加减速原理步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。
在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。
在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。
这一过程需要通过单片机的定时器和输出控制来实现。
3. C 语言实现步进电机加减速的源程序在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。
在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。
以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:```c#include <reg52.h>void main() {// 初始化定时器// 设置脉冲频率,控制步进电机的加减速过程// 控制步进电机的方向// 控制步进电机的启停}```4. 总结与回顾通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。
掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。
在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。
希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。
5. 个人观点与理解在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。
步进电机控制(单片机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 --; // 加速控制};。
单片机驱动步进电机程序代码
/********************************************************实现功能:正转程序使用芯片:A T89S52编译环境:Keil作者:【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!********************************************************/ #include<reg52.h> //库文件#define uchar unsigned char //字符型宏定义#define uint unsigned int //整型宏定义uchar tcnt; //定时器计数初值定义uint sec; //速度值定义uchar buf[11];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 delay1ms(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}/***************************定时中断服务函数*************/void t0(void) interrupt 1 using 0 //定时中断服务函数{tcnt++; //每过250ust tcnt 加一if(tcnt==1) //当tcnt满足条件时{tcnt=0; //计满重新再计sec++;if(sec==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;for(i=0;i<11;i++){buf[i] = SBUF;while(RI == 0);RI=0;}}/***********************角度控制函数****************************/void Control(){if((bai==buf[5])&(shi==buf[6])&(ge==buf[7])){shi_neng=0;};if(bai<buf[5]){shi_neng=1;fang_xiang=0;}else if(bai>buf[5]){shi_neng=1;fang_xiang=1;};if((bai==buf[5])&shi<buf[6]){shi_neng=1;fang_xiang=0;}else if((bai==buf[5]&shi>buf[6])){shi_neng=1;fang_xiang=1;};if((bai==buf[5])&(shi==buf[6]&(ge<buf[7]))){shi_neng=1;fang_xiang=0;}else if((bai==buf[5])&(shi==buf[6])&(ge>buf[7])) {shi_neng=1;fang_xiang=1;};if((bai==buf[5])&(shi==buf[6])&(ge==buf[7])){shi_neng=0;};delay1ms(3);bai=buf[5];shi=buf[6];ge=buf[7];}/************************主函数****************************/main(){EA=1;T0_Init();Uart_Init();while(1){// shi_neng=1; // 使能控制位fang_shi=1; // 工作方式控制ReceiveBuf();delay1ms(1);Control();delay1ms(10);}}/*************************结束******************************/。
单片机C语言教程-步进电机控制器制作
熟悉步进电机的技术参数 掌握D306三相混合式步进电机驱动器的各接 口信号定义及其参数设置
技能目标
掌握步进电机控制器的电路设计方法 掌握步进电机控制器的编程方法
项目描述
步进电机作为执行元件,是机电一体化的 关键产品之一,广泛应用于各种自动化控制系 统。随着微电子和计算机技术的发展,步进电 机的需求量与日俱增,在各个国民经济领域都 有应用。
1)恒频脉冲波 2)变频脉冲波
项目实践
1 步进电机控制器电路设计 2 电路焊接 3 电路调试 4 程序烧写及测试
拓展知识
1.一点接地和多点接地的应用原则 (1)根据常识,高频电路应就近多点接地,低频电路应一点接地。 (2)交流地与信号地不能共用。 (3)信号地SG和机壳地FG的连接需避免形成闭环回路。 2.印制电路板的地线布置
二、D306三相混合式步进电机驱动器
2.电气技术参数 3.接口信号定义 (1)CP+、CP-(2)CW+、CW- (3)FREE+、FREE- (4)VIN (5)ERR(6)FINE 4.拨码开关设置 1)相电流设置 2)半流功能设置 3)步进电机每转步数设置 4)单/双脉冲设置
二、D306三相混合式步进电机驱动器
5.功率接口 1)电源接线端子 2)步进电机接线端子A、B、C 6.状态指示灯 (1)蓝色灯(2)绿色灯(3)红色灯
三、步进电机控制系统
(1)CP
(2)OPTO
1
(3)FREE
线(4)DIRFra bibliotek路 连 接
(5)VCC (6)GND
(7)A+
(8)A-
(9)B+
(10)B-
三、步进电机控制系统
2.程序设计
完整的单片机控制步进电机程序
#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;。
步进电机控制程序(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”延时子程序,用循环语句延时。
基于51单片机的步进电机小车的控制程序
voidmove_left(uintspeed_l,ucharcw,ucharen);//左电机运动函数
voidmove_right(uintspeed_r,ucharcw,ucharen);//右电机运动函数
void delay(unsignedintk);//延时函数
speed=speed_l;
if(cw==1)
{
cw_left=1;
}
else
{
cw_left=0;
}
if(en==1)
{
en_left=1;
}
else
{
en_left=0;
}
}
voidmove_right(uintspeed_r,ucharcw,ucharen)
{//speed_r速度控制变量cw方向控制变量en使能控制变量
speed=speed_r;//speed数值与速度成反比请结合实际情况进行调节,
if(cw==1)//但速度不能无限加快因为步进电机有速度上限
{//而且速度加快是力矩会下降,容易导致丢步现象
cw_right=1;//所以实际应用当中应调节到速度可力矩比较合适的数值
}//应考虑到电池电压,轮胎直径等因素
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==0&&ir_mid==0&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(400);
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;}。
单片机步进电机控制程序代码
单片机步进电机控制程序代码在现代工业控制系统中,步进电机被广泛应用于各种场合,如数控机床、医疗设备、自动化生产线等。
而单片机作为一种集成电路,具有高度集成、体积小、功耗低等特点,成为控制步进电机的理想选择。
本文将介绍单片机步进电机控制程序代码的编写方法及其实现原理。
一、步进电机控制程序代码的编写方法步进电机的控制可以通过单片机来实现,而单片机控制步进电机的关键在于编写合适的控制程序代码。
下面将介绍一种常用的步进电机控制程序代码编写方法。
1. 确定引脚连接:首先,需要确定步进电机的引脚连接方式。
步进电机一般有两种连接方式,即单相连接和双相连接。
在单相连接方式中,步进电机只需两个控制引脚,而在双相连接方式中,步进电机需要四个控制引脚。
根据步进电机的具体型号和使用要求,选择合适的引脚连接方式。
2. 编写控制程序:根据步进电机的引脚连接方式,编写相应的控制程序。
以双相连接方式为例,步进电机的控制程序代码如下:```#include <reg52.h>sbit IN1 = P1^0; // 步进电机引脚1sbit IN2 = P1^1; // 步进电机引脚2sbit IN3 = P1^2; // 步进电机引脚3sbit IN4 = P1^3; // 步进电机引脚4void delay(unsigned int time){unsigned int i, j;for (i = time; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1){IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; // 步进电机正转 delay(1000);IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0;delay(1000);IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;delay(1000);IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1;delay(1000);}}```上述代码中,通过控制引脚的电平状态,实现步进电机的正转。
片机控制的步进电机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,0xf3,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”延时子程序,用循环语句延时。
基于单片机ULN2003的步进电机控制系统(汇编及C语言程序各一个)
图8 总体电路图1.3.4软件设计通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成4个部分的工作才能满足课题要求,即主程序部分、定时器中断部分、外部中断0和外部中断1部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测,若启动开关合上则系统开始工作,反之系统停止工作;定时器部分控制脉冲频率,它决定了步进电机转速的快慢;两个外部中断程序要做的工作都是为了完成改变速度这一功能。
下面分析主程序与定时器中断程序及外部中断程序。
(1)主程序设计主程序中要完成的工作主要有系统初始值的设置、系统状态的显示以及各种开关状态的检测判断等。
其中系统初始状态的设置内容较多,该系统中,需要初始化定时器、外部中断;对P1口送初值以决定脉冲分配方式,速度值存储区送初值决定步进电机的启动速度,对方向值存储区送初值决定步进电机旋转方向等内容。
若初始化P1=11H、速度和方向初始值均设为0,就意味着步进电机按四相单四拍运行,系统上电后在没有操作的情况下,步进电机不旋转,方向值显示“0”,速度值显示“0”,主程序流程图如图9所示。
(2)定时中断设计步进电机的转动主要是给电机各绕组按一定的时间间隔连续不断地按规律通入电流,步进电机才会旋转,时间间隔越短,速度就越快。
在这个系统中,这个时间间隔是用定时器重复中断一定次数产生的,即调节时间间隔就是调节定时器的中断次数,因而在定时器中断程序中,要做的工作主要是判断电机的运行方向、发下一个脉冲,以及保存当前的各种状态。
程序流程图如图10所示。
(3)外部中断设计外部中断所要完成的工作是根据按键次数,改变速度值存储区中的数据(该数据为定时器的中断次数),这样就改变了步进电机的输出脉冲频率,也就是改变了电机的转速。
速度增加按钮S2为INT0中断,其程序流程为原数据,当值等于7时,不改变原数值返回,小于7时,数据加1后返回;速度减少按钮S3,当原数据不为0,减1保存数据,原数据为0则保持不变。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ lcd_wcmd(pos | 0x80); //数据指针=80+地址变量}
/********************************************************/
/*
/* LCD1602初始显示子程序
/*
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/* /********************************************************/
bit snum_dr=1; //圈数标志
uchar code cdis1[ ] = {" STEPPING MOTOR "};
uchar code cdis2[ ] = {"CONTROL PROCESS"};
uchar code cdis3[ ] = {" STOP "};
uchar code cdis4[ ] = {"NUM: RATE: "};
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_EN = 0;
return(result);
}
/********************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/*
/* LCD初始化设定
/*
/********************************************************/
void lcd_init()
{
delay(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转相序表
/*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = Байду номын сангаасbit)(P0&0x80);
lcd_wdat(data_temP1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate; //显示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temP1);
lcd_pos(0x4e);
/*
/*数据显示子程序
/*
/********************************************************/
void data_dis()
{
data_temp = snum; //显示圈数
data_conv();
lcd_pos(0x44);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
/*
/*数据转换子程序
/*
/********************************************************/
void data_conv()
{
data_temP1=data_temp/10; //高位
if(data_temP1==0)
{
uchar i;
while(x--)
{
for (i=0; i<13; i++){ }
}
}
/********************************************************/
void beep()
{
uchar j;
for (j=0;j<100;j++)
delay(5);
}
/********************************************************/
/*
/* 设定显示位置
/*
/********************************************************/
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++){ }
}
}
/********************************************************/
void delayB(uchar x) //x*0.14ms
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 显示运行方向符号
/*
/********************************************************/
uchar code cdis5[ ] = {" RUNNING "};
uchar m,v=0,q=0;
uint number=0,number1=0;
uchar snum=10,snum1=10; //预设定圈数
uchar rate=2; //预设定速率
uchar data_temp,data_temP1,data_temp2;
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
/********************************************************/
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(170);
}
/********************************************************/
/*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
void motor_DR()
{
if(direction==1) //正转方向标志
{ for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
else
{ for(m=0;m<2;m++) //反转方向标志
m++;
}
delay(3000); //延时
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
{data_temP1=0x20;} //高位为0不显示