步进电机控制+普中51单片机+普中官方

发布者:Heavenly999最新更新时间:2024-08-08 来源: cnblogs关键字:步进电机控制  普中  51单片机 手机看文章 扫描二维码
随时随地手机看文章

1 实验现象

通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速(5档);当按下KEY3键,电机减速(5档);同时将电机转速档位显示在数码管上。

2 实验原理

(1)步进电机必须加驱动才可以运转,驱动信号必须为脉冲信号,没有脉冲的时候,步进电机禁止,加入适当的脉冲信号,就会以一定的角度(成为步角)转动。转动的速度和脉冲的频率成正比。

(2)步进电机具有瞬间启动和急速停止的优越特性;

(3)改变脉冲的顺序,可以方便的改变转动的方向。


3 系统框图

 

4 硬件设计

见《普中-2&普中-3&普中-4开发板原理图》:独立按键模块、单片机核心、动态数码管模块(包含74HC138)、五线四相步进电机模块。


5 软件设计

5.1 主函数

#include

#include 'key.h'

#include 'delayms.h'

#include 'Nixie.h'

#include 'stepmotor.h'


// 定义步进电机速度,值越小,速度越快

#define MAX 1         //延时时间,脉冲周期

#define MIN 5        //延时时间,脉冲周期


unsigned char key_num=0;

unsigned char dir=0;    //默认逆时针方向

unsigned char step=0;

unsigned char speed=5;


void main()

{

    while(1)

    {

        key_num=key();

        if(key_num==1)                //换向

        {

            dir=!dir;

        }

        else if(key_num==2)            //加速,延时speed越小,速度越快

        {

            if(speed>MAX) speed-=1;

        }

        else if(key_num==3)            //减速,延时speed越大,速度越慢

        {

            if(speed        }

        Nixie(1,6-speed);            //显示数值越大,转速越快

        stepmotor_send_pulse(step++,dir);    

        if(step>8) step=0;

        delayms(speed);

    }

}


5.2 步进电机控制函数


#include


//定义ULN2003控制步进电机管脚

sbit IN_D=P1^0;

sbit IN_C=P1^1;

sbit IN_B=P1^2;

sbit IN_A=P1^3;


/**

  * @brief   输出一个数据给ULN2003从而实现向步进电机发送一个脉冲

  * @param   step 指定步进序号,可选值0~7

  * @param   dir:方向选择,1:顺时针,0:逆时针

  * @retval  无

  */

void stepmotor_send_pulse(unsigned char step,dir)

{

    unsigned char temp;

    if(dir==0) temp=7-step;    //如果为逆时针旋转,调换节拍信号

    else temp=step;

    switch(temp)    //8个节拍控制:A->AB->B->BC->C->CD->D->DA

    {

        case 0: IN_A=0;IN_B=0;IN_C=0;IN_D=1;break;

        case 1: IN_A=0;IN_B=0;IN_C=1;IN_D=1;break;

        case 2: IN_A=0;IN_B=0;IN_C=1;IN_D=0;break;

        case 3: IN_A=0;IN_B=1;IN_C=1;IN_D=0;break;

                    

        case 4: IN_A=0;IN_B=1;IN_C=0;IN_D=0;break;

        case 5: IN_A=1;IN_B=1;IN_C=0;IN_D=0;break;

        case 6: IN_A=1;IN_B=0;IN_C=0;IN_D=0;break;

        case 7: IN_A=1;IN_B=0;IN_C=0;IN_D=1;break;

        default:IN_A=0;IN_B=0;IN_C=0;IN_D=0;break;//停止相序    

    }

}


#ifndef _stepmotor_h_

#define _stepmotor_h_


void stepmotor_send_pulse(unsigned char step,dir);


#endif


5.3 按键扫描函数


#include

#include 'delayms.h'


sbit key1 = P3^1;

sbit key2 = P3^0;

sbit key3 = P3^2;

sbit key4 = P3^3;


/**

  * @brief  获取独立按键键码

  * @param  无

  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0

  */


unsigned char key()

{

    unsigned char KeyNumber = 0;

    if(key1==0){delayms(20);while(key1==0);delayms(20);KeyNumber=1;}

    if(key2==0){delayms(20);while(key2==0);delayms(20);KeyNumber=2;}

    if(key3==0){delayms(20);while(key3==0);delayms(20);KeyNumber=3;}

    if(key4==0){delayms(20);while(key4==0);delayms(20);KeyNumber=4;}

    return KeyNumber;

}


#ifndef _key_h_

#define _key_h_


unsigned char key();


#endif


5.4 数码管驱动函数


#include

#include 'delayms.h'


sbit HC138_A=P2^2;

sbit HC138_B=P2^3;

sbit HC138_C=P2^4;


//数码管段码表,0-9

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};


