基于51单片机的步进电机调速系统(含完整代码)
基于51系列单片机控制步进电机调速闭环系统设计

摘要:步进电动机是一种将脉冲信号变换成相应的角位移(或线位移)的电磁装置,是一种特殊的电动机。
由于其精确性以及其良好的性能在实际当中得到了广泛的应用。
本文介绍了以51系列单片机AT89S52为控制核心所设计的步进电机(型号42BY G016)控制系统,从系统的硬件电路以及软件的设计方面实现了对步进电机的控制。
并且由传感器E E-EX672采集转速数据进而进行关于速度的闭环控制,经过实际应用电路证明,该仿真控制系统的随动性能好,抗干扰能力强,稳定性好。
关键词:单片机、步进电机、光电开关、PID算法、闭环控制一、步进电机1.1 步进电机的工作原理步进电机是将电脉冲信号转变为角位移或线位移的执行机构。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
1.2 步进电机的特点本实验所用的步进电机为感应子式步进电机(型号为42B YG016)。
感应子式步进电机与传统的反应式步进电机相比,结构上转子加有永磁体,以提供软磁材料的工作点,而定子激磁只需提供变化的磁场而不必提供磁材料工作点的耗能,因此该电机效率高,电流小,发热低。
因永磁体的存在,该电机具有较强的反电势,其自身阻尼作用比较好,使其在运转过程中比较平稳、噪音低、低频振动小。
感应子式步进电机某种程度上可以看作是低速同步电机。
一个四相电机可以作四相运行,也可以作二相运行。
(必须采用双极电压驱动),而反应式电机则不能如此。
例如:四相八拍运行(A-AB-B-BC-C-CD-D-DA-A)完全可以采用二相八拍运行方式.不难发现其条件为C=,D=. 一个二相电机的内部绕组与四相电机完全一致,小功率电机一般直接接为二相,而功率大一点的电机,为了方便使用,灵活改变电机的动态特点,往往将其外部接线为八根引线(四相),这样使用时,既可以作四相电机使用,可以作二相电机绕组串联或并联使用。
51单片机步进电机正反转调速1602显示

51单片机步进电机正反转调速1602显示51单片机步进电机正反转调速1602显示 - C51源代码#include //51芯片管脚定义头文件#include //内部包含延时函数 _nop_();#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbit K1 = P3^2; //运行与停止sbit K2 = P3^3; //设定圈数sbit K3 = P3^4; //方向转换sbit K4 = P3^5; //速率调整sbit BEEP = P3^6; //蜂鸣器sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;bit on_off=0; //运行与停止标志bit direction=1; //方向标志bit rate_dr=1; //速率标志bit snum_dr=1; //圈数标志uchar code cdis1[ ] = {" STEPPING MOTOR "};uchar code cdis2[ ] = {"CONTROL PROCESS"};uchar code cdis3[ ] = {" STOP "};uchar code cdis4[ ] = {"NUM: RATE: "};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;/********************************************************/ /*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms /*/********************************************************/ void delay(uint t){uchar k;while(t--){for(k=0; k<125; k++){ }}}/********************************************************/ void delayB(uchar x) //x*0.14MS{uchar i;while(x--){for (i=0; i<13; i++){ }}}/********************************************************/ void beep(){uchar j;for (j=0;j<100;j++){delayB(4);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器delay(170);}/********************************************************/ /* /*检查LCD忙状态/*lcd_busy为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引言目前,在工业控制生产以及仪器上应用十分广泛。
51控制步进电机并显示转速

dua=1;
P0=tabledua[shi];
dua=0;
delay (5);
wei=1;
P0=tablewei[1];
wei=0;
dua=1;
P0=tabledua[ge];
dua=0;
delay(5);
//TempData[0]=dofly_DuanMa[Speed/10];//分解显示信息,如要显示68,
unsigned char code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
sbit A1=P1^0; //定义步进电机连接端口
void Display(unsigned char FirstBit,unsigned char Num);
void init();
void delay(uint z)
{
uint x,y;
for(x=20;x>0;x--)
for(y=z;y>0;y--);
}
void main()
{
unsigned int i=512;//旋转一周时间
}
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。
所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图•注意:上图为共阳极接法,实际连接参考总体线路连接。
•驱动器信号端定义:PUL+:脉冲信号输入正。
( CP+ )PUL-:脉冲信号输入负。
( CP- )DIR+:电机正、反转控制正。
DIR-:电机正、反转控制负。
EN+:电机脱机控制正。
EN-:电机脱机控制负。
•电机绕组连接A+:连接电机绕组A+相。
A-:连接电机绕组A-相。
B+:连接电机绕组B+相。
B-:连接电机绕组B-相。
•电源连接VCC:电源正端“+”GND:电源负端“-”注意:DC直流范围:9-32V。
不可以超过此范围,否则会无法正常工作甚至损坏驱动器.•总体线路连接输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信号DIR+,DIR-③脱机信号EN+,EN-。
输入信号接口有两种接法,可根据需要采用共阳极接法或共阴极接法。
在这里我采用的是共阴极接法:分别将PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端);脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接入(不接也可,代码中未接,置空)。
按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。
注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路,以免损坏驱动器。
2、代码1.#include<reg51.h>2.#define MotorTabNum 53.unsigned char T0_NUM;4.sbit K1 = P3^5; // 启动5.sbit K2 = P3^4; // 反转6.sbit K3 = P3^3; // 加速7.sbit K4 = P3^2; // 减速8.sbit K5 = P3^1; //正反转9.10.sbit FX = P2^4; // 方向11.//sbit MotorEn = P2^5; // 使能12.sbit CLK = P2^6; // 脉冲13.14.inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};15.16.unsigned char g_MotorSt = 0; //17.unsigned char g_MotorDir = 0; //18.unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};19.20.signed char g_MotorNum = 0;21.22.void delayms(xms);23.void mDelay(unsigned int DelayTime);24.void T0_Init();25.26.void KeyScan(void);27.28.29.30.void main(void)31.{32.T0_Init();33.// MotorEn = 0; //34.FX = 0;35.while(1)36.{37.KeyScan(); //38.}39.40.41.}42.43.void T0_Init()44.{45.TMOD = 0x01;46.TH0 = (65535-100)/256; // 1ms47.TL0 = (65535-100)%256;48.EA = 1;49.ET0 = 1;50.// TR0 = 1;51.52.}53.54.void T0_time() interrupt 155.{56.// TR0 = 0;57.TH0 = (65535-100)/256;58.TL0 = (65535-100)%256;59.T0_NUM++;60.if(T0_NUM >= MotorTab[g_MotorNum]) //61.{62.T0_NUM = 0;63.CLK=CLK^0x01; //64.}65.// TR0 = 1;66.}67.68.69.//--------------------------70.void KeyScan(void)71.{72.if(K1 == 0)73.{74.delayms(10);75.if(K1 == 0)76.{77.g_MotorSt = g_MotorSt ^ 0x01;78.// MotorEn ^= 1;79.TR0 = 1;80.FX ^= 0; //反转81.}82.}83.84.if(K2 == 0)85.{86.delayms(10); //正转87.if(K2 == 0)88.{89.g_MotorDir = g_MotorDir ^ 0x01;90.FX ^= 1; //加速91.}92.}93.94.if(K3 == 0) //95.{96.delayms(5); //加速97.if(K3 == 0)98.{99.g_MotorNum++;100.if(g_MotorNum > MotorTabNum) 101.g_MotorNum = MotorTabNum; 102.}103.}105.if(K4 == 0) //106.{107.delayms(5); // 减速108.if(K4 == 0)109.{110.g_MotorNum--;111.if(g_MotorNum < 0)112.g_MotorNum = 0;113.}114.}115.116.if(K5 == 0) //117.{118.delayms(10); // 正反转119.if(K5 == 0)120.{121.g_MotorSt = g_MotorSt ^ 0x01; 122.g_MotorDir = g_MotorDir ^ 0x01; 123.MotorEn ^= 1;124.TR0 = 1;125.while(1)126.{127.FX ^= 1; //128.delayms(90000);129.FX ^= 0; //130.delayms(90000);131.}132.}133.}135.136.void delayms(xms)//延时137.{138.unsigned int x,y;139.for(x=xms;x>0;x--)140.for(y=110;y>0;y--);141.}3、常见问题解答•控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
51单片机电机三档调速程序

