基于p87lpc768的直流电机控制系统程序
时间: 2023-08-22 16:10:04 浏览: 94
以下是基于 P87LPC768 微控制器的直流电机控制系统的示例程序,包括数码管显示和电机控制部分:
```c
#include <p87lpc768.h> // 包含 P87LPC768 微控制器头文件
// 定义数码管显示所需的位模式
const unsigned char digit_pattern[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
// 定义电机控制所需的 GPIO 引脚
#define MOTOR_CTRL1 P0_0
#define MOTOR_CTRL2 P0_1
#define MOTOR_CTRL3 P0_2
#define MOTOR_CTRL4 P0_3
// 定义控制电机速度的定时器
#define MOTOR_TIMER T0
// 定义定时器的计数器值
#define TIMER_COUNT 50000
// 定义 PWM 周期和占空比
#define PWM_PERIOD 100
#define PWM_DUTY_CYCLE 75
// 定义电机方向
#define MOTOR_FORWARD 0
#define MOTOR_BACKWARD 1
// 定义函数原型
void display_digit(unsigned char digit);
void motor_control(unsigned char speed, unsigned char direction);
// 主函数
void main(void)
{
// 初始化定时器
MOTOR_TIMER = 0;
TMOD = 0x01; // 定时器0工作在模式1下
TH0 = TIMER_COUNT / 256;
TL0 = TIMER_COUNT % 256;
TR0 = 1;
// 初始化 GPIO 引脚
MOTOR_CTRL1 = 0;
MOTOR_CTRL2 = 0;
MOTOR_CTRL3 = 0;
MOTOR_CTRL4 = 0;
// 循环显示数字和控制电机
while(1)
{
// 数码管显示数字
display_digit(5);
// 控制电机,正转,速度为 PWM_DUTY_CYCLE,方向为 MOTOR_FORWARD
motor_control(PWM_DUTY_CYCLE, MOTOR_FORWARD);
}
}
// 数码管显示函数
void display_digit(unsigned char digit)
{
unsigned char pattern;
// 将数字转换为位模式
pattern = digit_pattern[digit];
// 将位模式输出到数码管
P2 = pattern;
}
// 电机控制函数
void motor_control(unsigned char speed, unsigned char direction)
{
// 根据方向控制 GPIO 引脚
if(direction == MOTOR_FORWARD)
{
MOTOR_CTRL1 = 1;
MOTOR_CTRL2 = 0;
MOTOR_CTRL3 = 1;
MOTOR_CTRL4 = 0;
}
else
{
MOTOR_CTRL1 = 0;
MOTOR_CTRL2 = 1;
MOTOR_CTRL3 = 0;
MOTOR_CTRL4 = 1;
}
// 设置 PWM 周期和占空比
MOTOR_TIMER = 0;
TH0 = (65536 - PWM_PERIOD) / 256;
TL0 = (65536 - PWM_PERIOD) % 256;
if(speed > 100)
{
speed = 100;
}
CCAP0H = (unsigned char)(PWM_PERIOD * speed / 100);
CCAP0L = 0;
// 等待定时器计数完成
while(!TF0);
TF0 = 0;
}
```
请注意,此程序仅为示例,可能需要根据具体的电路和应用程序进行修改和优化。建议您参考微控制器的数据手册和其他相关资料,以确保编写出正确的程序。
阅读全文