用C语言写单片机驱动步进电机正反转角度程序

下面是一个简单的例子实现步进电机的正反转角度控制:

```c
#include <reg51.h>

#define MOTOR_PORT P1  // 步进电机的控制端口

// 定义正转和反转的步进电机序列
unsigned char forward_seq[4] = {0x01, 0x02, 0x04, 0x08};  
unsigned char backward_seq[4] = {0x08, 0x04, 0x02, 0x01};

// 定义角度转换函数,根据具体步进电机的旋转角度来修改
unsigned char angle_to_step(unsigned int angle)  
{
    return angle / 1.8;  // 以1.8度为单位
}

// 定义正反转函数
void motor_forward(unsigned char step)
{
    unsigned char i, j;
    for (i = 0; i < step; i++) {
        for (j = 0; j < 4; j++) {
            MOTOR_PORT = forward_seq[j];
            delay();  // 延时一段时间使步进电机转动到指定角度
        }
    }
}

void motor_backward(unsigned char step)
{
    unsigned char i, j;
    for (i = 0; i < step; i++) {
        for (j = 0; j < 4; j++) {
            MOTOR_PORT = backward_seq[j];
            delay();  // 延时一段时间使步进电机转动到指定角度
        }
    }
}

// 主函数
int main()
{
    unsigned int angle;  // 角度变量
    unsigned char step;  // 步数变量

    // 初始化步进电机控制端口
    MOTOR_PORT = 0x00;
    
    while (1) {
        // 输入正/反转角度并将角度转换为步数
        angle = input_angle();
        step = angle_to_step(angle);
        
        // 正转指定角度
        motor_forward(step);
        // 停顿一段时间
        delay();
        // 反转回原始位置
        motor_backward(step);
        // 停顿一段时间
        delay();
    }
    
    return 0;
}

// 延时函数,根据具体步进电机的速度和转动角度来调整
void delay()
{
    unsigned int i, j;
    for (i = 0; i < 50; i++) {
        for (j = 0; j < 2000; j++);
    }
}

// 输入角度函数
unsigned int input_angle()
{
    unsigned int angle;
    // 从外部输入角度值
    // ...
    return angle;
}
``` 

需要注意的是,该程序中的输入函数和延时函数需要根据具体的实际情况进行修改,以便更好地适应具体的步进电机和控制方式。同时,步进电机的旋转角度和步数之间的转换也需要根据具体电机型号来进行确定。