5V步进电机 28YBJ-48驱动电路设计程序怎么写

5V步进电机 28YBJ-48驱动电路设计程序怎么写,第1张

控制换相顺序:

TABLE_F:

DB 0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,0F9H

DB 00 ;正转结束

TABLE_R:

DB 0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,0F1H

DB 00 ;反转结束

控制电机的转向

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

MOV DPTR,#TABLE_R

MOVC A,@A+DPTR

MOV P1,A

步进电机的速度控制

DELAY:

MOV R5,RATE

DEL2:

MOV R7,#5

DEL3:

MOV R6,#250

DJNZ R6,$

DJNZ R7,DEL3

DJNZ R5,DEL2

RET

步进电机的总转动角度控制

FFW:

MOV R3,#5

MOV R0,#00H

MOV R1,#12

FFW1:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC RO

JNZ FFW1

MOV RO,#OOH

DJNZ R1,FFW1

MOV R1,#12

DJNZ R3,FFW1

MOV P1,#0F0H

RET

TABLE_F:

DB 0F3H,0F6H,0FCH,0F9H

DB 00H

TABLE_R:

DB 0F9H,0FCH,0F6H,0F3H

DB 00H

步进电机的加减速控制

加速启动

FFW_RISE:

MOV RATE,#10H

MOV R0,#00H

FFW1:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC RO

JNZ FFW1

MOV RO,#00H

MOV A,RATE

DEC A

MOV RATE,A

CJNE A,#1,FFW1

恒速启动

FFW_CONSTANT:

MOV R1,#0FFH

FFW2:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DEALY

INC RO

JNZ FFW2

MOV RO,#00H

DJNZ R1,FFW2

减速停止过程

FFW_FALL:

MOV RO,#00H

FFW3: MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC R0

JNZ FFW3

MOV RO,#00H

MOV A,RATE

INC A

MOV RATE,A

CJNE A,#10H,FFW3

RET

发个电路的吧 我想好多人会帮你的忙。

#include <at89x51h>//用AT89C51时就用这个头文件

//#include <reg52h>//用华邦W78E58B时必须用这个头文件

#include <absacch>

#include <ctypeh>

#include <mathh>

#include <stdioh>

#include <stringh>

#include <DS18B20h>

#include "LCD1602h" ////液晶显示头文件

//sbit DQ = P3^4; //定义DQ引脚为P34

unsigned char t[2],pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的

unsigned char  TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};

//显示实时温度,上电时显示+12500C

unsigned char  TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,

0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};

//显示温度上下限,上电时显示TH:+125 TL:+124C

unsigned char code dotcode[4]={0,25,50,75};

/因显示分辨率为025,但小数运算比较麻烦,故采用查表的方法

再将表值分离出十位和个位后送到十分位和百分位/

void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据

{

if(TH>0x7F)                    //判断正负,如果为负温,将其转化为其绝对值

{

TempBuffer0[3]=0x2d;      //0x2d为"-"的ASCII码

TH=~TH;

TH++;

}

else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码

if(TL>0x7f)

{

TempBuffer0[11]=0x2d;      //0x2d为"-"的ASCII码

TL=~TL+1;

}

else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码

TempBuffer0[4]=TH/100+0x30;              //分离出TH的百十个位

if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐

TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位

TempBuffer0[6]=(TH%100)%10+0x30;   //分离出个位

TempBuffer0[12]=TL/100+0x30;              //分离出TL的百十个位

if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐

TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位

TempBuffer0[14]=(TL%100)%10+0x30;   //分离出个位

}

void covert1(void) //将温度转换为LCD显示的数据

{

unsigned char x=0x00,y=0x00;

t[0]=pt;

pt++;

t[1]=pt;

if(t[1]>0x07)                    //判断正负温度

{

TempBuffer1[0]=0x2d;      //0x2d为"-"的ASCII码

t[1]=~t[1];  /下面几句把负数的补码/

t[0]=~t[0];   / 换算成绝对值/

x=t[0]+1;  //

t[0]=x;  //

if(x>255)                //

t[1]++;  //

}

else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码

t[1]<<=4; //将高字节左移4位

t[1]=t[1]&0x70; //取出高字节的3个有效数字位

x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它

x>>=4; //右移4位

x=x&0x0f; //和前面两句就是取出t[0]的高四位

t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节

TempBuffer1[1]=t[1]/100+0x30;              //+0x30 为变 0~9 ASCII码

if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐

TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位

TempBuffer1[3]=(t[1]%100)%10+0x30;   //分离出个位

t[0]=t[0]&0x0c; //取有效的两位小数

t[0]>>=2; //左移两位,以便查表

x=t[0];

y=dotcode[x]; //查表换算成实际的小数

TempBuffer1[5]=y/10+0x30; //分离出十分位

TempBuffer1[6]=y%10+0x30; //分离出百分位

}

