• 51单片机学习:步进电机实验


    实验名称:步进电机实验
    接线说明:    
    实验现象:下载程序后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;
              当按下KEY3键,电机减速
    注意事项:将步进电机红色线对接到“步进电机模块”输出端子J47的5V上,其它相序依次接入。                                                                                  
    ***************************************************************************************/
    #include "reg52.h"

    typedef unsigned int u16;    //对系统默认数据类型进行重定义
    typedef unsigned char u8;

    //定义ULN2003控制步进电机管脚
    sbit IN1_A=P1^0;
    sbit IN2_B=P1^1;
    sbit IN3_C=P1^2;
    sbit IN4_D=P1^3;

    //定义独立按键控制脚
    sbit KEY1=P3^1;
    sbit KEY2=P3^0;
    sbit KEY3=P3^2;
    sbit KEY4=P3^3;

    //使用宏定义独立按键按下的键值
    #define KEY1_PRESS    1
    #define KEY2_PRESS    2
    #define KEY3_PRESS    3
    #define KEY4_PRESS    4
    #define KEY_UNPRESS    0

    // 定义步进电机速度,值越小,速度越快
    // 最小不能小于1
    #define STEPMOTOR_MAXSPEED        1  
    #define STEPMOTOR_MINSPEED        5      


    /*******************************************************************************
    * 函 数 名       : delay_10us
    * 函数功能         : 延时函数,ten_us=1时,大约延时10us
    * 输    入       : ten_us
    * 输    出         : 无
    *******************************************************************************/
    void delay_10us(u16 ten_us)
    {
        while(ten_us--);    
    }

    /*******************************************************************************
    * 函 数 名       : delay_ms
    * 函数功能         : ms延时函数,ms=1时,大约延时1ms
    * 输    入       : ten_us
    * 输    出         : 无
    *******************************************************************************/
    void delay_ms(u16 ms)
    {
        u16 i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
    }

    /*******************************************************************************
    * 函 数 名       : step_motor_28BYJ48_send_pulse
    * 函数功能         : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
    * 输    入       : step:指定步进序号,可选值0~7
                       dir:方向选择,1:顺时针,0:逆时针
    * 输    出         : 无
    *******************************************************************************/
    void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
    {
        u8 temp=step;
        
        if(dir==0)    //如果为逆时针旋转
            temp=7-step;//调换节拍信号
        switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
        {
            case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
            case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
            case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
            case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
            case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
            case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
            case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
            case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
            default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序    
        }            
    }

    /*******************************************************************************
    * 函 数 名       : key_scan
    * 函数功能         : 检测独立按键是否按下,按下则返回对应键值
    * 输    入       : mode=0:单次扫描按键
                       mode=1:连续扫描按键
    * 输    出         : KEY1_PRESS:K1按下
                       KEY2_PRESS:K2按下
                       KEY3_PRESS:K3按下
                       KEY4_PRESS:K4按下
                       KEY_UNPRESS:未有按键按下
    *******************************************************************************/
    u8 key_scan(u8 mode)
    {
        static u8 key=1;

        if(mode)key=1;//连续扫描按键
        if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
        {
            delay_10us(1000);//消抖
            key=0;
            if(KEY1==0)
                return KEY1_PRESS;
            else if(KEY2==0)
                return KEY2_PRESS;
            else if(KEY3==0)
                return KEY3_PRESS;
            else if(KEY4==0)
                return KEY4_PRESS;    
        }
        else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)    //无按键按下
        {
            key=1;            
        }
        return KEY_UNPRESS;        
    }

    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能         : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {    
        u8 key=0;
        u8 dir=0;//默认逆时针方向
        u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
        u8 step=0;

        while(1)
        {            
            key=key_scan(0);
            if(key==KEY1_PRESS)//换向
            {
                dir=!dir;    
            }
            else if(key==KEY2_PRESS)//加速
            {
                if(speed>STEPMOTOR_MAXSPEED)
                    speed-=1;            
            }
            else if(key==KEY3_PRESS)//减速
            {
                if(speed                 speed+=1;            
            }
            step_motor_28BYJ48_send_pulse(step++,dir);
            if(step==8)step=0;        
            delay_ms(speed);                        
        }        
    }

    单片机学习资料放在纷传小程序里了,需要的可以加入圈子有资料百度网盘下载地址及提取码。

    纷传

  • 相关阅读:
    零基础学Python之循环语句的使用(手把手带你做牛客网python代码练习题)
    Java抽象类与接口
    CodeBERT理解
    centos 利用selenium抓包
    【100天精通Python】Day67:Python可视化_Matplotlib 绘制动画,2D、3D 动画 示例+代码
    Golang指针隐式间接引用
    Spring Boot报错 org.springframework.jdbc.BadSqlGrammarException
    List集合拆分为多个List
    找斑点(blob)的最小旋转矩形(三)
    MybatisPlus rewriteBatchedStatements=true 批量插入失效,依然是单条插入问题解决
  • 原文地址:https://blog.csdn.net/qq_63964231/article/details/126907832