运用keil,使用at89c51单片机,实现完整代码,目标:按数字键 1~9,控制电机转过 1~9 圈; 配合上下键改变转动方向,按向上键后正向转 1~9 圈,向下键则反向转 1~9 圈;左键固定 正转 90 度,右键固定反转 90;Esc 键终止转动。 unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表 { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键 { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键 { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键 { 0x30, 0x1B, 0x0D, 0x27 } //数字键0、ESC键、 回车键、 向右键
时间: 2024-03-13 19:43:34 浏览: 74
使用51单片机控制电机转速转向步进角,可以选用按键控制或者手机蓝牙控制,使用12864显示方向转速步进圈数.zip
很好,下面是一个可能的实现代码,供参考:
```
#include <reg52.h>
#define MOTOR_PORT P1 // 电机控制口
#define KEY_PORT P0 // 按键矩阵口
// 定义按键映射表
unsigned char code KeyCodeMap[4][4] = {
{0x31, 0x32, 0x33, 0x26}, // 数字键1、数字键2、数字键3、向上键
{0x34, 0x35, 0x36, 0x25}, // 数字键4、数字键5、数字键6、向左键
{0x37, 0x38, 0x39, 0x28}, // 数字键7、数字键8、数字键9、向下键
{0x30, 0x1B, 0x0D, 0x27} // 数字键0、ESC键、回车键、向右键
};
// 定义电机转动方向
#define CW 0 // 顺时针
#define CCW 1 // 逆时针
// 定义标志位
bit stop_flag = 1; // 是否需要停止转动
// 延时函数
void delay(unsigned int t)
{
while (t--)
;
}
// 电机转动函数
void motor_run(unsigned char speed, unsigned char dir, unsigned char rounds)
{
unsigned char i, j;
for (j = 0; j < rounds; j++)
{
for (i = 0; i < speed; i++)
{
// 顺时针转动
if (dir == CW)
{
MOTOR_PORT = 0x01;
delay(100); // 调整转速
MOTOR_PORT = 0x02;
delay(100);
MOTOR_PORT = 0x04;
delay(100);
MOTOR_PORT = 0x08;
delay(100);
}
// 逆时针转动
else if (dir == CCW)
{
MOTOR_PORT = 0x08;
delay(100);
MOTOR_PORT = 0x04;
delay(100);
MOTOR_PORT = 0x02;
delay(100);
MOTOR_PORT = 0x01;
delay(100);
}
if (stop_flag)
break; // 如果需要停止转动,跳出循环
}
if (stop_flag)
break; // 如果需要停止转动,跳出循环
}
}
// 按键扫描函数
unsigned char key_scan()
{
unsigned char row, col;
KEY_PORT = 0x0F; // 将行线置高
if (KEY_PORT != 0x0F) // 检测到按键按下
{
delay(1000); // 延时去抖动
if (KEY_PORT != 0x0F) // 再次检测
{
col = KEY_PORT & 0x0F; // 获取列线值
KEY_PORT = 0xF0; // 将列线置高
row = KEY_PORT >> 4; // 获取行线值
return KeyCodeMap[row][col]; // 返回键码
}
}
return 0; // 没有检测到按键按下
}
void main()
{
unsigned char key, speed = 9, dir = CW, rounds = 1;
while (1)
{
key = key_scan(); // 检测按键
switch (key)
{
case 0x31:
case 0x32:
case 0x33:
rounds = key - 0x30; // 设置转动圈数
break;
case 0x34:
dir = CCW; // 设置逆时针转动
break;
case 0x35:
dir = CW; // 设置顺时针转动
break;
case 0x36:
rounds = 2; // 设置转动2圈
break;
case 0x37:
speed = 1; // 设置转速为1级
break;
case 0x38:
speed = 5; // 设置转速为5级
break;
case 0x39:
speed = 9; // 设置转速为9级
break;
case 0x26:
dir = CW; // 设置顺时针转动
break;
case 0x25:
dir = CCW; // 设置逆时针转动
break;
case 0x0D:
motor_run(speed, dir, rounds); // 开始转动
break;
case 0x1B:
stop_flag = 1; // 设置停止转动标志位
break;
case 0x27:
motor_run(speed, CW, 4); // 固定正转90度
break;
case 0x30:
motor_run(speed, CCW, 4); // 固定反转90度
break;
default:
break;
}
}
}
```
需要注意的是,该代码并未经过实际测试,可能存在一些问题,需要根据具体情况进行调整和修改。另外,在使用时需要将代码下载到单片机中,然后通过按键来控制电机转动。
阅读全文