1、步进电机键盘控制可调速步进电机(键盘控制可调速)1.2.3转载专业文档 2008-04-04 22:52:35 阅读779 评论0 字号:大中小 步进电机(键盘控制可调速)#include #define uchar unsigned charstatic unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static int speedlevel; /步进电机转速参数,数值越大速度越大,最小值为1,速度最慢stati
2、c int spcount; /步进电机转速参数计数void ddelay(void); /键盘扫描延时函数void 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 sca
3、ncode; uchar tmpcode; 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的位即对应
4、于行和列 else scancode = (scancode1)|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; /开始计数 stop_
5、flag = 0; turn=0; speedlevel = 20; while(1) key = keyscan(); switch(key) case 0x09: /按键#, 正转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_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=
6、0.5S stop_flag=0; turn=1; speedlevel =10; gorun(); delay(1000); break; case 0x11: / 按键9, 以-speedlevel的加速转1000*0.5MS=0.5S stop_flag=0; if (speedlevel=1) speedlevel=1; else -speedlevel; gorun(); delay(1000); break; case 0x12: / 按键8, 以+speedlevel的减速转1000*0.5MS=0.5S stop_flag=0; +speedlevel; gorun(); de
7、lay(1000); break; /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFc; TL0=0x18; /设定时每隔1ms中断一次 count+; spcount-; if(spcount=0) /速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL), / 频率越小,速度越慢 spcount = speedlevel; gorun(); void delay(unsigned int endcount)/延时函数,延时为endcount*0.5毫秒 count=0; do while(count7) step
8、_index=0; else /反转 step_index-; if (step_index0) step_index=7; 步进电机(键盘控制可调速加显示) #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
9、spcount; /步进电机转速参数计数void ddelay(void); /键盘扫描延时函数void delay(unsigned int endcount); /延时函数,延时为endcount*1毫秒void 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 Dis
10、playListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n); sbit P10=P30 ; /电机端口定义 sbit P11=P31 ; 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 = m
11、ax:8;/* 键消抖延时函数 */void ddelay(void) uchar i; for (i=300;i0;i-);/* 键扫描函数*/ uchar keyscan(void) uchar scancode; uchar tmpcode; P1 = 0xf8; / 发全0行扫描码 if (P1&0xf8)!=0xf8) / 若有键按下 ddelay(); / 延时去抖动 if (P1&0xf8)!=0xf8) / 延时后再判断一次,去除抖动影响 scancode = 0xfe; while(scancode&0x08)!=0) / 逐行扫描 P1 = scancode; / 输出行扫
12、描码 if (P1&0xf8)!=0xf8) / 本行有键按下 tmpcode = (P1&0xf8)|0x07; return(scancode)+(tmpcode); / 返回特征字节码,为1的位即对应于行和列 else scancode = (scancode1)|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中断 TMO
13、D = 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); /每次扫描键盘显示更新一次uchar code go DisplayOneChar(0,1,0x35); /每次扫描键盘显示更新一次 while(1
14、) key = keyscan(); switch(key) case 0x09: /按键#, 正转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0; turn = 0; speedlevel =5; gorun(); WriteCommandLCM(0x01,1);/显示清屏, DisplayListChar(0,0,3,go,0); /每次扫描键盘显示更新一次uchar code go DisplayOneChar(0,1,0x35); /每次扫描键盘显示更新一次 delay(1000); break; case 0x0c: /按键*, 停止 2
15、000*0.5MS=0.5S stop_flag=1; WriteCommandLCM(0x01,1);/显示清屏, DisplayListChar(0,0,4,stop,0); /每次扫描键盘显示更新一次 break; case 0x0a: /按键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
16、(0,1,0x35); /每次扫描键盘显示更新一次 delay(1000); break; case 0x11: / 按键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, speedspeedlevel); /每次扫描键盘显示更新一次 delay(1000); break; case 0x1
17、2: / 按键8, 以+speedlevel的减速转1000*0.5MS=0.5S stop_flag=0; speedlevel+; gorun(); WriteCommandLCM(0x01,1);/显示清屏, if(turn=0) DisplayListChar(0,0,3,go,0); /每次扫描键盘显示更新一次uchar code go DisplayOneChar(0,1, speedspeedlevel); /每次扫描键盘显示更新一次 else DisplayListChar(0,0,5,back,0); /每次扫描键盘显示更新一次 DisplayOneChar(0,1,spee
18、dspeedlevel); /每次扫描键盘显示更新一次 delay(1000); break; /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFc; TL0=0x18; /设定时每隔1ms中断一次 count+; spcount-; if(spcount=0) /速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL), / 频率越小,速度越慢 spcount = speedlevel; gorun(); void delay(unsigned int endcount)/延时函数,延时为endcount*0.5毫秒
19、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 unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static
20、 int speedlevel; /步进电机转速参数,数值越大速度越快,最小值为1,速度最慢static int spcount; /步进电机转速参数计数void delay(unsigned int endcount); /延时函数,延时为endcount*0.5毫秒void gorun(); /步进电机控制步进函数void main(void) count = 0; step_index = 0; spcount = 0; stop_flag = 0; P00 = 0; P01 = 0; P02 = 0; P03 = 0; EA = 1; /允许CPU中断 TMOD = 0x11; /设定
21、时器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中断处理 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; dowhile(count7) step_index=0; else step_index-; if (step_index0) step_index=7;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1