步进电机键盘控制可调速.docx

上传人:b****0 文档编号:25885538 上传时间:2023-06-16 格式:DOCX 页数:24 大小:20.40KB
下载 相关 举报
步进电机键盘控制可调速.docx_第1页
第1页 / 共24页
步进电机键盘控制可调速.docx_第2页
第2页 / 共24页
步进电机键盘控制可调速.docx_第3页
第3页 / 共24页
步进电机键盘控制可调速.docx_第4页
第4页 / 共24页
步进电机键盘控制可调速.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

步进电机键盘控制可调速.docx

《步进电机键盘控制可调速.docx》由会员分享,可在线阅读,更多相关《步进电机键盘控制可调速.docx(24页珍藏版)》请在冰豆网上搜索。

步进电机键盘控制可调速.docx

步进电机键盘控制可调速

步进电机(键盘控制可调速)1.2.3转载专业文档2008-04-0422:

52:

35阅读779评论0字号:

大中小

步进电机(键盘控制可调速)

#include

#defineucharunsignedchar

staticunsignedintcount;//计数

staticintstep_index;//步进索引数,值为0-7

staticbitturn;//步进电机转动方向

staticbitstop_flag;//步进电机停止标志

staticintspeedlevel;//步进电机转速参数,数值越大速度越大,最小值为1,速度最慢

staticintspcount;//步进电机转速参数计数

voidddelay(void);//键盘扫描延时函数

voiddelay(unsignedintendcount);//延时函数,延时为endcount*1毫秒

voidgorun();//步进电机控制步进函数

sbitP10=P2^0;//电机端口定义

sbitP11=P2^1;

sbitP12=P2^2;

sbitP13=P2^3;

/*键消抖延时函数*/

voidddelay(void)

{

uchari;

for(i=300;i>0;i--);

}

 

/*键扫描函数*/

ucharkeyscan(void)

{

ucharscancode;

uchartmpcode;

P1=0xf8;//发全0行扫描码

if((P1&0xf8)!

=0xf8)//若有键按下

{

ddelay();//延时去抖动

if((P1&0xf8)!

=0xf8)//延时后再判断一次,去除抖动影响

{

scancode=0xfe;

while((scancode&0x08)!

=0)//逐行扫描

{

P1=scancode;//输出行扫描码

if((P1&0xf8)!

=0xf8)//本行有键按下

{

tmpcode=(P1&0xf8)|0x07;

return((~scancode)+(~tmpcode));//返回特征字节码,为1的位即对应于行和列

}

elsescancode=(scancode<<1)|0x01;//行扫描码左移一位

}

}

}

return(0);//无键按下,返回值为0

}

voidmain(void)

{

ucharkey;

count=0;

step_index=0;

spcount=0;

P10=0;

P11=0;

P12=0;

P13=0;

EA=1;//允许CPU中断

TMOD=0x11;//设定时器0和1为16位模式1

ET0=1;//定时器0中断允许

TH0=0xFc;

TL0=0x18;//设定时每隔1ms中断一次

TR0=1;//开始计数

stop_flag=0;

turn=0;

speedlevel=20;

while

(1)

{

key=keyscan();

switch(key)

{

case0x09:

//按键#,正转以speedlevel=1的速度转1000*0.5MS=0.5S

stop_flag=0;

turn=0;

speedlevel=10;

gorun();

delay(1000);

break;

case0x0c:

//按键*,停止2000*0.5MS=0.5S

stop_flag=1;

break;

case0x0a:

//按键0,反转以speedlevel=1的速度转1000*0.5MS=0.5S

stop_flag=0;

turn=1;

speedlevel=10;

gorun();

delay(1000);

break;

case0x11:

//按键9,以--speedlevel的加速转1000*0.5MS=0.5S

stop_flag=0;

if(speedlevel==1)

{speedlevel=1;}

else{--speedlevel;}

gorun();

delay(1000);

break;

case0x12:

//按键8,以++speedlevel的减速转1000*0.5MS=0.5S

stop_flag=0;

++speedlevel;

gorun();

delay(1000);

break;

}

}

}

 

//定时器0中断处理

voidtimeint(void)interrupt1

{

TH0=0xFc;

TL0=0x18;//设定时每隔1ms中断一次

count++;

spcount--;

if(spcount<=0)//速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),

{//频率越小,速度越慢

spcount=speedlevel;

gorun();

}

}

voiddelay(unsignedintendcount)//延时函数,延时为endcount*0.5毫秒