/*******************************************一键三档风扇程序 2022年8月28日******************************************/#include<reg52.h> //包含52单片机寄存器定义的头文件#include<intrins.h>unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表sbit ON_OFF=P3^2;//开关定义sbit motor=P3^5;//马达控制脚sbit dis=P3^4;int i=0;//档位标志void delay1ms(unsigned int i) //1ms延时程序{unsigned int j;for(;i>0;i--)for(j=0;j<125;j++){;}}/******************************************************************函数功能:延时约0.6ms********************************************************************/void delay(void){unsigned char j;for(j=0;j<200;j++);}void settinglow(){motor=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();motor=1;}/****************************************************************** 函数功能:显示计数次数的子程序入口参数:i********************************************************************/ void Display(unsigned char i){dis=0; //P3.4引脚输出低电平,数码管点亮P1=Tab[i%10]; //显示个位delay();dis=1;P1=0xff;delay();}/*******************************************函数功能:主函数******************************************/void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断i=0;motor=0;while(1){if(i>0){Display(i);}switch(i){case 0:motor=0;break;case 1:motor=1;break;case 2:settinglow();break;case 3:motor=~motor;break;}}}/************************************************************** 函数功能:外中断T0的中断服务程序**************************************************************/ void it0(void) interrupt 0 using 0 //外中断0的中断编号为0{if(ON_OFF==0){delay1ms(50);if(ON_OFF==0){i++;//按一次开关键,改变一个档位}}if(ON_OFF==0){delay1ms(1000);//长按1秒则关闭风扇if(ON_OFF==0){i=0;}}if(i==4)//最慢档后再按一次到最快档{i=1;}}。
基于单片机控制的步进电机调速系统的设计51单片机步进电机调速

基于单片机控制的步进电机调速系统的设计51单片机步进电机调速基于单片机控制的步进电机调速系统的设计|51单片机步进电机调速前言步进电机最早是在1920年由英国人所开发。
1950年后期晶体管的发明也逐渐应用在步进电机上,这对于数字化的控制变得更为容易。
以后经过不断改良,使得今日步进电机已广泛运用在需要高定位精度、高分解性能、高响应性、信赖性等灵活控制性高的机械系统中。
在生产过程中要求自动化、省人力、效率高的机器中。
步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
步进电机是将电脉冲信号变换成角位移或直线位移的执行部件。
步进电机可以直接用数字信号驱动,使用非常方便。
一般电动机都是连续转动的,而步进电动机则有定位和运转两种基本状态,当有脉冲输入时步进电动机一步一步地转动,每给它一个脉冲信号,它就转过一定的角度。
步进电动机的角位移量和输入脉冲的个数严格成正比,在时间上与输入脉冲同步,因此只要控制输入脉冲的数量、频率及电动机绕组通电的相序,便可获得所需的转角、转速及转动方向。
在没有脉冲输入时,在绕组电源的激励下气隙磁场能使转子保持原有位置处于定位状态。
因此非常适合于单片机控制。
步进电机还具有快速启动、精确步进和定位等特点,因而在数控机床,绘图仪,打印机以及光学仪器中得到广泛的应用。
步进电动机已成为除直流电动机和交流电动机以外的第三类电动机。
传统电动机作为机电能量转换装置,在人类的生产和生活进入电气化过程中起着关键的作用。
步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
第一章步进电机概述第一节步进电机的特点一般步进电机的特点有以下三个特点:1)一般步进电机的精度为步进角的3-5%,且不累积。
2)步进电机的力矩会随转速的升高而下降。
当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。
51单片机PWM电机调速程序

