ARM课程设计步进电机键盘控制可调速文档格式.docx
《ARM课程设计步进电机键盘控制可调速文档格式.docx》由会员分享,可在线阅读,更多相关《ARM课程设计步进电机键盘控制可调速文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
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();
//延时去抖动
//延时后再判断一次,去除抖动影响
scancode=0xfe;
while((scancode&
0x08)!
=0)
//逐行扫描
P1=scancode;
//输出行扫描码
//本行有键按下
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;
case0x0a:
//按键0,反转以speedlevel=1的速度转1000*0.5MS=0.5S
turn=1;
gorun();
delay(1000);
case0x11:
//按键9,以--speedlevel的加速转1000*0.5MS=0.5S
if(speedlevel==1)
{speedlevel=1;
else{--speedlevel;
case0x12:
//按键8,以++speedlevel的减速转1000*0.5MS=0.5S
++speedlevel;
}
//定时器0中断处理
voidtimeint(void)interrupt1
TH0=0xFc;
TL0=0x18;
count++;
spcount--;
if(spcount<
=0)//速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),
{
//
频率越小,速度越慢
spcount=speedlevel;
voiddelay(unsignedintendcount)//延时函数,延时为endcount*0.5毫秒
count=0;
do{}
while(count<
endcount);
voidgorun()
if(stop_flag==1)
{
P10=0;
return;
switch(step_index)
case0:
//0
P10=1;
break;
case1:
//0、1
P11=1;
case2:
//1
case3:
//1、2
P12=1;
case4:
//2
case5:
//2、3
P13=1;
case6:
//3
case7:
//3、0
if(turn==0)
//正转
step_index++;
if(step_index>
7)
step_index=0;
else
{
//反转
step_index--;
if(step_index<
0)
step_index=7;
步进电机(键盘控制可调速加显示)
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"
P0=0XFF;
P3&
=0XEF;
//573片选
LCMInit();
Delay400Ms();
speedlevel=5;
DisplayListChar(0,0,3,go,1);
//每次扫描键盘显示更新一次ucharcodego[]
DisplayOneChar(0,1,0x35);
//每次扫描键盘显示更新一次
speedlevel=5;
WriteCommandLCM(0x01,1);
//显示清屏,
DisplayListChar(0,0,3,go,0);
DisplayListChar(0,0,4,stop,0);
DisplayListChar(0,0,5,back,0);
if(speedlevel==2)
{speedlevel=2;
else{speedlevel--;
if(speedlevel==2)
{DisplayListChar(0,1,5,max,0);
}
else{DisplayOneChar(0,1,speed[speedlevel]);
}//每次扫描键盘显示更新一次
speedlevel++;
if(turn==0)
{DisplayListChar(0,0,3,go,0);
DisplayOneChar(0,1,speed[speedlevel]);
else{DisplayListChar(0,0,5,back,0);
DisplayOneChar(0,1,speed[speedlevel]);
步进电机(自动循环调速)
sbitP00=P2^0;
sbitP01=P2^1;
sbitP02=P2^2;
sbitP03=P2^3;
//步进电机转速参数,数值越大速度越快,最小值为1,速度最慢
//延时函数,延时为endcount*0.5毫秒
stop_flag=0;
P00=0;
P01=0;
P02=0;
P03=0;
TH0=0xFE;
TL0=0x0C;
//设定时每隔0.5ms中断一次
turn=0;
do{
speedlevel=4;
delay(10000);
//以speedlevel=4的速度转2000*0.5MS=1S
speedlevel=4;
delay(6000);
//停止,2000*0.5MS=3S
stop_flag=0;
}while
(1);
TH0=0xFE;
TL0=0x0C;
spcount--;
=0)
voiddelay(unsignedintendcount)