c语言实现单片机控制步进电机加减速源程序
- 格式:docx
- 大小:38.33 KB
- 文档页数:6
c语⾔电动机正转反转程序,步进电机正反转和加速减速c源程序这是⼀个群⾥朋友发给我的步进电机实现正转反转和加速减速的单⽚机c语⾔源程序,这⾥给⼤家共享下,有需要的朋友直接复制到keil⾥编译就可以了,程序已测试成功。
/*****************************************单4拍正转 zheng[]={0x01,0x08,0x04,0x02}单4拍反转 fang[]={0x01,0x02,0x04,0x08}双4拍正转 zheng[]={0x09,0x0c,0x06,0x03}双4拍反转 fang[]={0x03,0x06,0x0c,0x09}单双8拍正转 zheng[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03}单双8拍反转 fang[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}*****************************************/#include"reg51.h"#include"intrins.h"#define uchar unsigned char#define uint unsigned intbit front_move,back_move;uchar jzaj(void); //单4拍正转 zheng[]={0x01,0x08,0x04,0x02}; 单4拍反转 fang[]={0x01,0x02,0x04,0x08};void ajcl(uchar jz);void delay(uchar del);uchar code zheng[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};uchar code fang[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};void timer0() interrupt 1{static uchar jz;TH0=0xfc;TL0=0x18;jz=jzaj();if(jz)ajcl(jz);}//步进电机正反转和加速减速程序void main(){uchar count=0;TMOD=0x01;TH0=0xFC;TL0=0x18;TR0=1;ET0=1;EA=1;while(1){if(front_move){P2=zheng[count];delay(100);count++;if(count==8) count=0;}if(back_move){P2=fang[count];delay(100);count++;if(count==8) count=0;}}}uchar jzaj(void){uchar hz,lz;P1=0xf0; //置所有⾏为低电平,⾏扫描,列线输⼊(此时)if((P1&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 0000),有往下执⾏{delay(10); //延时去抖动(10ms)if((P1&0xf0)!=0xf0) //再次判断列中是否是⼲扰信号,不是则向下执⾏{hz=0xfe; //逐⾏扫描初值(即先扫描第1⾏)while((hz&0x10)!=0) //⾏扫描完成时(即4⾏已经全部扫描完成)sccode为1110 1111 停⽌while程序{P1=hz; //输出⾏扫描码if ((P1&hz)!=hz) //***(P2&0xf0)!=0xf0***也可这样 本⾏有键按下(即P1(真实的状态)的⾼四位不全为1){lz=(P1&0xf0)|0x0f; //列while((P1&0xf0)!=0xf0);return((~hz)|(~lz)); //返回⾏和列break; //有按键返回 提前退出循环}else //所扫描的⾏没有键按下,则扫描下⼀⾏,直到4⾏都扫描,此时sccode值为1110 1111 退出while程序hz=_crol_(hz,1);//⾏扫描码左移⼀位}}}elsereturn 0; //⽆键按下,返回0}void ajcl(uchar jz){if(jz==0x11){back_move=0;front_move=1;}if(jz==0x21){front_move=0;back_move=1;}if(jz==0x41){P2=0x00;front_move=0;back_move=0;}}void delay(uchar del) {uchar i;for(;del>0;del--)for(i=0;i<125;i++) {;}}。
基于单片机的步进电机控制系统设计前言步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。
控制系统通过单片机存储器、I/O接口、中断、键盘、LED 显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,急停等功能。
为实现单片机控制步进电机系统在数控机床上的应用,系统设计了两个外部中断,以实现步进电机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动,随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,自六十年代初期以来,步进电机的应用得到很大的提高。
人们用它来驱动时钟和其他采用指针的仪器,打印机、绘图仪,磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等机械装置。
此外作为执行元件,步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中,随着微电子和计算机技术的发展,它的需要量与日俱增,在各个国民经济领域都有应用。
步进电机是机电数字控制系统中常用的执行元件,由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用,大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。
1.步进电机原理及硬件和软件设计1.1步进电机原理及控制技术由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专业设备一步进电机控制驱动器,典型步进电机控制系统如图1所示:控制器可以发出脉冲频率从几赫兹到几千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列,环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输入端,以驱动步进电机的转动,环形分配器主要有两大类:一类是用计算机软件设计的方法实现环形分配器要求的功能,通常称软环形分配器。
基于单片机的步进电机控制系统设计前言步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。
控制系统通过单片机存储器、I/O接口、中断、键盘、LED 显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,急停等功能。
为实现单片机控制步进电机系统在数控机床上的应用,系统设计了两个外部中断,以实现步进电机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动,随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,自六十年代初期以来,步进电机的应用得到很大的提高。
人们用它来驱动时钟和其他采用指针的仪器,打印机、绘图仪,磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等机械装置。
此外作为执行元件,步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中,随着微电子和计算机技术的发展,它的需要量与日俱增,在各个国民经济领域都有应用。
步进电机是机电数字控制系统中常用的执行元件,由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用,大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。
1.步进电机原理及硬件和软件设计1.1步进电机原理及控制技术由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专业设备一步进电机控制驱动器,典型步进电机控制系统如图1所示:控制器可以发出脉冲频率从几赫兹到几千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列,环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输入端,以驱动步进电机的转动,环形分配器主要有两大类:一类是用计算机软件设计的方法实现环形分配器要求的功能,通常称软环形分配器。
#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define KeyPort P3sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;/*----------------1-2相励磁时序-----------------*/#define Coil_A1 {A1=0;B1=1;C1=1;D1=1;}//AC相导通#define Coil_B1 {A1=0;B1=0;C1=1;D1=1;}//AC、BC相导通#define Coil_C1 {A1=1;B1=0;C1=1;D1=1;}//BC相通电#define Coil_D1 {A1=1;B1=0;C1=0;D1=1;}//BC、~AC导通#define Coil_E1 {A1=1;B1=1;C1=0;D1=1;}//~AC导通#define Coil_F1 {A1=1;B1=1;C1=0;D1=0;}//~AC、~BC导通#define Coil_J1 {A1=1;B1=1;C1=1;D1=0;}//~BC导通#define Coil_H1 {A1=0;B1=1;C1=1;D1=0;}//~BC、AC相导通#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电void kongzhi(void);uchar rate=60;//速率uchar flat=0;void Timer0_isr(void);void Timer0_isr1(void);unsigned char KeyScan();void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--)//大致延时1mS{DelayUs2x(245);DelayUs2x(245);}}void delay(uint sp) //用于控制速度sp*1ms{uint i,j;for(i=sp;i>0;i--)for(j=100;j>0;j--);}/*------------加速、匀速、减速运行------------------------*/ void kongzhi(void){uint count;for(rate=84;rate>22;rate=rate-6) //加速{Timer0_isr();}for(count=130;count>0;count--) //匀速{Timer0_isr();}for(rate=22;rate<84;rate=rate+6) //减速{Timer0_isr();}}/*------------------------------------------------主函数------------------------------------------------*/main(){uchar num;Coil_OFF ;while(1){num=KeyScan(); //循环调用按键扫描if(num==5){flat=1;kongzhi();}if(num==6){flat=2;kongzhi();}else{Coil_OFF;}}}/*---------------正反转程序-----------------------------*/ void Timer0_isr(void){static unsigned char i=0;if(flat==1){switch(i){case 0:Coil_A1;delay(rate);i++;case 1:Coil_B1;delay(rate);i++;case 2:Coil_C1;delay(rate);i++;case 3:Coil_D1;delay(rate);i++;case 4:Coil_E1;delay(rate);i++;case 5:Coil_F1;delay(rate);i++;case 6:Coil_J1;delay(rate);i++;case 7:Coil_H1;delay(rate);i++;case 8:i=0;}}else if(flat==2){switch(i){case 0:Coil_H1;delay(rate);i++;case 1:Coil_J1;delay(rate);i++;case 2:Coil_F1;delay(rate);i++;case 3:Coil_E1;delay(rate);i++;case 4:Coil_D1;delay(rate);i++;case 5:Coil_C1;delay(rate);i++;case 6:Coil_B1;delay(rate);i++;case 7:Coil_A1;delay(rate);i++;case 8:i=0;}}}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char KeyScan(){unsigned char keyvalue;if(KeyPort!=0xff){DelayMs(10);if(KeyPort!=0xff){keyvalue=KeyPort;while(KeyPort!=0xff);switch(keyvalue){case 0xfe:return 1;break; ///???case 0xfd:return 2;break;case 0xfb:return 3;break;case 0xf7:return 4;break;case 0xef:return 5;break;case 0xdf:return 6;break;case 0xbf:return 7;break;case 0x7f:return 8;break;default:return 0;break;}}}return 0;}。
步进电机控制(单⽚机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 --; // 加速控制};。
C语言实现控制电机加减速正反转(飞思卡尔C代码)用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。
#include#define uchar unsigned char#define uint unsigned intsbit PW1=P2^0 ;sbit PW2=P2^1 ; //控制电机的两个输入sbit accelerate=P2^2 ; //调速按键sbit stop=P2^3 ; //停止按键sbit left=P2^4 ; //左转按键sbit right=P2^5 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值uchardflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}voidtime_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************// voidkeyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动end_turn;}if(left==0){TR0=1;dflag=1; //转向标志置位则左转}if(right==0){TR0=1;dflag=0; //转向标志复位则右转}if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60 }if(count==2){t0=15000;t1=35000; //占空比为百分之70 }if(count==3){t0=10000;t1=40000; //占空比为百分之80 }if(count==4){t0=5000;t1=45000; //占空比为百分之90}if(count==5){count=0;}}}}功能特点:1)总线速度高达40 M Hz,CAN总线:3个1Mbps的CAN总线,兼容CAN2.0 A/B;2)128 KB程序Flash和8 KB DataFlash,用于实现程序和数据存储,均带有错误校正码(E CC);3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μs的转换时间4)内嵌MS CAN模块用于CAN节点应用,内嵌支持LIN协议的增强型SIC模块和SPI模块;5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、实时中断;增强型捕捉定时器;6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。
#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;。
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”延时子程序,用循环语句延时。
步进电机调速控制系统设计C语言程序及说明使用元器件:单片机8051、步进电机17H185H-04A、128细分/3.0A步进电机驱动器、LED显示器。
实现控制功能:以8051单片机为控制器,系统设四个按键:“工作/停止按键"、“加速按键”、“减速按键”、“正反向控制按键”。
系统上电后,按下“正反向控制按键",控制电机正反转;每按一次“加速按键”后,步进电机由低向高加速一级,每按一次“减速按键”后,由高向低减速一级;按“工作/停止按键"后,电机停止转动,系统回到等待状态。
同时需要显示运行状态和转速(以实际转速或等级表示).程序清单及说明#include<reg52。
h>sbit EN=P2^0; //使能输出sbit DIR=P2^1; //方向控制sbit PWM=P2^2;//PWM输出sbit zled=P2^6;//正转信号灯sbit fled=P2^7;//反转信号灯sbit sw1=P0^0;//启停按钮sbit sw2=P0^1;//正反转按钮sbit sw3=P0^2;//加速按钮sbit sw4=P0^3;//减速按钮unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned char i,j,k,temp=0,zkb=5,zkb1=0,speed=0;void delay()//延时10ms{for(i=20;i>0;i--)for(j=248;j〉0;j--);}void InitTimer0(void) //T0定时器初始化{TMOD = 0x00; //设置定时器方式0TH0 = 0xef;//高8位送初值TL0 = 0xdd; //低8位送初值EA = 1; //开中断总允许ET0 = 1;//开T0中断允许TR0 = 1; //启动T0开始定时}void main() //主程序{InitTimer0();EN=1; //初始使能端输出0DIR=1;//方向端输出1zled=0;//正传信号灯端口输出0,灯亮fled=1;//反转信号灯输出1,灯不亮while(1){P1=table[speed];//启停if(sw1==0)//判断启停键按下{delay(); //调用延时程序if(sw1==0)//再判断,启停键按下{while(sw1==0);//启停键按下,使能端取反EN=~EN;}}//正反转子程序if(sw2==0) //判断换向键是否按下{delay();if(sw2==0){while(sw2==0);DIR=~DIR; //换向键按下,方向端口取反fled=~fled; //正传指示灯控制端取反zled=~zled;//反转传指示灯控制端取反}}//加速子程序if(sw3==0) //判断加速键是否按下{delay();if(sw3==0){while(sw3==0); //加速键按下if(speed>=5)//判断转速是否大于5 speed=5; //大于5,保持5级转速elsespeed++;//小于5,加速一级}}//减速子程序if(sw4==0) //判断减速键是否按下{delay();if(sw4==0){while(sw4==0);//减速键按下if(speed==1) //转速为1,保持1级转速speed=1;elsespeed—-; //转速不为1,减速1级}}}}void Timer0Interrupt(void) interrupt 1switch(speed)//加减速按键按下,对应选择T0初值,进入终端产生不同频率脉冲{case 1:TH0=0XDD;break;case 2:TH0=0XE1;break;case 3:TH0=0XE5;break;case 4:TH0=0XEa;break;case 5:TH0=0xf0;break;}TL0 = 0xdd;if(zkb1〉=10)zkb1=0;zkb1++;if(zkb1〈=5)PWM=1;elsePWM=0;}。
1./******************************************************************/2./**************************************************************** */3./*4./* 步进电机加减速运行程序5./* 步进电机启动时,转速由慢到快逐步加速。
6./* 步进电机匀速运行7./* 步进电机由快到慢逐步减速到停止8./*9./**************************************************************** **/10.11.#include <reg52.h>12.#include <string.h>13.14.#define uchar unsigned char15.#define uint unsigned int16.17.sbit addr0 = P1^4;18.sbit addr1 = P1^5;19.sbit addr2 = P1^6;20.sbit addr3 = P1^7;21.22.uchar code FFW[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};//正转数组23.uchar code REV[8]={0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x0e};//反转数组24.uchar rate ;25./********************************************************/26./*27./* 延时28./* 11.0592MHz时钟,29./*30./********************************************************/31.void delay()32. {33. uchar k;34. uint s;36.do37. {38.for(s = 0 ; s <100 ; s++) ;39. }while(--k);40. }41.42.43.void delay2(uchar k)44. {45.46. uchar s;47.for(s = 0 ; s <k ; s++) ;48.49. }50.51./********************************************************/52./*53./*步进电机正转54./*55./********************************************************/56.void motor_ffw()57.{58. uchar i;59.60.for (i=0; i<8; i++) //一个周期转30度61. {62. P0 = FFW[i];//取数据63. addr0 = 1;64. addr1 = 0;65. addr2 = 1;66. addr3 = 1;67. addr3 = 0;68. delay(); //调节转速69. }70.}71.72./********************************************************/73./*74./*步进电机反转75./*76./********************************************************/77.void motor_rev()78.{80.81.for (i=0; i<8; i++) //一个周期转30度82. {83. P0 = REV[i]; //取数据84. addr0 = 1;85. addr1 = 0;86. addr2 = 1;87. addr3 = 1;88. addr3 = 0;89. delay(); //调节转速90. }91.}92.93./********************************************************94.*95.*步进电机运行96.*97.*********************************************************/98.void motor_turn()99.{100. uchar x;101. rate=0x30;102. x=0xf0;103.do104. {105. motor_ffw(); //正转加速106. rate--;107. }while(rate!=0x0a); 108.109.do110. {111. motor_ffw(); //正转匀速112. x--;113. }while(x!=0x01); 114.115.do116. {117. motor_ffw(); //正转减速118. rate++;119. }while(rate!=0x30); 120.do121. {122. motor_rev(); //反转加速123. rate--;124. }while(rate!=0x0a); 125.126.do127. {128. motor_rev(); //反转匀速129. x--;130. }while(x!=0x01); 131.132.do133. {134. motor_rev(); //反转减速135. rate++;136. }while(rate!=0x30);137.}138.139./******************************************************** 140.* 141.* 主程序142.*143.*********************************************************/ 144.main()145.{146.147. P1=0xf0;148.149.while(1)150. {151. P0 = 0x00;//ULN2003输出高电平152. addr0 = 1; 153. addr1 = 0; 154. addr2 = 1; 155. addr3 = 1; 156. addr3 = 0; 157. delay2(255); 158.159. motor_turn(); 160.161. }162.}。
步进电机控制实验c语⾔程序,⽤AT89C51单⽚机控制步进电机的汇编源程序:单⽚机(2540)源程序(50)步进电机(282)汇编语⾔(64)下⾯程序完成的主要功能:实现的正反转,加速、减速;显⽰电机转速(转速级别)和⼯作状态(正转、反转、不转)。
源程序SPEED EQU 10H ;SPEED为转速等级标志,共7级,即1~7FX EQU 11H ;FX 为⽅向标志COUNT EQU 12H ;COUNT次数标志ORG 0000HAJMP MAINORG 0003H ;外部中断0⼊⼝地址,加速⼦程序AJMP UPORG 0013H ;外部中断1⼊⼝地址,减速⼦程序AJMP DOWNORG 000BH ;定时器0中断⼊⼝地址,控制中断次数来达到控制转速 AJMP ZDT0ORG 0030HMAIN: MOV SP,#60HMOV TMOD,#01H ;⼯作于定时、软件置位启动,模式1(16 位计时器)MOV TH0,#0CFHMOV TL0,#2CHMOV COUNT,#01HSETB ET0 ;定时/计数器允许中断CLR IT0 ;外部中断为电平触发⽅式,低电平有效CLR IT1SETB EX0 ;外部允许中断SETB EX1SETB EA ;开总中断MOV R1,#11H ;四相单四拍运⾏,共阳数码管⽅向显⽰8,速度值显⽰0MOV SPEED,#00HMOV FX,#00HXIANS: MOV A,SPEEDMOV DPTR,#LEDMOVC A,@A+DPTR ;查表获取等级对应数码管代码MOV P2,A ;第⼆个数码管显⽰转速等级MOV A,FX ;准备判断转向CJNE A,#11H,ELSMOV P0, #0F9H ;第⼀个数码管显⽰ 1,表⽰正转AJMP QDELS: CJNE A,#00H,ZHENGMOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转AJMP QDZHENG: MOV P0,#0BFH ;第⼀个数码管显⽰-,表⽰反转QD: JB P3.4,DD ;P3.4 接启动开关 K1,P3.4=1 时启动CLR TR0 ;停⽌定时/计数器MOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转MOV P2,#0C0H ;第⼆个数码管显⽰ 0,表⽰转速为 0 MOV SPEED,#00H ;重新赋初值MOV FX,#00HAJMP QDDD: MOV A,SPEEDJNZ GO ;A 不等于 0,即初始速度不为零,则转移到 GO CLR TR0 ;停⽌定时/计数器AJMP QDGO: SETB TR0 ;开启定时/计数器ACALL DELAYAJMP XIANSDELAY: MOV R6,#10 ;延时⼦程序DEL1: MOV R7,#250HERE1: DJNZ R7, HERE1DJNZ R6,DEL1RET。
51单片机控制步进电机硬件图#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;}。
自动门控制的步进电机正反转和加速减速C程序步进电机的正反转和加速减速是实现自动门控制的关键功能。
通过编写C程序,我们可以实现对步进电机的控制,使其按照设定的方向旋转,并可以进行加速和减速操作。
步进电机正反转步进电机的正反转是通过控制电机的相序来实现的。
下面是一个简单的C程序示例,用于控制步进电机的正反转:include <stdio.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int direction = 1; // 1表示正转,-1表示反转// 正转if (direction == 1) {for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}// 反转else if (direction == -1) {for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}return 0;}在以上示例代码中,我们通过设置`sequence`数组来表示电机的相序,其中`sequence[0]`表示第一相,`sequence[1]`表示第二相,以此类推。
通过循环遍历数组中的元素,并控制步进电机相序的输出,从而实现步进电机的正反转。
步进电机加速减速步进电机的加速减速是通过逐渐改变电机的驱动信号频率来实现的。
下面是一个简单的C程序示例,用于控制步进电机的加速减速:include <stdio.h>include <unistd.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int delay = 1000; // 初始延时时间,单位为毫秒int minDelay = 100; // 最小延时时间,单位为毫秒// 加速for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay > minDelay) {delay -= 100; // 减小延时时间,实现加速}}// 延时一段时间// 减速for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay < 1000) {delay += 100; // 增加延时时间,实现减速}}return 0;}在以上示例代码中,我们通过循环遍历数组中的元素,并控制步进电机相序的输出,并通过调用`usleep`函数来实现延时,从而控制步进电机的转速。
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”延时子程序,用循环语句延时。
C 语言实现单片机控制步进电机加减速源程序
1. 引言
在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。
而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。
本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。
2. 单片机控制步进电机的加减速原理
步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。
在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。
在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。
这一过程需要通过单片机的定时器和输出控制来实现。
3. C 语言实现步进电机加减速的源程序
在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。
在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。
以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:
```c
#include <reg52.h>
void main() {
// 初始化定时器
// 设置脉冲频率,控制步进电机的加减速过程
// 控制步进电机的方向
// 控制步进电机的启停
}
```
4. 总结与回顾
通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。
掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。
在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。
希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。
5. 个人观点与理解
在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。
在工程领域,步进电机作为一种精准控制角度的执行
元件,广泛应用于各种自动化设备中。
而单片机作为控制步进电机的核心控制器,学习和掌握 C 语言在单片机控制步进电机的编程技巧,能够帮助我们更好地理解和应用嵌入式系统开发技术,提高工程实践能力。
在编写本文时,我尽可能以从简到繁、由浅入深的方式来探讨单片机控制步进电机的加减速原理和 C 语言实现源程序的技术细节,希望能够为读者提供一份全面、深入和有价值的学习资料。
希望读者在阅读本文之后,能够对单片机控制步进电机的原理和 C 语言编程技巧有更深入的理解和运用。
通过对本文的撰写,我深刻体会到了单片机控制步进电机加减速的源程序不仅仅是一项技术,更是一种工程实践的综合能力。
在未来的学习和工作中,我将进一步学习和应用相关的嵌入式系统开发技术,不断提升自己的工程实践能力。
至此,本文就 C 语言实现单片机控制步进电机加减速源程序的相关内容进行了全面的阐述,希望能够为读者在这一领域的学习和应用提供一定的帮助。
C 语言实现单片机控制步进电机加减速源程序
6. 深入理解单片机控制步进电机原理
在单片机控制步进电机的原理中,我们需要更深入地了解步进电机的工作原理和单片机的控制方法。
步进电机是一种能够按照输入的脉冲
信号精确旋转一定角度的电机,其工作原理是通过控制脉冲信号来驱动电机内部的转子进行旋转。
而单片机作为控制步进电机的核心控制器,通常使用定时器模块来产生脉冲信号,通过控制输出引脚的电平来控制步进电机的旋转方向和启停状态。
在加减速控制过程中,需要考虑步进电机的电流、细分步数和最大速度等参数,以及不同的控制方式(如全步、半步、微步等)。
在编写C 语言源程序时,需要综合考虑这些参数,并通过对定时器的控制和输出引脚的控制来确保步进电机能够按照预期的速度和角度进行加减速旋转。
除了控制步进电机的基本参数外,还需要考虑到步进电机的加减速曲线控制,以实现平稳的加减速过程和准确的旋转角度。
在 C 语言编程中,可以使用加减速曲线的算法来计算出每个时间段内的脉冲频率,从而实现步进电机的加减速控制。
7. 设计 C 语言实现步进电机加减速的源程序
在设计 C 语言实现步进电机加减速的源程序时,需要考虑到以下几个关键步骤:
初始化定时器:使用单片机的定时器模块来生成脉冲信号,控制步进电机的旋转角度和速度。
设置脉冲频率:根据加减速曲线算法,计算出每个时间段内的脉冲频
率,设置给定的脉冲频率来控制步进电机的加减速过程。
控制步进电机的方向:根据控制需求,设置输出引脚的电平来控制步
进电机的旋转方向。
控制步进电机的启停:控制输出引脚的电平来启停步进电机的旋转。
除了以上基本的步骤外,还可以根据具体的控制要求和步进电机的型号,进一步设计更加复杂和精细的控制算法。
可以使用加速度传感器
来实时调整脉冲频率,使步进电机能够根据实际情况动态调整加减速
过程。
8. 优化 C 语言实现步进电机加减速的源程序
在实际项目中,为了提高步进电机控制的精准度和稳定性,我们还可
以对 C 语言实现步进电机加减速的源程序进行进一步优化。
在定时器
的中断服务程序中,可以使用优化的算法来实现更加精准的脉冲频率
控制;可以使用状态机的方法来优化步进电机的状态转移和控制流程;还可以根据具体的硬件评台,进行指令集的优化和性能调优。
通过不断地优化 C 语言实现步进电机加减速的源程序,我们可以使步
进电机控制更加精准、稳定和高效。
这将为实际的嵌入式系统应用提
供更好的支持和保障,为工程实践带来更大的便利和价值。
9. 结语
C 语言在单片机控制步进电机加减速的源程序中具有重要的作用,在
工程领域有着广泛的应用前景。
通过深入理解步进电机的工作原理和
单片机的控制方法,以及设计和优化 C 语言实现步进电机加减速的源
程序,我们可以更好地掌握嵌入式系统开发技术,提高工程实践能力,为工程领域的发展做出更大的贡献。
希望本文所介绍的内容能够为读者在单片机控制步进电机加减速源程
序方面的学习和应用提供一定的帮助,同时也希望读者能够在实际项
目中不断地学习和探索,不断提高自己的技术水平和创新能力,为工
程实践带来更多的价值和成果。