51单片机PWM电机调速程序#include#define TH0_TL0 (65536-1000)//设定中断的间隔时长unsigned char count0 = 50;//高电平的占空比unsigned char count1 = 0;//比较用的临时变量bit Flag = 1;//电机正反转标志位,1正转,0反转sbit Key_add=P2 ^ 0; //电机减速sbit Key_dec=P2 ^ 1; //电机加速sbit Key_turn=P2 ^ 2; //电机换向sbit PWM1=P2^6;//PWM 通道 1,反转脉冲sbit PWM2=P2^7;//PWM 通道 2,正转脉冲unsigned char Time_delay;void Delay(unsigned char x);void Motor_speed_high(void);void Motor_speed_low(void);void Motor_turn(void);void Timer0_init(void);void Delay(unsigned char x){Time_delay = x;while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔}void Motor_speed_high(void)//{if(Key_add==0){Delay(10);if(Key_add==0){count0 += 5;if(count0 >= 100){count0 = 100;}}while(!Key_add);//等待键松开}}void Motor_speed_low(void){if(Key_dec==0){Delay(10);if(Key_dec==0){count0 -= 5;if(count0 <= 0){count0 = 0;}}while(!Key_dec );}}void Motor_turn(void) {if(Key_turn == 0) {Delay(10);if(Key_turn == 0) {Flag = ~Flag;}while(!Key_turn);}}void Timer0_init(void) {TMOD=0x01; //定时器0工作于方式1 TH0=TH0_TL0/256;TL0=TH0_TL0%6;TR0=1;ET0=1;EA=1;}void main(void){Timer0_init();while(1){Motor_turn();Motor_speed_high();Motor_speed_low();}}void Timer0_int(void) interrupt 1 using 1 {TR0 = 0;//设置定时器初值期间,关闭定时器TL0 = TH0_TL0 % 256;TH0 = TH0_TL0 / 256 ;//定时器装初值TR0 = 1;if(Time_delay != 0)//延时函数用Time_delay--;}if(Flag == 1)//电机正转{PWM1 = 0;if(++count1 < count0) {PWM2 = 1;}elsePWM2 = 0;if(count1 >= 100) {count1=0;}}else //电机反转{PWM2 = 0;if(++count1 < count0) {PWM1 = 1;}elsePWM1 = 0;if(count1 >= 100){count1=0;}}}这个程序是我转来的下载在硬件上是能通过的。
基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。
这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。
基于51单片机的步进电机控制系统设计