/**

  * @brief  数码管显示

  * @param  Location 要显示的位置,范围:1~8

  * @param  Number 要显示的数字,范围:段码表索引范围

  * @retval 无

  */

void Nixie(unsigned char Location,Number)

{

    switch(Location)        //位码输出

    {

        case 1:HC138_C=1;HC138_B=1;HC138_A=1;break;

        case 2:HC138_C=1;HC138_B=1;HC138_A=0;break;

        case 3:HC138_C=1;HC138_B=0;HC138_A=1;break;

        case 4:HC138_C=1;HC138_B=0;HC138_A=0;break;

        case 5:HC138_C=0;HC138_B=1;HC138_A=1;break;

        case 6:HC138_C=0;HC138_B=1;HC138_A=0;break;

        case 7:HC138_C=0;HC138_B=0;HC138_A=1;break;

        case 8:HC138_C=0;HC138_B=0;HC138_A=0;break;

    }

    P0=NixieTable[Number];    //段码输出

    delayms(1);                //显示一段时间

    P0=0x00;                //段码清0,消影

}


#ifndef __NIXIE_H__

#define __NIXIE_H__


void Nixie(unsigned char Location,Number);


#endif


5.5 延时函数


#include


void delayms(unsigned int xms)        //@11.0592MHz

{

    unsigned char i, j;


    while(xms--)

    {

        _nop_();

        i = 2;

        j = 199;

        do

        {

            while (--j);

        } while (--i);    

    }

}


#ifndef _delayms_h_

#define _delayms_h_


delayms(unsigned int xms);

    

#endif


关键字:步进电机控制  普中  51单片机 引用地址:步进电机控制+普中51单片机+普中官方

上一篇:红外遥控接收模块+普中51单片机+江科大自化协
下一篇:直流电机控制(PWM)+普中51单片机+江科大自化协

推荐阅读最新更新时间:2024-11-13 08:12

