标题: 这是的按键控制程序 现在需要改成独立按键控制电机45° 90°180°正转的程序 求教 [打印本页]
作者: ysc520cyy 时间: 2015-4-24 11:16
标题: 这是的按键控制程序 现在需要改成独立按键控制电机45° 90°180°正转的程序 求教
#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++);
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |