51单片机C语言程序按键控制步进电机转速

51单片机C语言程序按键控制步进电机转速,第1张

sbit K1=P1^0;

sbit K2=P1^1;

char y=0;

while(1)

{

pangduan();

for(i=0;i<4;i++) //4相

{

/P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格

Delay(500); //改变这个参数可以调整电机转速

Delay(5000);/

P1=B_Rotation[i];

Delay(265+y);

P1=F_Rotation[i];

Delay(265+y);

}

}

void pangduan()

{

if(K1==0)

{ y++; //加

while(~k1)

}

if(K2==0)

{ y--;

while(~k2); //减

}

}

}

没有下上限 要是调的话 需要判断显示延时时间

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit KEY1 = P3^2; //步进电机逆时针方向转

sbit KEY2 = P3^3; //步进电机顺时针方向转

sbit KEY3 = P3^4; //步进电机调速

uchar step = 0;

bit AB_flag = 0;

unsigned char code A_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //顺时针转表格

unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆时针转表格

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay(uint i)

{

uchar x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

void KEY(void)

{

if(KEY1 == 0) //按P32,实现步进电机的逆时针转动

{

Delay(15);

if(KEY1 == 0)

{

while(1)

{

if(KEY1 == 1)

{

Delay(15);

if(KEY1 == 1)

{

AB_flag = 0;

break;

}

}

}

}

}

if(KEY2 == 0) //按P33,实现步进电机的顺时针转动

{

Delay(15);

if(KEY2 == 0)

{

while(1)

{

if(KEY2 == 1)

{

Delay(15);

if(KEY2 == 1)

{

AB_flag = 1;

break;

}

}

}

}

}

if(KEY3 == 0) //按P34,实现步进电机的调速

{

Delay(15);

if(KEY3 == 0)

{

while(1)

{

if(KEY3 == 1)

{

Delay(15);

if(KEY3 == 1)

{

step++;

if(step == 3)

{

step = 0;

}

break;

}

}

}

}

}

}

main()

{

uchar i;

while(1)

{

KEY(); //按键处理函数

for(i=0;i<8;i++) //因为有8路的控制时序

{

if(AB_flag == 0)

{

P1 = A_Rotation[i]; //逆时针转动

}

else

{

P1 = B_Rotation[i]; //顺时针转动

}

Delay(2+step); //改变这个参数可以调整电机转速

}

}

}

C语言程序源代码

#include <REGX51H> // 51寄存器定义

#include "intrinsh"

#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=113;i>0;i--);

}

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=setstep10+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=setstep10+8;

butcount++;

step=setstep;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

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

//while(P2==0xbe);

setstep=setstep10+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=setstep10+4;

butcount++;

step=setstep;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

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

//while(P2==0xdd);

setstep=setstep10+5;

step=setstep;

butcount++;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

这个不是很难,建议自己写一下我给个我以前的

uchar FFW_xia[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码

uchar REV_xia[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码

uchar FFW_shang[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //四相八拍正转编码

uchar REV_shang[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////四相八拍反转编码

uchar bujinjiao=0; //控制步进电机的步进角

void IO_bujin(void)

{

P1DIR|=0XFF;

P1OUT|=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); //初始化电机接口

}

/

DAO时钟函数

/

void SysCtlClockInit()

{

DCOCTL=0;

BCSCTL1=CALBC1_1MHZ;

DCOCTL =CALDCO_1MHZ;

BCSCTL1|=DIVA_1; //ACLK =MCLK/2=8M

BCSCTL2|=DIVS_3; //SMCLK=MCLK/2=8M//SMCLK=MCLK/2=8M

}

/

主函数

用P20 P21 控制下面的步进电机

用P22 P23 控制上面的步进电机

/

void main(void)

{

SysCtlClockInit(); //时钟初始化

IO_bujin();

P2DIR |=BIT5;//激光q

P2OUT&=~BIT5;

P2IE|=BIT4;//初始化P24的中断按键,激光q开

P2IES|=BIT4;

P2IFG&=~BIT4;

_EINT(); //使能中断,

while(1)

{

if(((P2IN&BIT0)==0)||((P2IN&BIT1)==0))//控制下面的步进电机

{

if((P2IN&BIT0)==0)//P20按下

{

delay_ms(1);

if(!(P2IN&BIT0))

{

while(!(P2IN&BIT0));

for(bujinjiao=0;bujinjiao<=7;bujinjiao++)

{

P1OUT = FFW_xia[bujinjiao]; //取数据正转波形

delay_ms(tiaosu);

}

}

}

if((P2IN&BIT1)==0) //P21按下

{

delay_ms(1);

if(!(P2IN&BIT1))

{

while(!(P2IN&BIT1));

for(bujinjiao=0;bujinjiao<=7;bujinjiao++)

{

P1OUT = REV_xia[bujinjiao]; //取数据正转波形

delay_ms(tiaosu);

}

}

}

}

if(((P2IN&BIT2)==0)||((P2IN&BIT3)==0))//控制上面的步进电机

{

if((P2IN&BIT2)==0)//P22按下

{

delay_ms(1);

if(!(P2IN&BIT2))

{

while(!(P2IN&BIT2));

for(bujinjiao=0;bujinjiao<=7;bujinjiao++)

{

P1OUT = FFW_shang[bujinjiao]; //取数据正转波形

delay_ms(tiaosu);

}

}

}

if((P2IN&BIT3)==0) //P23按下

{

delay_ms(1);

if(!(P2IN&BIT3))

{

while(!(P2IN&BIT3));

for(bujinjiao=0;bujinjiao<=7;bujinjiao++)

{

P1OUT = REV_shang[bujinjiao]; //取数据正转波形

delay_ms(tiaosu);

}

}

}

}

}

}

ld

x1

out

m0

stl

每个S中加入

ldi

m0

原来的代码

这样即可实现暂停:当按下X1时m0通,则步进中的指令不执行,但处于该步进号中,再按下X1则m0断开,继续执行步进.X1你最好使用自锁开关,当然点动也可以,第一句改一下,但逻辑性不是很好,暂停可以使用蘑菇头的自锁开关,但不要贴紧急的黄牌,以示区别于紧急停止.

以上就是关于51单片机C语言程序按键控制步进电机转速全部的内容,包括:51单片机C语言程序按键控制步进电机转速、求单片机控制步进电机的C语言程序,急啊、一个关于单片机控制步进电机的C语言程序 想请高人帮我把每一步都注释出来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9852022.html

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

发表评论

登录后才能评论

评论列表(0条)

保存