一个关于单片机控制步进电机的C语言程序想请高人帮我把每一步都注释出来

一个关于单片机控制步进电机的C语言程序想请高人帮我把每一步都注释出来,第1张

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 int

sbit 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”延时子程序,用循环语句延时。

{

unsigned char i

while(tt--)

for(i=113i>0i--)

}

keyscan()//键盘扫描 “keyscan”键盘扫描子程序,用于寻找是否有按键按下

{

P2=0xf0//把oxfe赋值给P2口//将按键控制口置于未按键的状此誉态.单片机输出//口假设不是按键按下状态.

if(P2!=0xf0) //如果P2口的值不等于0xfe //检查是否有按键按下.如果有,处理{}内的事

{ //有按键按下.

Delay1mS(150)//调用延时函数//有按键按下,避开无效读码值的时间.,或者是脉冲长度

Hscan=0xfe//将Hscan赋值,初始拍运遥控值是要置高电平的.

P2=Hscan //

while((Hscan&0x10)!=0) //检查X10口是否森贺段有键按下。未按下是1,

//在这显示出你的按键口是P2_4.即检查P2_4是高电平,无//键按下,低电平有键按下。

{

P2=Hscan

if((P2&0xf0)!=0xf0)//检查按键脉冲是否是变化,

return P2

else Hscan=(Hscan<<1)|0x01 //这里在存码值,应该是遥控输入。将码值存入Hscan

//这里是读取码值的关键,如果来的脉冲不管是高电平//还是低电平,靠左移一位保存脉冲的状态值.

}

}

else return 0

}

key_val() //按键处理函数 //这里是读取将存好的码值进行处理.看是什么代码值

{

uchar key

key= keyscan() //这里是读取码值并存放在key里

switch(key) //这里是对比读取的码值

{

case 0xee: //按键‘7’ //读取的码值=0xEE,则是按键“7”的代码

//while(P2==0xee)

setstep=setstep*10+7//步伐数 //这里是输入”setstep +7” 步伐数对比读取的码值, //setstep原来可能是有数字的。

step=setstep

butcount++ //计数,看输入拉几个数字

if(butcount>=5) //输入的数字超过5个就置0,无效

{

butcount=0

setstep=0

}

break

case 0xde: //按键‘8’ //读取的码值=0xdE,则是按键“8”的代码

//其他同”7”

//while(P2==0xde)

setstep=setstep*10+8

butcount++

step=setstep

if(butcount>=5)

{

butcount=0

setstep=0

}

break

case 0xbe: //按键‘9’ //同上”7”

//while(P2==0xbe)

setstep=setstep*10+9

butcount++

step=setstep

if(butcount>=5)

{

butcount=0

setstep=0

}

break

case 0x7e: //按键‘正转 //正转按键识别

while(P2==0x7e)//等待按键松开//一值按住电机是不转的,放开后才转.有检查//P2口的状态值

flag[0]=0xff //开启正转标志,关闭反转//置正转标志.

flag[1]=0x00 //清除反转标志.

butcount=0

speedcount=0

speed=500//置电机的转速.

if(!flag[4]) step=0

TR0=1

break

case 0xed: //按键‘4’ //同上”7”

while(P2==0xed)

setstep=setstep*10+4

butcount++

step=setstep

if(butcount>=5)

{

butcount=0

setstep=0

}

break

case 0xdd: //按键‘5’ //同上”7”

//while(P2==0xdd)

setstep=setstep*10+5

step=setstep

butcount++

if(butcount>=5)

{

butcount=0

setstep=0

}

break

#include"reg51.h"

sbit SW1=P3^4//定义一个开关

sbit KEY1=P3^5//定义一个按钮

bit Key1Flag//定义一个标志位

void DELAY(unsignedchar dly)//这是一个延时程序

{

unsigned char i,j

for(i=0i<dlyi++)

for(j=0j<255j++)

}

voidMode1_deasil(unsigned char dly)//正转一步的程序

{

P1=0x01 //A

DELAY(dly)

P1=0x02 //B

DELAY(dly)

P1=0x04 //C

DELAY(dly)

P1=0x08 //D

DELAY(dly)

}

voidMode1_anticlockwise(unsigned char dly)//反转一步的程序

{

P1=0x08 //D

DELAY(dly)

P1=0x04 //C

DELAY(dly)

P1=0x02 //B

DELAY(dly)

P1=0x01 //A

DELAY(dly)

}

voidMode1_deasil(unsigned char dly)//复制重了吧?和上面的没看出区别

{

P1=0x01 //A

DELAY(dly)

P1=0x02 //B

DELAY(dly)

P1=0x04 //C

DELAY(dly)

P1=0x08 //D

DELAY(dly)

}

voidMode1_anticlockwise(unsigned char dly)//复制重了吧?和上面的没看出区别

{

P1=0x08 //D

DELAY(dly)

P1=0x04 //C

DELAY(dly)

P1=0x02 //B

DELAY(dly)

P1=0x01 //A

DELAY(dly)

}

main()

{

unsigned char counter//定义一个计数器,用来指示电机转多少圈

counter=10

while(1)

{

if(SW1==1)Mode1_deasil(counter)//如果SW1为乱橡乎高电平,正转counter步也就是10步

else Mode1_anticlockwise(counter)//如果SW1不哗悉为高电平,反转转counter步也就是10步

//下面这段主要是通过KEY1来如则调整COUNTER的值的,也就是用来调整电机转的步数

if((Key1Flag==0)&&(KEY1==1))Key1Flag=1//这是用来设定KEY1FLAG这个标志位的

elseif((Key1Flag==1)&&(KEY1==0))

{

DELAY(50)

if(KEY1==0)

{

Key1Flag=0

counter=counter+50

if(counter>=250)counter=50

}

}

}

}

我之前做过一个,步进电机模拟电梯运侍数迟行的控制程序,是那种发一个信号走一步的那种,步进角比较大,好像是15度左右,我当时的做法就是加入系统延时,让程序给步进电机发送信号,通过控制延时来决定单位时间内步进电机转动的次数

我用的是永磁式步进电机,不知道你用的是什么样的,我使用的这种,步进角比较大,步进电机都是一步步转的,老李转快了就看不出步进电机是一步步转了

而当是步进电机正转是按这样的顺序发送信毕高号,abcd,反转是dcba

转多少圈,就是循环给步进电机发送信号,使用程序控制发送信号的次数,至于怎么控制只要知道接口函数什么的还是不难的。

如果还是不大明白,我倒是可以帮你看看程序


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

原文地址: http://outofmemory.cn/yw/12561893.html

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

发表评论

登录后才能评论

评论列表(0条)

保存