void delay(unsigned char i)

{

while(i--);

}

main()

{

unsigned char TH=110,TL=-20;     //下一步扩展时可能通过这两个变量,调节上下限

 //测温函数返回这个数组的头地址

while(1)

{

pt=ReadTemperature(TH,TL,0x3f);  //上限温度-22,下限-24,分辨率10位,也就是025C

 //读取温度,温度值存放在一个两个字节的数组中,

delay(100);

covert1();

covert0(TH,TL);

LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行

//为1表示第二行,第三个参数为显示数据的首地址

LCD_Print(0,0,TempBuffer0);

LCD_Print(0,1,TempBuffer1); 

}

}

//一下是液晶代码模块

////////////////////////////////////////////////////////////////////////

#include <at89x51h>//用AT89C51时就用这个头文件

//#include <reg52h>//用华邦W78E58B时必须用这个头文件

#include <intrinsh>

//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开

//Port Definitions

sbit LcdRs = P2^0;

sbit LcdRw = P2^1;

sbit LcdEn   = P2^2;

sfr  DBPort  = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0数据端口

//内部等待函数

unsigned char LCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

 //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

 //实际硬件时打开此语句

LcdEn=0;

return DBPort;

}

//向LCD写入命令或数据

#define LCD_COMMAND 0      // Command

#define LCD_DATA 1      // Data

#define LCD_CLEAR_SCREEN 0x01      // 清屏

#define LCD_HOMING   0x02      // 光标返回原点

void LCD_Write(bit style, unsigned char input)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1; _nop_();//注意顺序

LcdEn=0; _nop_();

LCD_Wait();

}

//设置显示模式

#define LCD_SHOW 0x04    //显示开

#define LCD_HIDE 0x00    //显示关

#define LCD_CURSOR 0x02  //显示光标

#define LCD_NO_CURSOR 0x00    //无光标

#define LCD_FLASH 0x01    //光标闪动

#define LCD_NO_FLASH 0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)

{

LCD_Write(LCD_COMMAND, 0x08|DisplayMode);

}

//设置输入模式

#define LCD_AC_UP 0x02

#define LCD_AC_DOWN 0x00      // default

#define LCD_MOVE 0x01      // 画面可平移

#define LCD_NO_MOVE 0x00      //default

void LCD_SetInput(unsigned char InputMode)

{

LCD_Write(LCD_COMMAND, 0x04|InputMode);

}

//初始化LCD

void LCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,57点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动

}

//

void GotoXY(unsigned char x, unsigned char y)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

void Print(unsigned char str)

{

while(str!='\0')

{

LCD_Write(LCD_DATA,str);

str++;

}

}

void LCD_Print(unsigned char x, unsigned char y, unsigned char str)

{

GotoXY(x,y);

Print(str);

}

两者没有直接关系,但是相关。

编程有两个概念:

1是编一个软件,如windows系统是一个大程序,与CPU、显示器、打印机,都有关系。

2是编一个电器的动作控制程序,如PLC程序,它与电器元件本生也相关。

但是,没人既要研究硬件,又要研究软件,现在社会分工很细,而且都是在前人基础上发展的,所以,可以说都是分类组合。

作为电子工程师,如果在工厂,你如同一个裁缝,只要你会用剪刀剪出花样,而不需知道剪刀是什么材料做的。

以上就是关于5V步进电机 28YBJ-48驱动电路设计程序怎么写全部的内容,包括:5V步进电机 28YBJ-48驱动电路设计程序怎么写、求哪位高人给我写个程序吧,写一个设计电路的程序,电路我有,是单片机的。温度报警器、电子制造业里电路设计和编制程序有什么关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存