基于51单片机的步进机电控制系统设计之阿布丰王创作中文摘要.由于步进机电具有步距误差不积累、运行可靠、结构简单、惯性小、本钱高等优点,因此,被广泛使用于计算机外围电路、自动化控制装置以及其他的数字控制装置中,如打印机、钟表、数模转换设备等装置中.随着科学技术的快速发展,相应的控制系统也发生了很多种类,步进机电的身影在众多领域中可以看到.其中采纳单片机作为控制核心的控制系统,由于其电路简单、本钱低、可靠性强等优点,满足众多领域的需求,获得了年夜量的运用.因此,研究基于单片机的步进机电控制系统本设计研究的是基于51通过单片机的I/O端口输出时序方波作为控制信号,信号经过芯片ULN2003驱动芯片驱动步进机电进行分歧的指令进行工作.根据分歧的需要,通过按键电路来控制步进机电的启停、正反转和加减速等功能,并在数码管上实时显示步进机电的工作状态.本文给出了电路各个模块的电路图,并用Proteus的ISIS软件对控制系统的各个功能进行了仿真,并给出了相应的仿真结果图像.关键词:单片机;步进机电;机电驱动;控制系统AbstractStepper motor controlled by a pulse signal, and a pulse signal can be converted to the corresponding angular displacement or linear displacement of the digital motor. As the stepper motor has a step error does not accumulate, reliable, simple structure, small inertia, low cost, and therefore, are widely used in computer peripheral circuits, automatic control devices and other digital control devices, such as printers, watches and clocks , digital to analog conversion equipment, and other devices. With the rapid development of science and technology, the corresponding control system also produced many types of stepper motor figure can be seen in many areas. Which uses microcontroller as the control of the control system, because of its simple circuit, low cost, high reliability, etc., to meet the needs of many fields, we get a lot of use. Therefore, based on single-chip stepper motor control system has important practical significance.The design study is 51 single-chip stepper motor control system. As a control signal, the signal through the chip ULN2003 stepper motor drive to work through the microcontroller I / O port output timing square wave. Depending on the need, through the key circuit to control the start and stop, reversing and ramp functions such as stepper motors, stepper motors in real-time display and digital working condition. In this paper, the circuit diagram of each module, and with the ISIS Proteus software for each functioncontrol system simulation, and the simulation resultsare given corresponding image.Key words: microcontroller; stepper motor; motor drive; control system目录中文摘要IAbstract II1 绪论11.1 步进机电及其发展过程 (1)1.2 步进机电在我国的应用及前景 (2)1.3 本设计的研究内容 (3)1.4 步进机电的性能指标及工作原理 (3)1.4.1 步进机电的特点 (4)1.4.2 步进机电的种类 (4)1.4.3 步进机电的主要性能指标 (5)1.4.4 步进机电的工作原理 (6)1.5 步进机电控制系统的原理 (8)2 总体方案设计92.1 设计思路的选择 (9)2.2 单片机芯片的选择 (11)2.3 驱念头电芯片的选择 (12)2.4 显示电路的选择 (13)2.5 步进机电的选择 (13)3 控制系统的硬件电路设计143.1 键盘控制电路 (14)3.2 单片机最小系统电路 (15)3.3 数码管显示电路 (17)3.4 步进机电的驱动电路 (19)3.5 步进机电的其他电路 (21)4 控制系统的软件设计224.1 主法式流程图 (22)4.2 读按键子法式流程图 (23)4.3 按键处置子法式流程图 (24)4.4 机电控制中断法式流程图 (25)5 仿真与测试265.1 仿真软件介绍 (26)5.2仿真的把持步伐 (27)5.3 电路板的焊接285.4 电路板的测试 (29)6 结论与展望30致谢32参考文献32附录:系统总体电路图 (34)系统仿真原理图 (35)PCB打印图 (36)原件清单 (36)程序 (37)1 绪论1.1步进机电及其发展过程.由于电源每次输入电脉冲给该机电,该机电就会前进一小步,转动的方式是步进式的,所以称为步进电念头.由于电源输入的是脉冲式的电压,因此,有时也被称为脉冲电念头.在步进机电驱动能力范围内,其输出的角位移或线位移与输入的脉冲个数成正比,不因电源电压、负载变动和环境条件等的变动而变动.所以其输出的角速度或线速度也与输入的脉冲频率成正比,通过改变输入脉冲频率的高高攀可以调节步进机电的转速,并能控制步进机电的快速启动,暂停,正反转和加减速等.由于步进机电具有步距误差不积累、运行可靠、结构简单、惯性小、本钱高等优点,因此,被广泛使用于计算机外围电路、自动化控制装置以及其他的数字控制装置中,如打印机、钟表、数模转换设备等装置中.虽然步进机电近些年来才被广泛使用,但其工作原理很早就被人们研究出来.其中,最早的可以追溯到法国人佛罗曼提出了将电磁铁的吸引力转化为力矩的方法.那时,激磁相的切换是采纳机械式凸轮的接触点来完成,这就是步进机电最初的原理模型.后来逐步发展还呈现了旋转线圈式的应用方法.二十世纪三十年代以后,步进机电的应用才逐渐开始,称为,随着晶体管元件的快速发展,与之相结合使用的步进机电也获得了快速的发展和广泛的使用.1950年研制出二极管半导体,1964年开发出MOS 半导体,特别是经过1950—1965年间半导体资料的高速发展后,由于价格昂贵、可靠性高的逻辑数字电路获得广泛的应用,使步进机电的使用量也急剧增加.多年来,随着电力电子技术、自动化控制技术以及计算机技术的快速发展,步进机电系统尤其是其中的驱动电路部份的不竭发展,使其在单片机控制,数控机床、绘图仪、打印机以及光学仪器中都获得了广泛的应用.现如今,继直流电念头和交流电念头这两年夜类机电被广泛应用后,步进机电也已成为生活中最经常使用的第三类电动机.国内外围绕着步进机电系统的研究做了年夜量的工作以及相应的开发工作.图1-1 步进机电1.2 步进机电在我国的应用及前景我国对步进机电的研究及制造起始于20世纪50年代.那时,主要是一些高等院校和科研机构使用或开发与步进机电相关的产物.进入70年代,我国各地,例如北京、南京、江浙一带都有年夜量的生产和使用,其中的驱动电路的半导体器件,已实现完全国产化.进入改革开放时代后,随着国外各种步进机电的先进技术进入国内,我国对其进行了年夜量的研究,并开发出了多种混合式的步进机电以及相应的驱动元件,同时,也被年夜量的应用于各种领域中.发展至现今,我国在这方面的理论研究比力成熟,逐渐形成了比力完善的基础理论和设计方法,产物种类也逐渐多样化,性能和参数也逐渐到达甚至有些已经超越国外同类产物的水平.而国外的年夜功率驱开工业设备上,只有少数要求较高的设备中才会使用空心转杯机电、交流机电;目前,年夜大都场所不使用年夜扭矩的步进机电,而是采纳直流电念头.其原因是从驱动电路的本钱、效率、系统惯量与最年夜扭矩比等指标进行比力,采纳直流电念头更为合适.除此之外,还有一些小功率的工业设备中也获得了广泛的应用,例如,工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机以及年夜型望远镜等等.经过多年的发展,步进机电的应用越来越广泛,功能更加强年夜,种类也很繁多,相应的产物也日趋完善.步进机电以它显著的优点在工业生产和自动化控制中占据着不成摆荡的位置.相信在不久的未来,陪伴着科学技术的快速发展,步进机电将会在更多的领域获得广泛的应用.1.3 本设计的研究内容本设计研究的是基于51单片机的步进机电控制系统.采纳单片机STC89C51作为控制核心,通过四个按键控制步进机电的运行状态,即控制启停、转向、加减速等,并利用四位的数码管显示步进机电的转向和速度品级.本产物主要实现的功能:(1)5个按键控制整个电路,对应功能分别是:启动/暂停、正/反转、加速、减速、复位;(2)数码管显示正/反转的指示和机电转动速度的品级;(3)5个LED灯,一个为电源工作指示灯,其余四个则指示机电的转速品级.本设计的控制核心是利用软件控制单片机输出分歧的脉冲信号,从而驱动步进机电进行相应的举措,显示分歧的运行结果,同时,为了使步进机电的运行状态显示的更为直观,利用数码管显示电路实时的显示出来.1.4 步进机电的性能指标及工作原理本设计是以STC89C51单片机作为控制单位,集成芯片ULN2003作为机电的驱动芯片,DC-5V步进机电作为控制对象.本设计通过五个按键的控制,改变输入脉冲的频率和个数来调节步进机电的正反转、加速、减速、暂停和复位功能;LED数码管的第一、二位显示速度品级,而第四位则显示步进机电的转动方向;5个发光二极管,一个为电源指示灯,其余四个则指示机电的转速.1.4.1 步进机电的特点从应用的角度来说,对步进机电的基本要求如下:(1)步进机电能够在一系列脉冲信号的控制下,快速、平滑、稳定的实现启动、暂停、正/反转,加/减速等运行方式;(2)为了提高精度,要求脉冲对应的位移量小,并要准确、均匀.这就要求步进机电步距小、步距精度高,不能存在失步的现象.要求步进机电输出转矩年夜,可以直接带动负载工作(3)响应要快速.即要求步进机电不单启动、暂停、反转的举措要快速,并能连续高速的运转工作以提高劳动的生产效率.(41.4.2 步进机电的种类经常使用的步进机电有三种:(1)永磁式步进机电永磁式步进机电内部主要由定子和转子两部份组成,组成的形式也可以为两种,即转子采纳永久磁铁,定子采纳线圈;或者反之,也可以.其工作原理是通电的定子线圈发生的磁场和转子永久磁铁发生的磁场,通过吸引或排斥的相互作用,发生转动力矩,使其进行转开工作.该机电的特点是励磁功率小、效率高、造价廉价,启动频率和运行频率较低,永磁需要量也年夜.缺点是由于永久磁铁之间的磁化间距方便于丈量、控制,受到影响的因素较多,故为了坚持良好的效果,步距角通常会设置的较年夜.(2)反应式步进机电反应式步进机电,通常也被称为可变磁阻型步进机电,其转子磁路是由软磁资料制成的铁芯,而定子则由励磁绕组线圈环绕纠缠着铁芯构成的;其工作原理是磁性转子铁芯通过定子发生的脉冲磁场而形成的吸引或排斥的相互作用,发生转矩,使其进行转开工作..这类机电的转子结构简单、转子直径小,有利于高速响应.这种机电具有效率低、启动和运行频率较高、转子的阻尼差、噪声年夜等缺点.优点是制造资料费用低、结构简单、步距角小.(3)混合式步进机电由于该机电的转子导磁体上嵌有永久磁铁,可以说是永磁型和可变磁阻型相结合的一种形式.故称为混合型步进机电.混合式步进机电分为两相、三相和五相等.由于其内部结构组成的特点,使其同时具备了永磁式和反应式的各自的优点,具有输出转矩年夜,响应速度快,效率高,振动噪声小等优点.1.4.3 步进机电的主要性能指标(1)步距角控制系统输入一个电脉冲信号时,转子所旋转过的机械角度称为步距角.即:当定子绕组完成一次通电周期时,转子绕组由于受到磁场变动的作用,发生磁矩,旋转相应的机械角度.步距角的年夜小会影响到步进机电的运行频率和启动.,步距角越小,加工精度就越高.(2)最年夜静转矩为最年夜静转矩.它暗示了步进机电所能接受负载的能力.一般情况下,流入步进机电绕组的电流越年夜,最年夜静转矩也就越年夜,也就可以带动更年夜的负载转矩,此时的运行的快速性及稳定性就越好.(3)静态步距角误差静态步距角误差,由名称可知,是指步距角的理论值域实际值之间的误差,由于误差较小,通常在分的级别,一般不会超越10分的精度范围.该误差值主要是有电磁转矩的不均匀等其他因素造成的,这种误差在实际生活中不成防止,通常只有进一步提高机械齿轮的制造精度,使误差值尽可能的减小.步距角误差直接影响工作的加工精度以及步进机电的静态特性.通常在空载情况下进行测定,静态步距角误差越小,暗示步进机电的精度越高. (4)启动频率和启动频率特性启动频率是指步进机电在不带任何负载的情况下,由静止状态直接进行启动,而且能够稳定的、不失步的进入正常运行状态,所需要的脉冲频率的最年夜值.它也是衡量步进机电响应速度快慢的一个重要的参数.高于步进机电启动频率与负载惯量有关,一般来说随着负载惯量的增长而下降.产物介绍上往往会给出空载时的启动频率.然而实际使用中,年夜大都步进机电都是在带有负载的情况下启动,因此,所以产物介绍通常会以表格或曲线的形式给出启动的矩频特性,即启动频率特性,以便确定负载启动频率.(5)运行频率和运行矩频特性运行频率是指步进机电在启动后,稳定运行的过程中,连续上升脉冲信号的频率时运行频率是衡量步进机电定子绕组通电变动频率快慢的一个重要参数运行频率随负载的性质和年夜小而异,与驱动电源也有很年夜关系.运行矩频特性通常会在产物介绍中以表格或曲线的形式给出.当步进机电载运行时1.4.4 步进机电的工作原理步进机电控制的最年夜特点是开环控制,不需要反馈信号.因为步进机电的运动不发生旋转量的误差积累.四相机电运行时,可以是四相中每次只有一相绕组通电来工作,也可以是两相同时通电,或者是单相和两相交替通电.前一种驱动方式称为四相单四拍,后两者分别为四相双四拍和四相八拍.这里所谓的“四相”是指步进机电具有四相定子绕组;“单”是指每次只有一相绕组通电;“四拍”是指四次换接为一个循环,第五次换接重复第一次的情况.(1)四相单四拍.机电的通电顺序为A-B-C-D-A-B...,如表1-1所示;(2)四相双四拍.机电的通电顺序为AB-BC-CD-DA-AB-BC...,如表1-2所示;(3)四相八拍.机电的通电顺序为A-AB-B-BC-C-CD-D-DA-A-AB...,如表1-3所示;表1-1 四相单四拍表1-2 四相双四拍表1-3 四相八拍5 0 0 1 0 C6 0 0 1 1 CD7 0 0 0 1 D8 1 0 0 1 DA本次设计中使用的是28BYJ-48步进机电,该机电属于四相八拍机电,因此,该步进机电的输入脉冲信号也应该是四相八拍的工作方式.使用单片机的按时器0,把工作方式设置为1,单片机的每一次中断城市给步进机电的绕组输入一个脉冲电压,步进机电随即将脉冲信号转化为线位移或角位移,转动一个角度.1.5 步进机电控制系统的原理传统的步进机电控制系统是电子电路组成的,主要由脉冲发生器、环形脉冲分配器、功率放年夜器以及步进机电组成,结构图如图1-4所示:图1-4 传统的步进机电控制系统脉冲发生器的作用是发生一连串(一系列)连续的脉冲信号的电子器件,脉冲信号的频率范围较宽,可以是低频的是20赫兹至10兆赫兹,也可以是高频的100千赫兹至300兆赫兹等等.环形脉冲分配器的作用是将输入的连续脉冲信号,依照一定的规律顺序,分别分配给驱动元件的各个端口.在这个过程中,环形脉冲分配器依照一定的顺序接通、断开,使机电绕组的通电按输入脉冲的控制而循环变动.由于环形脉冲分配器输出的脉冲信号电流很小,往往只有几微安,所以要想驱动步进机电进行工作就需要添加功率放年夜器,将功率就行放年夜.采纳以往的电子电路的控制方式,由于其电路组成复杂,本钱较高,因而限制了它的应用,不能年夜范围的应用.可是,若采纳基于单片机的控制系统,由软件取代脉冲发生器和环形分配器的作用,不单年夜年夜简化了电路的组成,也降低了本钱,稳定性和可靠性也年夜年夜提高.另外,可以根据系统的需要,灵活的改变步进机电的控制设计方案,使其性能不在单一,使用很方便.经常使用的基于单片机控制步进机电系统原理图,如图1-5所示:图1-5 基于单片机的控制系统将图2与图1相比,主要区别在与用单片机取代了脉冲发生器和环形分配器的作用.因单片机的主要作用就是并行的二进制码转换为串行脉冲序列,并实此把反向控制.每当步进机电脉冲输入线上获得一个脉冲,它使沿着方向控制线信号所确定的方向行进.步进机电在正常的工作状态下,对步进机电每输入一个脉冲信号,步进机电就会转动相应的步距角,且该步距角是成比例通过资料可以计算出步,若能的,且角度值是固定的进电机的步距角大小已知其行进的步数和行进前的初始位便可以计算出电机最终.置,的停止位置2 总体方案设计2.1设计思路的选择对步进机电控制的研究,国内外近些年呈现了多种控制方式,其中最罕见的控制方式为以下三种:(1)基于电子电路的控制方式:步进机电能直接接收数字信号的特点,所以被广泛应用于数字控制系统中.其中较经常使用的控制电路是采纳硬件电路的方式,即利用数字逻辑单位组成的电子电路.此种控制方式的特点是电路结构简单,可靠性强,性能稳定,可以实现一般的基本任务要求.缺点是功能性比力单一,电路的功能不能更改.若要改变控制系统的功能,一般需要重新设计硬件电路,灵活性较差.(2)基于单片机的控制方式:采纳基于单片机的步进机电控制方式,实现了软、硬件相结合的控制方法.为了能够更加准确、精准的控制步进机电,最好的控制方式是利用软件将脉冲信号有规律的输出到步进机电的驱动元件上,从而,取代了环形脉冲分配器的功能.由于单片机的强年夜功能,还可以扩张年夜量的外围电路,键盘作为一个外围中断源,可控制步进机电实现启停、正反转、加减速等功能,也可以利用数码管作为显示电路,来显示步进机电的工作状态.此种控制方式的特点是系统的灵活性好,可靠性强,增加了控制系统的功能多样性.缺点是系统硬件设计相对复杂,电路设计工作量相对较年夜.(3)基于PLC的控制方式:PLC的控制方式是在工业领域中,以计算机控制技术相结合发展起来的控制技术.通过.而环形脉冲分配器可以分为软件和硬件两种.采纳软件环形分配器时,占用PLC资源较多,电路结构简单;而采纳硬件环形分配器时,电路结构复杂,PLC资源占用较少,但增加本钱.此种控制方式的特点是抗干扰能力强,可靠性高,编程简单,性价比高,装置简便,维修方便等.缺点是不能在高频率下对步进机电进行控制,且控制精度小.通过对以上三种方案的比力,可以发现:基于电子电路的控制方式灵活性不高;基于PLC的控制方式不能在高频率下进行,控制精度小;而随着科学技术的快速发展,人们对控制功能的要求也越来越高,使得单片机的优点更加的直白的显现出来,因此,单片机与控制电路的结合是日后发展的主流方向.结合本设计的设计本钱等因素的考量,故本设计采纳基于单片机的控制方式.本方案有以下优点:(1通过改变单片机的输入法式使步进(2也使控制方式实现了和,可以有效的(3)由于单片机的扩展性较强,使其功能日趋完善,功能也逐渐多样化,设计本钱较低,(4)由于单片机拥有很多的外围电路,且现存的子法式日趋完善,在使用时,直接调用,年夜年夜减少了工作量,也提高了系统的交互性.硬件部份主要是以本设计选用的步进机电是通过软、硬件的结合,,.本设计是由块、块、模块以及模块.其中、本设计的系统框图如图2-1所示:图2-1 总体设计框图2.2单片机芯片的选择方案一:采纳凌阳单片机.凌阳单片机是一款控制处置数据以及数字信号处置的设备.该单片机具有多种分歧的产物类型,可以满足分歧的电路场所的需求.它具有集成度高、数/模混合、功能全、低功耗、低电压和易于扩展等特点,而且能用电池供电,具有较强的中断处置能力.另外,它还增加了适合于DSP的某些特殊指令,有些系列的单片机还嵌入了LCD控制/驱动和双音多频发生器功能,而且支持语音提示功能.缺点是价格较贵,晦气于提高产物的性价比.方案二:采纳51系列的单片机.51单片机是现在应用最为广泛的单片机..同时,它的价格昂贵,有利于提高性价比.缺点是数据处置较弱.现实生活中,为了使电路更稳定的工作,有时单片机芯片需要具有一定的抗干扰能力以及一定范围的工作环境温度等等特殊的要求.按适用的工作温度分,单片机芯片可分为商用级、工业级、军用级三个品级,这里选择一般的商用机即可.按抗干扰能力方面的要求,由于本次设计的功能有限,一般的单片机均能满足该要求,因此,抗干扰方面不需要特别考虑.若从易学掌握的角度动身,要求所选单片机要支持简单易学的编程语言,而且拥有易于学习的编程软件.另外,本设计选用的单片机最好具有丰富的相关学习资料,便于查找学习,使其具有更高的通用性.若从该角度动身,51系列的单片机具有一定的优势.综上所述,通过从各方面的综合考虑,本系统选择方案二51单片机作为主控芯片.在经常使用的51单片机中,STC89C51系列的单片机是宏晶科技推出的新一代超强抗干扰、高速低功耗的单片机,它的功能已完全能够实现本设计的要求,且价格廉价,下载法式方便.2.3驱念头电芯片的选择方案一:使用驱动芯片ULN2003.ULN2003芯片可以直接处置数字信号,例如经过数字逻辑电子电路发生的脉冲信号.该芯片的内部结构由组成的,而且通常被广泛应用于单片机、PLC、仪表电器等控制驱动电路中..方案二:使用驱动芯片L298.L298N芯片属于H桥集成电路.驱动芯片L298可以直接和单片机进行连接,接收单片机的数字脉冲信号.由于其输出电流年夜、功率年夜的特点,可以直接驱念头电进行工作.而当驱动芯片L298直接驱动步进机电工作时,只需要改变脉冲信号的逻辑电平值,就可以实现对步进机电工作状态的控制.该芯片具有体积小,控制方便等优点,缺点是使用该芯片时需要添加光电耦合器件,进行光电隔离,消除机电对单片机发生的干扰,从而使系统稳定可靠地工作.综上所述,通过从各方面的综合考虑,本系统选择方案一ULN2003作为本设计的驱动芯片.2.4显示电路的选择方案一:采纳LCD液晶显示器.LCD,幕内容功能,具、.缺点是对单片机的接口要求高,一般多采纳并行接口,占用资源多,同时也需要专门的驱动电路,且器件价格昂贵.方案二:采纳LED数码管.LED数码管的显示模块的数码管单片机输出的脉冲序列经过上拉电阻驱动数码管显示.采纳数码管静态显示方式,具有亮度高、响应速度快、防潮防湿性能好、使用寿命长、硬件电路简单、编程简便、显示信息清晰、价格昂贵等优点,但占用单片机I/O端口较多.综上所述,通过从使用的实用性和价格等各方面的综合考虑,本系统选择方案二LED数码管作为本设计的显示模块.2.5步进机电的选择由于本次设计的供电电源是5V的直流电源,STC89C51单片机的VCC电。
基于c51单片机设计的 HMI人机界面步进电机调速系统 (分模块写的)2

if(D[Index]> 9999) D[Index] = 0; } }//if else C_Dec = 0;
/****************************************************************************** ****/
unsigned char xdata X[] = {0,28,94,28,94,28,94,28,94}; //寄存器 X 坐标 unsigned char xdata Y[] = {0,24,24,60,60,96,96,132,132}; //寄存器 Y 坐标 /*********************************************************** purpose: 系统初始化 /**********************************************************/ void system_Ini() {
{
handle_ASCII(Index);
switch(index)
{
case 1:
Focus_Flash(X[1],Y[1]);
break;
case 2: Focus_Flash(X[2],Y[2]); break;
case 3: Focus_Flash(X[3],Y[3]); break;
case 4: Focus_Flash(X[4],Y[4]); break;
*
*
* * 功 能 :1. 可 以 设 定 转 速 和 圈 数
步进电机控制程序(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单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。
核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。
驱动板上有电源电路、电机驱动电路以及一些功能模块接口。
智能小车前进只要控制智能小车四个轮子向前转动就可以了。
智能小车四个轮子由四个直流减速电机驱动。
直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。
但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。
比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。
那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。
智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。
在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。
不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。
这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。
这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。
智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。
unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。
unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。
通过以下函数初始化定时器0,每1毫秒中断一次。
void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。
基于51单片机三相步进电机调速系统

基于51单片机三相步进电机调速系统学校:南京理工大学专业:机电一体化技术姓名:***班级:电气123学号:*********摘要步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速,停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累计误差等特点,使得它在位置,速度等控制领域显得非常简单。
步进电机的调速一般是改变输入步进电机的脉冲频率来实现调速的,步进电机每给一个脉冲就转动一个固定角度,这样就可以通过控制步进电机的脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变转速,从而实现调速功能。
一. 步进电机1.1步进电机的工作原理本论文我们采用的电机是三相步进电机,其主要应用于完成调速功能。
步进电机是一种用电脉冲进行控制,将电脉冲信号转换成相位移的电机,其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可以使步进电机旋转一个固定角度,脉冲的数量决定了旋转的总角度,脉冲的频率决定了电机运转的速度,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,他的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率来控制电动机的速度和加速度,从而达到调速的目的。
1.2 步进电机的特点1·一般步进电机的精度为步进角的百分之三到百分之五;2·步进电机外表允许的温度高,电机外表允许的最高温度应取决于不同的电机磁性材料的退磁点,一般的磁性材料的退磁点都在摄氏130度以上,所以步进电机的外表温度在摄氏80度到90度下完全正常。
3·步进电机的力矩会随转速的升高而下降。
二单片机的选择本次设计以AT89C51作为步进电机的控制芯片。
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;}。
基于51系列单片机控制步进电机调速实验

基于51系列单片机控制步进电机调速实验实验目的及要求:1、熟悉步进电机的工作原理2、熟悉51系列单片机的工作原理及调试方法3、设计基于51系列单片机控制的步进电机调速原理图(要求实现电机的速度反馈测量,测量方式:数字测量)4、实现51系列单片机对步进电机的速度控制(步进电机由实验中心提供,具体型号42BYG )由按钮控制步进电机的启动与停止;实现加速、匀速、和减速控制。
速度设定由键盘设定,步进电机的反馈速度由LED数码管显示。
实验原理:步进电机控制原理一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机。
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。
步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。
由于输入的是脉冲信号,输出的角位移是断续的,所以又称为脉冲电动机。
随着数字控制系统的发展,步进电动机的应用将逐渐扩大。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号可以由单片机产生。
电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转子齿轴线错开。
0、1/3て、2/3て,(相邻两转子齿轴线间的距离为齿距以て表示),即A与齿1相对齐,B与齿2向右错开1/3て,C与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A,齿5就是齿1)下面是定转子的展开图:(图2所示)图1 是反应式步进电动机结构示意图,它的定子具有均匀分布的六个磁极,磁极上绕有绕组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告设计题目:遥控小车——基于51单片机的步进电机调速系统学院:专业:班级:学号:姓名:电子邮件:时间:成绩:指导教师:华南农业大学理学院应用物理系课程设计(报告)任务书学生姓名指导教师职称学生学号专业电子信息科学与技术题目基于51单片机的步进电机调速系统(遥控小车)任务与要求1. 设计并制作电路,利用单片计控制步进电机运转。
2. 通过键盘可以不间断地设定改变电机的转速、转向。
3. 利用显示器实时显示转速等参数。
4. 扩展功能:可设定转动步数。
开始日期2014 年3 月完成日期2014 年3 月1引言步进电机是一种将电脉冲转化为角位移的执行机构。
目前,步进机已经广泛应用于领域,例如工业生产中的机械臂的控制,照明装置和监控摄像机转动等。
步进机在装置转动、精确位移方面有很重大的作用。
本系统是基于STC89C51 单片机的遥控小车。
采用STC89C51单片机作为控制核心,通过ULN2003A驱动步进机(28BYJ-48)转动,由按键和显示屏1602组成人机交互模块,同时通过315M无线发射和接收模块向单片机输入控制信号,将整个系统固定于简易小车上,最终实现小车测试和远程遥控功能。
基本达到预定的设计要求以及功能的扩展。
2系统的设计与理论分析2.1系统总体设计2.2理论分析本设计分为两种工作模式:测试模式、遥控模式。
在电路板上有一个带锁的开关进行设置。
测试模式工作时,通过控制小车上的按键进行加速、减速、反转、设置、步数增、步数减等按键,单片机扫描按键,通过软件控制液晶模块显示对应的转速、设置的速度和步数,同时控制步进机模块进行相应的转动。
步进机的是由ULN2003A达林顿管驱动,由单片机控制输入脉冲的频率来控制步进机的转速,单片机是通过程序查表对4个I/O口输出脉冲,本次设计采用的是两相四线减速步进机,步进角为5.625°,减速比为64:1,程序采用的是8拍查表,具有较好的扭矩。
遥控模式工作时,遥控部分五个按键分别输入前、后、左、右、暂停,单片机扫描按键,通过无线发射模块发射串行编码,小车的无线接收模块接收对应的编码,送至单片机进行解码,从而控制液晶模块的显示和步进机模块的工作,进而完成功能。
设定单通道无线收发模块通信协议为:下降沿:1ms的高电平,随后500us的低电平。
起始位:4ms的高电平,随后4ms的低电平。
数据1:2ms的高电平,随后500us的低电平。
数据0:1ms的高电平,随后500us的低电平。
结束位:4ms的低电平。
发送指令程序为:{下降沿,起始位,3个数据位,结束位}发送编码为:右转:000前进:001后退:010左转:011接收程序通过触发外部中断1来接受信号,当P3.3口收到下降沿信号是即开始接收数据。
3硬件系统设计3.1总体电路图3.2单片机最小系统本次设计采用的是两相四线减速步进电机,步进角为5.625°,减速比为64:1 采用ULN2003达林顿管驱动。
3.4液晶显示模块液晶显示模块采用LCD1602显示屏。
3.6遥控器部分4软件系统设计4.1主函数4.2遥控模式程序4.3测试模式程序4.4键盘扫描程序5系统运行情况分析打开小车开关后,按下“测试”按键,小车进入测试模式。
连续按“加速”按键时,小车轮子转速明显变快;连续按“减速”按键时,小车轮子转速逐渐变慢;按“反转”按键轮子转速反向。
按“设置”按键会看到液晶显示屏关标闪烁,按“设置”键使光标移动,按“+”、“-”设置小车速度和步数,再一次按“设置”键,小车会依照这顶要求行驶。
按“测试”按键使其弹起,测试小车进入遥控模式工作时,打开遥控器,分别按下“前”、“后”、“左”、“右”,小车会依照对应的方向行驶,按下“暂停”键时,小车停止。
由此,改系统基本达到设计要求及拓展功能的要求。
不过因为本设计采用的28BYJ-48步进机为减速步进机,转动的上限值比较下,导致小车的行驶效果较慢,这个问题可以通过课后改用其他型号计算机得以解决。
6总结与讨论经过四个星期的单片机课程设计,终于完成了基于51单片机的步进电机调速系统的设计,基本达到设计要求。
同时自己在该系统上扩展无线收发模块,将该系统拓展为遥控小车。
在本次设计的过程中,我们组成员进行了热烈讨论及反复的斟酌、修改。
首先对需要用到的元器件的参数进行充分的了解,然后在计算机上用Proteus进行了与Keil软件的联动仿真。
确认仿真正确看是硬件的焊接与调试。
在实验过程中,我们也遇到了许多问题,如步进机转动不起来、液晶屏显示乱码等,但是经过不断的探索、思考、验证,我们最终克服了种种困难,解决了所遇到的问题,成功地完成了这个课程设计。
在这个过程中,除了学习到关于本次设计的一些专业知识、电路焊接实践经验外,同时,大家的刻苦耐劳、团队合作的品质也得到了充分的锻炼。
图1 遥控小车图2 遥控器附2:参考文献[1] 李朝青. 单片机原理及接口技术[M].第3版. 北京航空航天大学出版社, 2005.[2] 杨素行. 模拟电子技术基础简明教程[M]. 第三版. 高等教育出版社, 2006.A.庞明辕:电路焊接、单片机编程、电路调试、辅助完成设计报告。
B.杜烁:电路焊接、单片机编程、辅助方案改进、辅助完成设计报告。
C.汤安琪:电路焊接、数据采集、完成设计报告。
附4:元器件清单表格评语:成绩:附:程序代码:/**********************单片机课程设计C语言程序************************题目:基于步进机的小车成员:汤安琪、庞明辕、杜烁。
日期:2014-3-1******************************************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit a = P1^0;//反向sbit b = P1^1; //减速sbit c = P1^2;//加速sbit d = P1^3;//开关sbit f = P1^4;//设置sbit g = P1^5;//加sbit h = P1^6;//减sbit lcden = P3^7; //1602使能sbit lcdrs = P3^6; //1602写命令/数据选择端sbit trans = P3^3;//射频串行输入端bit n,p;uint step,time,flag,flag1,num,snum,setnum,stepnum,count,temp,sum,t,e,j,k,m;uchar v0,v1,v2,count1,num1,temp1;uchar code table1[] = {0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//左uchar code table2[] = {0x11,0x99,0x88,0xcc,0x44,0x66,0x22,0x33};//右uchar code table3[] = {0x11,0x93,0x82,0xc6,0x44,0x6c,0x28,0x39};//后uchar code table4[] = {0x11,0x39,0x28,0x6c,0x44,0xc6,0x82,0x93};//前uchar code table5[] = {"SPEED: 000 r/h"};uchar code table6[] = {"SET:000 STEP:000"};/*------------------------------------------------延时程序------------------------------------------------*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}void delay1(uint z) //10us{uchar a,b,x;for(x=0;x<z;x++)for(b=1;b>0;b--)for(a=2;a>0;a--);}/*------------------------------------------------ LCD1602写命令程序------------------------------------------------*/ void write_com(uchar com){lcdrs = 0;P0 = com;delay(5);lcden = 1;delay(5);lcden = 0;}/*------------------------------------------------ LCD1602写数据程序------------------------------------------------*/ void write_dat(uchar dat){lcdrs = 1;P0 = dat;delay(5);lcden = 1;delay(5);lcden = 0;}/*------------------------------------------------ 基于LCD1602的显示程序------------------------------------------------*/ void display(uchar add,uchar dat){uint bai,shi,ge;bai = dat/100;shi = (dat-(dat/100)*100)/10;ge = dat%10;write_com(0x80+add);write_dat(0x30+bai);write_dat(0x30+shi);write_dat(0x30+ge);}/*------------------------------------------------小车速度计算程序------------------------------------------------*/void speed_dis(){double n;if(b == 0){delay(5);if(b==0){while(!b);time = time+10;if(time>=300)time=300;}}if(c == 0){delay(5);if(c==0){while(!c);time = time-10;if(time<=70)time=70;}}n = 15*time/1024;count = 60*n;}/*------------------------------------------------步数执行程序:进入设置模式设置步数,确认后执行。