1、ARM课程设计步进电机键盘控制可调速步进电机(键盘控制可调速)#include #define uchar unsigned charstatic unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static int speedlevel; /步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; /步进电机转速参数计数void ddelay(void); /键盘扫描延时函数v
2、oid delay(unsigned int endcount); /延时函数,延时为endcount*1毫秒void gorun(); /步进电机控制步进函数sbit P10=P20 ; /电机端口定义sbit P11=P21 ;sbit P12=P22; sbit P13=P23 ;/* 键消抖延时函数 */void ddelay(void)uchar i;for (i=300;i0;i-);/* 键扫描函数*/ uchar keyscan(void)uchar scancode;uchar tmpcode;P1 = 0xf8; / 发全0行扫描码if (P1&0xf8)!=0xf8)/
3、若有键按下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的位即对应于行和列 else scancode = (scancode1)|0x01;/ 行扫描码左移一位return(0);/ 无键按下,返回值为0 void mai
4、n(void) uchar key; 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) case 0x09: /按键
5、#, 正转以speedlevel = 1的速度转1000*0.5MS=0.5Sstop_flag=0; turn = 0; speedlevel =10; gorun(); delay(1000);break;case 0x0c: /按键*, 停止 2000*0.5MS=0.5S stop_flag=1;break; case 0x0a: /按键0, 反转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0; turn=1; speedlevel =10;gorun(); delay(1000);break;case 0x11: / 按键9, 以-spe
6、edlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel=1) speedlevel=1;else -speedlevel;gorun();delay(1000); break;case 0x12:/ 按键8, 以+speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0; +speedlevel;gorun(); delay(1000); break; /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFc; TL0=0x18; /设定时每隔1ms中断一次count+; spc
7、ount-; if(spcount=0) /速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL), /频率越小,速度越慢 spcount = speedlevel; gorun(); void delay(unsigned int endcount)/延时函数,延时为endcount*0.5毫秒 count=0; do while(count7) step_index=0; else /反转 step_index-; if (step_index0) step_index=7; 步进电机(键盘控制可调速加显示)#include #define uchar uns
8、igned charstatic unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static int speedlevel; /步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; /步进电机转速参数计数void ddelay(void); /键盘扫描延时函数void delay(unsigned int endcount); /延时函数,延时为endcount*1毫秒vo
9、id gorun(); /步进电机控制步进函数void Delay400Ms(void);void LCMInit(void); /LCM初始化void WriteCommandLCM(unsigned char WCLCM,BuysC); /BuysC为0时忽略忙检测void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n);sbit P10=P30 ; /电机端口定义sbit P11=P31 ;
10、sbit P12=P32; sbit P13=P33 ;uchar code speed= 0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30;uchar code stop = stop;uchar code go = go:; uchar code back = back:;uchar code max = max:8;/* 键消抖延时函数 */void ddelay(void)uchar i;for (i=300;i0;i-);/* 键扫描函数*/ uchar keyscan(void)uchar scancode;uchar t
11、mpcode;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的位即对应于行和列 else scancode = (scancode1
12、)|0x01;/ 行扫描码左移一位return(0);/ 无键按下,返回值为0 void main(void) uchar key; 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初
13、始化 Delay400Ms();stop_flag = 0; turn=0;speedlevel = 5;DisplayListChar(0,0,3,go,1); /每次扫描键盘显示更新一次uchar code goDisplayOneChar(0,1,0x35); /每次扫描键盘显示更新一次 while(1) key = keyscan(); switch(key) case 0x09: /按键#, 正转以speedlevel = 1的速度转1000*0.5MS=0.5Sstop_flag=0; turn = 0; speedlevel =5; gorun();WriteCommandLCM
14、(0x01,1);/显示清屏,DisplayListChar(0,0,3,go,0); /每次扫描键盘显示更新一次uchar code goDisplayOneChar(0,1,0x35); /每次扫描键盘显示更新一次 delay(1000);break;case 0x0c: /按键*, 停止 2000*0.5MS=0.5S stop_flag=1;WriteCommandLCM(0x01,1);/显示清屏,DisplayListChar(0,0,4,stop,0); /每次扫描键盘显示更新一次break; case 0x0a: /按键0, 反转以speedlevel = 1的速度转1000*
15、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;case 0x11: / 按键9, 以-speedlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel=2) speedlevel=2;else speedlevel-;gorun
16、(); if(speedlevel=2) DisplayListChar(0,1,5,max,0);else DisplayOneChar(0,1, speedspeedlevel); /每次扫描键盘显示更新一次delay(1000); break;case 0x12:/ 按键8, 以+speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0; speedlevel+;gorun();WriteCommandLCM(0x01,1);/显示清屏,if(turn=0)DisplayListChar(0,0,3,go,0); /每次扫描键盘显示更新一次uchar code g
17、oDisplayOneChar(0,1, speedspeedlevel); /每次扫描键盘显示更新一次else DisplayListChar(0,0,5,back,0); /每次扫描键盘显示更新一次 DisplayOneChar(0,1,speedspeedlevel); /每次扫描键盘显示更新一次 delay(1000); break; /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFc; TL0=0x18; /设定时每隔1ms中断一次count+; spcount-; if(spcount=0) /速度调整,SPEEDLEVEL越大,延时
18、越长(延时约为1MS*SPEEDLEVEL), /频率越小,速度越慢 spcount = speedlevel; gorun(); void delay(unsigned int endcount)/延时函数,延时为endcount*0.5毫秒 count=0; do while(count7) step_index=0; else /反转 step_index-; if (step_index0) step_index=7; 步进电机(自动循环调速)#include sbit P00=P20 ;sbit P01=P21 ;sbit P02=P22; sbit P03=P23 ;static
19、unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static int speedlevel; /步进电机转速参数,数值越大速度越快,最小值为1,速度最慢static int spcount; /步进电机转速参数计数void delay(unsigned int endcount); /延时函数,延时为endcount*0.5毫秒void gorun(); /步进电机控制步进函数void main(void) coun
20、t = 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=1Sspeedlevel =4; delay(10000); /以speedlevel = 4的速度转2000*0.5MS=1S stop_flag=1; delay(6000);/停止,2000*0.5MS=3S stop_flag=0; while(1);/定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFE; TL0=0x0C; /设定时每隔0.5ms中断一次count+;spcount-; if(spcount=0) spcount = speedlevel; gorun(); void delay(unsigned int endcount) count=0; do
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1