基于51单片机的串口通信(PC发字符)
串口通信 选用芯片:AT89S52 函数功能:见如下代码。 /******************************************************************* 函数功能:PC机发送数据给单片机,每次发送3个字节(每字节为8位)的数据, 每个字节的内容为0~99无符号整数中的一个;单片机接收PC机串口发送过来的 这3个字节数据,并将它们依次以十进制方式显示在6位数码管中(每两个数码管 显示一个字节数据,例如发送数据为11,9,70,则数码管上显示11 09 70); 显示采用共阳极数码管,采用动态扫描显示方式。 作者:Crazy Wind 日期:2020.10.22 version:1
[单片机]
51单片机汇编中断程序
首先,介绍一下51单片机的定时计数器,51有两个定时计数器,分别为T0,T1,基本一样,;有一点不同,下面我们介绍定时计数器T0 ;了解8051的timer0中断的程序写法,用中断法产生定时 ;上面显示的是proteus仿真图,下面的是源程序 ;说明:(源程序中的中断入口地址很重要(这个是固定的),程序中断时,会在对应中断固定的 ;入口地址进入,因为规定的相隔入口间的空进有限,只能用跳转指令跳转,最终用RETI强制返回 ;这个程序把所有的中断入口地址都写上了,没有用到的,用RETI直接屏蔽) ;运行结果是使led灯明一下,暗一下。 COUNT EQU 9217;对于11.0592的晶振来说,延时10ms LED EQ
[单片机]
51单片机上拉电阻的作用
上拉电阻的作用: (1) 用于为OC和OD门电路,提供驱动能力。 以OC(集电极开路)电路为例: 例如,达林顿管(其实就是复合三级管)集成块ULN2003. 内部一路的电路如图,就是一个集电极开路电路。 如果不加上拉电阻是无法高电平驱动其他器件的。因为当三极管截至市没有电流流通的路径,更谈不上驱动了。这个跟单片机P0口加上拉电阻的原理一样。 (2)提高高电平电位: 单片机P1口外接4 4矩阵键盘。另外复用P1.0~P1.3外接ULN2003控制驱动步进电机。 实验中遇到的问题:当接入ULN2003时键盘无法工作,去掉ULN2003后键盘工作正常。ULN2003工作正常。(注,两个部分不同时工作) 问题分析
[单片机]
<font color='red'>51单片机</font>上拉电阻的作用
基于51单片机的智能路灯控制器设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示屏+ADC0832+按键+小灯。 本次设计的智能路灯控制系统以AT89C51单片机为控制核心,使用LCD1602显示屏显示ADC采集回来的光照强度的数字电压信号,系统程序内设置光照强度阈值,在默认状态下为自动模式,此时调节电位器就能实现光照强度的调节,按下自动按键就会切换到手动模式,此时按下手动开和手动关按键就能控制小灯的亮灭 二.仿真概述 1.使用LCD1602显示光照强度电压信号值。 2.按键切换手动和自动模式,按下手动开和手动关按键就能直接控制小灯的亮灭。 3.调节电位器来模拟光照强度的变化。 三.程序设计 使用Keil 51进行程序设
[单片机]
基于<font color='red'>51单片机</font>的智能路灯控制器设计
MCS-51单片机汇编语言学习笔记
ACC 与 A 的区别 通俗的解释为:ACC是地址为E0H的寄存器,A是标准的无地址的累加器 当其要进行位表示时,必须用ACC,比如要写成ACC.7,而不能写成A.7;但当其作为8位二进制数时,ACC和A都能用,但还是有区别:比如 INC ACC和INC A 都能用,还有PUSH ACC,POP ACC不可以写成PUSH A和POP A //a 0时 Y = a - b //a 0时 Y = a + b //把结果Y放到 累加器20H单元 ORG 1000H START: MOV A, # a //立即数a送到累加器中 MOV B, # b //立即数b送到寄存器B中
[单片机]
学习笔记之-51单片机定时计数器
一、单片机的时序 单片机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的。由于指令的字节数不同,取这些指令所需要的时间也就不同,即使是字节数相同的指令,由于执行操作有较大的差别,不同的指令执行时间也不一定相同,即所需的拍节数不同。 时钟周期:时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。 机器周期:在计算机中,为了便于管理,常把一条指令的
[单片机]
学习笔记之-<font color='red'>51单片机</font>定时计数器
80c51单片机的控制总线信号有哪些 80c51单片机特点
  80c51单片机的控制总线信号有哪些   80C51单片机的控制总线信号包括以下几种:   ALE(Address Latch Enable)地址锁存使能信号:当CPU向外部总线发出地址时,ALE信号会使地址锁存器(Latch)中的地址保持稳定,供外设使用。   PSEN(Program Store Enable)程序存储器使能信号:当CPU要从程序存储器中读取指令时,PSEN信号会使程序存储器选择器(Program Memory Selector)选择程序存储器。   RD(Read)读信号:当CPU从外部读取数据时,RD信号会通知外设将数据准备好。   WR(Write)写信号:当CPU向外部写入数据时,WR信号会通知外设
[单片机]
基于51单片机的霍尔自行车里程测速仪
一.硬件方案 以 51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 数码管实时显示自行车的里程数及速度。利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。 主要由51单片机+最小系统+霍尔传感器+数码管+三极管+lm393+LED指示灯模块+按键;如图: 二.设计功能 (1)51单片机作为控制核心,驱动显示模块,驱动按键模块等,并利用霍尔传感器与磁铁获取脉冲信号。 (2)4位共阳数码管为速度,距离显示模块,速度单位为 km/h,距离单位是 km。 (3)设有一个按键来切换显示速度和距离。 三.设计原理图 原理图主要采用AD软件进行设计,如图:
[单片机]
基于<font color='red'>51单片机</font>的霍尔自行车里程测速仪
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved