一个51单片机同时控制2个步进电机的C语言程序

一个51单片机同时控制2个步进电机的C语言程序,第1张

#include<reg52h>

#include<intrinsh>

#define mode 0x81 // 方式0,A口、B口输出,C口高4位输出,低4位输入

# include "stdioh"

# include "stringh"

# include "mathh"

xdata unsigned char PA _at_ 0x7f00;

xdata unsigned char PB _at_ 0x7f01;

xdata unsigned char PC _at_ 0x7f02;

xdata unsigned char caas _at_ 0x7f03; //控制字

sbit P32=P3^2;

sbit P33=P3^3;

sbit P35=P3^5;

#define uchar unsigned char

#define uint unsigned int

unsigned char h,Pos ;

unsigned int R,NX,NY;

unsigned char key;

code unsigned char KeyTable[] = { // 键码定义

0x0f, 0x0b, 0x07, 0x03,

0x0e, 0, 0x06, 0x02,

0x0d, 0x09, 0x05, 0x01,

0x0c, 0x08, 0x04, 0x00

};

code unsigned char LEDMAP[] = { // 八段管显示码

0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,

0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71

};

unsigned char Code_ ; // 字符代码寄存器

#define PD1 61 // 122/2 分成左右两半屏(122x32)

unsigned char Column;

unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址

unsigned char Code_ ; // 字符代码寄存器

unsigned char Command; // 指令寄存器

unsigned char LCDData; // 数据寄存器

xdata unsigned char CWADD1 _at_ 0x1cff; // 写指令代码地址(E1)

xdata unsigned char DWADD1 _at_ 0x1eff; // 写显示数据地址(E1)

xdata unsigned char CRADD1 _at_ 0x1dff; // 读状态字地址(E1)

xdata unsigned char DRADD1 _at_ 0x1fff; // 读显示数据地址(E1)

xdata unsigned char CWADD2 _at_ 0x3cff; // 写指令代码地址(E2)

xdata unsigned char DWADD2 _at_ 0x3eff; // 写显示数进地址(E2)

xdata unsigned char CRADD2 _at_ 0x3dff; // 读状态字地址(E2)

xdata unsigned char DRADD2 _at_ 0x3fff; // 读显示数据地址(E2)

//----------------------液晶-----------------

// 清屏

// 中文显示程序 /

/直线 插 补8/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=50;y>0;y--);

}

void zhengx()

{

PA=0x00;

delay(10);

PA=0x01;

delay(10);

}

void fux()

{

PA=0x02;

delay(10);

PA=0x03;

delay(10);

}

void zhengy()

{

PB=0x00;

delay(10);

PB=0x10;

delay(10);

}

void fuy()

{

PB=0x20;

delay(10);

PB=0x30;

delay(10);

}

void zhixian(int NX,int NY)

{int FM, NXY, XOY,ZF,z;

FM=0;

{if(NX>0)

if(NY>0)

XOY=1;

else

XOY=4;

else

if(NY>0)

XOY=2;

else

XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)

{ {if(NX>0)

if(NY>0)

XOY=1;

else

XOY=4;

else

if(NY>0)

XOY=2;

else

XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)

{ if(FM>=0)

{if(XOY==1||XOY==4)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();

}

FM=FM-fabs(NY);

}

else

{if(XOY==1||XOY==2)

{

ZF=3;

zhengy();

}

else

{ZF=4;

fuy();

}

FM=FM+fabs(NX);

}

}

for(z=0;z<200;z++)

{P35 = 0;

delay(10);

P35 = 1;

delay(10);

}

}

}

/圆 弧 插 补8/

void yuanhu1( int X0,int Y0, int NX, int NY ,int RNS )

{

int NXY,BS,ZF,XM,YM,z;

int FM=0;

BS=fabs(NX-X0) + fabs(NY-Y0);

XM=fabs(X0);

YM=fabs(Y0);

for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)