{

count=0;

do{}

while(count

}

voidgorun()

{

if(stop_flag==1)

{

P10=0;

P11=0;

P12=0;

P13=0;

return;

}

switch(step_index)

{

case0:

//0

P10=1;

P11=0;

P12=0;

P13=0;

break;

case1:

//0、1

P10=1;

P11=1;

P12=0;

P13=0;

break;

case2:

//1

P10=0;

P11=1;

P12=0;

P13=0;

break;

case3:

//1、2

P10=0;

P11=1;

P12=1;

P13=0;

break;

case4:

//2

P10=0;

P11=0;

P12=1;

P13=0;

break;

case5:

//2、3

P10=0;

P11=0;

P12=1;

P13=1;

break;

case6:

//3

P10=0;

P11=0;

P12=0;

P13=1;

break;

case7:

//3、0

P10=1;

P11=0;

P12=0;

P13=1;

}

if(turn==0)//正转

{

step_index++;

if(step_index>7)

step_index=0;

}

else

{//反转

step_index--;

if(step_index<0)

step_index=7;

}

}

步进电机(键盘控制可调速加显示)

#include

#defineucharunsignedchar

staticunsignedintcount;//计数

staticintstep_index;//步进索引数,值为0-7

staticbitturn;//步进电机转动方向

staticbitstop_flag;//步进电机停止标志

staticintspeedlevel;//步进电机转速参数,数值越大速度越大,最小值为1,速度最慢

staticintspcount;//步进电机转速参数计数

voidddelay(void);//键盘扫描延时函数

voiddelay(unsignedintendcount);//延时函数,延时为endcount*1毫秒

voidgorun();//步进电机控制步进函数

voidDelay400Ms(void);

voidLCMInit(void);//LCM初始化

voidWriteCommandLCM(unsignedcharWCLCM,BuysC);//BuysC为0时忽略忙检测

voidDisplayOneChar(ucharX,ucharY,ucharDData);

voidDisplayListChar(ucharX,ucharY,ucharListLength,uchar*DData,ucharn);

sbitP10=P3^0;//电机端口定义

sbitP11=P3^1;

sbitP12=P3^2;

sbitP13=P3^3;

ucharcodespeed[]={0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30};

ucharcodestop[]={"stop"};

ucharcodego[]={"go:

"};

ucharcodeback[]={"back:

"};

ucharcodemax[]={"max:

8"};

/*键消抖延时函数*/

voidddelay(void)

{

uchari;

for(i=300;i>0;i--);

}

 

/*键扫描函数*/

ucharkeyscan(void)

{

ucharscancode;

uchartmpcode;

P1=0xf8;//发全0行扫描码

if((P1&0xf8)!

=0xf8)//若有键按下

{

ddelay();//延时去抖动

if((P1&0xf8)!

=0xf8)//延时后再判断一次,去除抖动影响

{

scancode=0xfe;

while((scancode&0x08)!

=0)//逐行扫描

{

P1=scancode;//输出行扫描码

if((P1&0xf8)!

=0xf8)//本行有键按下

{

tmpcode=(P1&0xf8)|0x07;

return((~scancode)+(~tmpcode));//返回特征字节码,为1的位即对应于行和列

}

elsescancode=(scancode<<1)|0x01;//行扫描码左移一位

}

}

}

return(0);//无键按下,返回值为0

}

voidmain(void)

{

ucharkey;

count=0;

step_index=0;

spcount=0;

P10=0;

P11=0;

P12=0;

P13=0;

EA=1;//允许CPU中断

TMOD=0x11;//设定时器0和1为16位模式1

ET0=1;//定时器0中断允许

TH0=0xFc;

TL0=0x18;//设定时每隔1ms中断一次

TR0=1;//开始计数

P0=0XFF;

P3&=0XEF;//573片选

LCMInit();//LCM初始化

Delay400Ms();

stop_flag=0;

turn=0;

speedlevel=5;

DisplayListChar(0,0,3,go,1);//每次扫描键盘显示更新一次ucharcodego[]

DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次

while

(1)

{

key=keyscan();

switch(key)

{

case0x09:

//按键#,正转以speedlevel=1的速度转1000*0.5MS=0.5S

stop_flag=0;

turn=0;

speedlevel=5;

gorun();

WriteCommandLCM(0x01,1);//显示清屏,

DisplayListChar(0,0,3,go,0);//每次扫描键盘显示更新一次ucharcodego[]

DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次

delay(1000);

break;

case0x0c:

//按键*,停止2000*0.5MS=0.5S

stop_flag=1;

WriteCommandLCM(0x01,1);//显示清屏,

DisplayListChar(0,0,4,stop,0);//每次扫描键盘显示更新一次

break;

case0x0a:

//按键0,反转以speedlevel=1的速度转1000*0.5MS=0.5S

stop_flag=0;

turn=1;

speedlevel=5;

gorun();

WriteCommandLCM(0x01,1);//显示清屏,

DisplayListChar(0,0,5,back,0);//每次扫描键盘显示更新一次

DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次

delay(1000);

break;

case0x11:

//按键9,以--speedlevel的加速转1000*0.5MS=0.5S

stop_flag=0;

if(speedlevel==2)

{speedlevel=2;}

else{speedlevel--;}

gorun();

if(speedlevel==2)

{DisplayListChar(0,1,5,max,0);}

else{DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次

delay(1000);

break;

case0x12:

//按键8,以++speedlevel的减速转1000*0.5MS=0.5S

stop_flag=0;

speedlevel++;

gorun();

WriteCommandLCM(0x01,1);//显示清屏,

if(turn==0)

{DisplayListChar(0,0,3,go,0);//每次扫描键盘显示更新一次ucharcodego[]

DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次

else{DisplayListChar(0,0,5,back,0);//每次扫描键盘显示更新一次

DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次

delay(1000);

break;

}

}

}

 

//定时器0中断处理

voidtimeint(void)interrupt1

{

TH0=0xFc;

TL0=0x18;//设定时每隔1ms中断一次

count++;

spcount--;

if(spcount<=0)//速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),

{//频率越小,速度越慢

spcount=speedlevel;

gorun();

}

}

voiddelay(unsignedintendcount)//延时函数,延时为endcount*0.5毫秒

{

count=0;

do{}

while(count

}

voidgorun()

{

if(stop_flag==1)

{

P10=0;

P11=0;

P12=0;

P13=0;

return;

}

switch(step_index)

{

case0:

//0

P10=1;

P11=0;

P12=0;

P13=0;

break;

case1:

//0、1

P10=1;

P11=1;

P12=0;

P13=0;

break;

case2:

//1

P10=0;

P11=1;

P12=0;

P13=0;

break;

case3:

//1、2

P10=0;

P11=1;

P12=1;

P13=0;

break;

case4:

//2

P10=0;

P11=0;

P12=1;

P13=0;

break;

case5:

//2、3

P10=0;

P11=0;

P12=1;

P13=1;

break;

case6:

//3

P10=0;

P11=0;

P12=0;

P13=1;

break;

case7:

//3、0

P10=1;

P11=0;

P12=0;

P13=1;

}

if(turn==0)//正转

{

step_index++;

if(step_index>7)

step_index=0;

}

else

{//反转

step_index--;

if(step_index<0)

step_index=7;

}

}

步进电机(自动循环调速)

#include

sbitP00=P2^0;

sbitP01=P2^1;

sbitP02=P2^2;

sbitP03=P2^3;

staticunsignedintcount;//计数

staticintstep_index;//步进索引数,值为0-7

staticbitturn;//步进电机转动方向

staticbitstop_flag;//步进电机停止标志

staticintspeedlevel;//步进电机转速参数,数值越大速度越快,最小值为1,速度最慢

staticintspcount;//步进电机转速参数计数

voiddelay(unsignedintendcount);//延时函数,延时为endcount*0.5毫秒

voidgorun();//步进电机控制步进函数

voidmain(void)

{

count=0;

step_index=0;

spcount=0;

stop_flag=0;

P00=0;

P01=0;

P02=0;

P03=0;

EA=1;//允许CPU中断

TMOD=0x11;//设定时器0和1为16位模式1

ET0=1;//定时器0中断允许

TH0=0xFE;

TL0=0x0C;//设定时每隔0.5ms中断一次

TR0=1;//开始计数

turn=0;

do{

speedlevel=4;

delay(10000);//以speedlevel=4的速度转2000*0.5MS=1S

speedlevel=4;

delay(10000);//以speedlevel=4的速度转2000*0.5MS=1S

stop_flag=1;

delay(6000);//停止,2000*0.5MS=3S

stop_flag=0;

}while

(1);

}

//定时器0中断处理

voidtimeint(void)interrupt1

{

TH0=0xFE;

TL0=0x0C;//设定时每隔0.5ms中断一次

count++;

spcount--;

if(spcount<=0)

{

spcount=speedlevel;

gorun();

}

}

voiddelay(unsignedintendcount)

{

count=0;

do{}while(count

}

voidgorun()

{

if(stop_flag==1)

{

P00=0;

P01=0;

P02=0;

P03=0;

return;

}

switch(step_index)

{

case0:

//0

P00=1;

P01=0;

P02=0;

P03=0;

break;

case1:

//0、1

P00=1;

P01=1;

P02=0;

P03=0;

break;

case2:

//1

P00=0;

P01=1;

P02=0;

P03=0;

break;

case3:

//1、2

P00=0;

P01=1;

P02=1;

P03=0;

break;

case4:

//2

P00=0;

P01=0;

P02=1;

P03=0;

break;

case5:

//2、3

P00=0;

P01=0;

P02=1;

P03=1;

break;

case6:

//3

P00=0;

P01=0;

P02=0;

P03=1;

break;

case7:

//3、0

P00=1;

P01=0;

P02=0;

P03=1;

}

if(turn==0)

{

step_index++;

if(step_index>7)

step_index=0;

}

else

{

step_index--;

if(step_index<0)

step_index=7;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1