#include <REG51.H> /* 包含MCS51寄存器头文件 */ #define uchar unsigned char /* 宏定义 */ #define uint unsigned int /* 宏定义 */ uchar code CW[8]={ 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01,0x09}; /*正时钟旋转相序表*/ uchar code CCW[8]={0x09,0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08}; /*逆时钟旋转相序表*/ uchar speed; /*电机转速调节参数*/ /*****************************函数声明*************************************/ void delay(uint k); /*延时子函数*/ void motor_cw(void); /*电机正转子函数*/ void motor_ccw(void); /*电机反转子函数*/ void motor_acc_cw(void); /*电机加速正转子函数*/ void motor_acc_ccw(void); /*电机加速反转子函数*/ void motor_dec_cw(void); /*电机减速正转子函数*/ void motor_dec_ccw(void); /*电机减速反转子函数*/ uchar scan_key(void); /* 键值扫描子函数 */ void adm_key(void); /* 键值管理子函数 */ void main(void) { delay(200); while(1) { adm_key(); /* 调用键值管理子函数 */ } } void motor_cw(void) /*电机正转子函数*/ { uchar i,keycode; while(1) /*无限循环*/ { keycode= scan_key(); for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CW; delay(5); /*调节转速*/ } if(keycode!=0xfb)break; /*如果有其它按键按下,则跳出while循环*/ } } void motor_ccw(void) /*电机反转子函数*/ { uchar i,keycode; while(1) { keycode= scan_key(); for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CCW; delay(5); /*调节转速*/ } if(keycode!=0xf7)break; /*如果有其它按键按下,则跳出while循环*/ } } void motor_acc_cw(void) /*电机加速正转子函数*/ { uchar i,j,keycode; while(1) { speed=20; while(--speed>5) { for(j=0;j<50;j++) /*控制每速度档的运行时间*/ { for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CW; delay(speed); /*调节转速*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第二层for循环*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第一层while循环*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第二层while循环*/ } } void motor_acc_ccw(void) /*电机加速反转子函数*/ { uchar i,j,keycode; while(1) { speed=20; while(--speed>5) { for(j=0;j<50;j++) { for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CCW; delay(speed); /*调节转速*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第二层for循环*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第一层while循环*/ } keycode= scan_key(); if(keycode!=0xdf)break; /*如果有其它按键按下,则跳出第二层while循环*/ } } void motor_dec_cw(void) /*电机减速正转子函数*/ { uchar i,j,keycode; while(1) { speed=5; while(++speed<20) { for(j=0;j<50;j++) { for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CW; delay(speed); /*调节转速*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第二层for循环*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第一层while循环*/ } keycode= scan_key(); if(keycode!=0xbf)break; /*如果有其它按键按下,则跳出第二层while循环*/ } } void motor_dec_ccw(void) /*电机减速反转子函数*/ { uchar i,j,keycode; while(1) { speed=5; while(++speed<20) { for(j=0;j<50;j++) { for(i=0;i<8;i++) /*旋转0.7度*/ { P2=CCW; delay(speed); /*调节转速*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第二层for循环*/ } keycode=scan_key(); if(keycode!=0xef)break; /*如果有其它按键按下,则跳出第一层while循环*/ } keycode= scan_key(); if(keycode!=0x7f)break; /*如果有其它按键按下,则跳出第二层while循环*/ } } uchar scan_key(void) /* 键值扫描子函数 */ { uchar keycode; P3=0xff; if(P3!=0xff) /* 是否有键按下 */ { delay( 10 ); /* 延时去抖*/ if(P3!=0xff)keycode=P3; /* 确实有键按下,取键值 */ } return keycode; /* 返回键值 */ } void adm_key(void) /* 键值管理子函数 */ { uchar t1,t2,t3,t4,t5,t6,keycode; keycode=scan_key(); /*扫键值*/ switch(keycode) { case 0xfb: /*如果S1按键按下*/ { for(t1=0;t1<112;t1++)P2=0x00; /*停机让电机稳定一下*/ motor_cw(); /*调用正转子函数*/ }break; case 0xf7: /*如果S2按键按下*/ { for(t2=0;t2<112;t2++)P2=0x00; /*停机让电机稳定一下*/ motor_ccw(); /*调用反转子函数*/ } break; case 0xef: /*如果S3按键按下*/ { for(t3=0;t3<112;t3++)P2=0x00; /*停机让电机稳定一下*/ motor_acc_cw(); /*调用加速正转子函数*/ }break; case 0xdf: /*如果S4按键按下*/ { for(t4=0;t4<112;t4++)P2=0x00; /*停机让电机稳定一下*/ motor_acc_ccw(); /*调用加速反转子函数*/ } break; case 0xbf: /*如果S5按键按下*/ { for(t5=0;t5<112;t5++)P2=0x00; /*停机让电机稳定一下*/ motor_dec_cw(); /*调用减速正转子函数*/ }break; case 0x7f: /*如果S6按键按下*/ { for(t6=0;t6<112;t6++)P2=0x00; /*如果S5按键按下*/ motor_dec_ccw(); /*调用减速反转子函数*/ }break; default:break; } } void delay(uint k) /* 定义延时子函数 */ { uint i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++); } }
|