{

if(RNS==1||RNS==3||RNS==6||RNS==8)

{

if(FM<0)

{

if(RNS==1||RNS==8)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();}

FM=FM+2fabs(XM)+1;

XM=XM+1;

}

else

{

if(RNS==1||RNS==6)

{

ZF=3;

fuy();

}

else

{ZF=4;

zhengy();

}

FM=FM-2fabs(YM)+1;

YM=YM-1;

}

}

else

if(FM>=0)

{

if(RNS==2||RNS==7)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();

}

FM=FM-2fabs(XM)+1;

XM=XM-1;

}

else

{

if(RNS==2||RNS==5)

{ZF=3;

zhengy();}

else

{ZF=4;

fuy();}

FM=FM+2fabs(YM)+1;

YM=YM+1;

}

}

if(P32==0||P33==0)

{

for(z=0;z<200;z++)

{P35 = 0;

delay(10);

P35 = 1;

delay(10);

}

}

}

int shuzhi1 ()

{

int i=0,j=0,k=3;

while (1)

{

if(testkey())

{ delay(300);

delay1();

if(testkey())

{ j=getkey();

if(j!=14)

{i=i10 + j;

k--;}

}}

if(k==0)

break;

}

return i;

}

int shuzhi2 ()

{

int i=0,j=0,k=3;

while (1)

{

if(testkey())

{ delay(300);

delay1();

if(testkey())

{ j=getkey();

if(j!=14)

{i=i10 + j;

k--;}

}}

if(k==0)

break;

}

return i;

}

void yuanhuchabu1()

{ int q=0;

delay(300);

R=shuzhi1();

yj1();

q=R/100;

Page_ = 0x00;

Column = 0x35;

Code_ = q;

WriteCHN8x16();

q=R%100;

q=q/10;

Page_ = 0x00;

Column = 0x40;

Code_ = q;

WriteCHN8x16();

q=R%10;

Page_ = 0x00;

Column = 0x48;

Code_ = q;

WriteCHN8x16();

yuanhu1(R,0,0,R,5);

yuanhu1(0,R,-R,0,6);

yuanhu1(-R,0,0,-R,7);

yuanhu1(0,-R,R,0,8);

}

void yuanhuchabu2()

{ int q=0;

delay(300);

R=shuzhi1();

yj1();

q=R/100;

Page_ = 0x00;

Column = 0x35;

Code_ = q;

WriteCHN8x16();

q=R%100;

q=q/10;

Page_ = 0x00;

Column = 0x40;

Code_ = q;

WriteCHN8x16();

q=R%10;

Page_ = 0x00;

Column = 0x48;

Code_ = q;

WriteCHN8x16();

yuanhu1(0,R,R,0,1);

yuanhu1(R,0,0,-R,4);

yuanhu1(0,-R,-R,0,3);

yuanhu1(-R,0,0,R,2);

}

void zhixianchabu()

{ int q1=0,q2=0;

delay(300);

NX=shuzhi1();

delay(300);

NY=shuzhi2();

yj2();

Page_ = 0x00;

Column = 0x25;

Code_ = 0x10;

WriteCHN8x16();

q1=NX/100;

Page_ = 0x00;

Column = 0x30;

Code_ = q1;

WriteCHN8x16();

q1=NX%100;

q1=q1/10;

Page_ = 0x00;

Column = 0x37;

Code_ = q1;

WriteCHN8x16();

q1=NX%10;

Page_ = 0x00;

Column = 0x40;

Code_ = q1;

WriteCHN8x16();

q2=NY/100;

Page_ = 0x00;

Column = 0x50;

Code_ =q1;

WriteCHN8x16();

q2=NY%100;

q2=q2/10;

Page_ = 0x00;

Column = 0x58;

Code_ = q2;

WriteCHN8x16();

q2=NY%10;

Page_ = 0x00;

Column = 0x60;

Code_ = q2;

WriteCHN8x16();

Page_ = 0x00;

Column = 0x72;

Code_ = 0x11;

WriteCHN8x16();

zhixian(NX,NY );

}

void main()

{ int q=0,q1=0,q2=0;

caas=mode;

PA=0X00;

PB=0X00;

PC=0x00;

R=0X00;

while(1)

{

if(testkey())

{

delay1();

if(testKey())

{ delay1();

if(getkey()==15)

{

delay(300);

yuanhuchabu1();

}

else if(getkey()==10)

{ delay(300);

yuanhuchabu2();

}

else if(getkey()==13)

{

zhixianchabu();

}

else if(getkey()==1)

{

zhengx();

}

else if(getkey()==2)

{

fux();

}

else if(getkey()==3)

{

zhengy();

} else if(getkey()==4)

{

fuy();

}

}

}

if(GetKey()==12)

{ break;}

}

}

程序是指基本指令,通过范围内的修改达到使用目的。

一个步进电机控制器和3个步进电机的控制器只是脉冲输出点位不一样而已(芯片不一样)当然,输出的IO点也会增加,3个步进电机的控制器可以控制1~3个步进电机不同的工作,基于51单片机的开发代码指令和软件由芯片生产商提供,基础代码由控制器工程师提供,一款产品是基于硬件和软件的结合,开发者一般从硬件设计开始,如果你可以提供控制器硬件,我相信软件就会非常简单。

程序其实就是写代码,和PLC接近,但比PLC复杂,因为PLC是开放式的。

下面是我们的三轴控制器。

三轴运动控制器简介

控制器的功能:

⑴ 显示屏分辨率可选两种128×64点、192×64点单色图形屏(黄绿屏或蓝屏),分别可显示16×16标准点阵汉字4行8列、4行12列。

⑵ 内置蜂鸣器,可以通过软件配合按键发声,或做报警等其他通途。

⑶ 控制器须外接DC5V工作电源。如果系统要用到模拟量输出(0~10VDC)功能,则需要外部的±12VDC电源。

⑷ 用宏晶STC12C系列高性能CPU,同时钟频率下,运算速度比其他51系列CPU快8~12倍。

⑸ 64KB程序空间,8KB + 256KB数据空间,带实时日历时钟。

⑹ 自带512KB字库,含16×16点阵汉字、16×16点阵字符、8×16点阵ASCII字符、12×12点阵汉字、12×12点阵字符、6×12点阵ASCII字符。两种汉字字库均包含全部一、二级汉字。

⑺ 19个按键,其中6个按键上可配有LED指示灯。LED指示灯可单独控制亮暗,和按键本身不直接关联,用于系统中一些常用功能选择之用。

⑻ 3轴运动控制,脉冲+方向,差分输出,最大脉冲频率50KHz,极强的抗干扰能力。也可以接成共阳极输出,系统有+5V输出端子。16位脉冲计数,也可无限发脉冲。

⑼ 2路AB相输入解码。

⑽ 20路DI输入,12~24VDC共阳极。

⑾ 16路DO输出,晶体管输出,可以外接继电器等,外接继电器等感性负载时,须在继电器线圈两端并联反向二极管。

⑿ 支持RS232、RS485通信。

⒀ 串口下载,宏晶官方提供的下载软件。

⒁ 开发环境是KEIL公司的C51开发平台μVision3,也可以自行在网上升级更高版本。

⒂ 开发库是C51格式的库文件。

DFC111h---------------------------------------基本头文件

DFC_MU102_Sysh---------------------------系统头文件

DFC_MU102_SYSLIB---------------------------系统库文件

DFC_MU102_LCDh------------------------LCD控制头文件

DFC_MU102_LCDLib------------------------LCD控制库文件

DFC_MU102_KB19h------------------------按键控制头文件

DFC_MU102_KB19Lib------------------------按键控制库文件

DFC_IO111h------------------------------输入输出头文件

DFC_IO111Lib------------------------------输入输出库文件

以上就是关于一个51单片机同时控制2个步进电机的C语言程序全部的内容,包括:一个51单片机同时控制2个步进电机的C语言程序、用51单片机控制3个步进电机时的程序!越详细越好。、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9290402.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存