步进电机控制+普中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单片机+江科大自化协

推荐阅读最新更新时间:2026-03-22 10:56

红外遥控接收模块+51单片机+江科大自化协
1 实验现象   LCD1602上显示红外解码遥控器地址、键值。通过红外遥控器,按下某个按键时,遥控器通过红外发光二极管发射红外线,红外一体化接受头接受信号,并对其解码,单片机处理相应的信息,将得到的数据显示在LCD1602上。 2 实验原理 红外遥控是一种无线、非接触控制技术,具有抗干扰性能力强,信息传输可靠,功耗低、成本低、易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,在工业设备中也得到广泛应用。 什么是红外线?红外线是一种肉眼看不见的光。红外线是波长介于微波和可见光之间的电磁波,波长在760nm和1000nm之间,是波形比红光长的非可见光。 如何发出红外光?红外发射二极管就可以发出红外线。最常用的红外发射管
[单片机]
红外遥控接收模块+<font color='red'>普</font><font color='red'>中</font><font color='red'>51单片机</font>+江科大自化协
51单片机学习笔记:步进电机控制,正转反转等
步进电机应用广泛, 例如打印机、磁盘驱动器、玩具、汽车雨刷、手机震动、机械夹具、刻录机等各种机械控制场合 一些概念: 拍数N 定子控制绕组每改变一次通电方式,即为一拍 一个磁场通电周期是 A-B-C-D-A 完成一个磁场周期性变化所需脉冲数, 也指电机转过一个齿距角所需脉冲数,用N表示 拍数又等于相数的1倍或2倍, 以四相电机为例, 有4相4拍, A-B-C-D-A... 4相8拍, A-AB-B-BC-C-CD-D-DA-A... 齿距角θz 一个通电循环周期(比如4拍)转子转过一个齿距角 齿距角又等于360除以转子齿数Z, θz=360/Z 步距角θs 步距角,即在没有减速齿轮的情况下,对于一个脉冲信号,转子所转过的机械
[单片机]
<font color='red'>51单片机</font>学习笔记:<font color='red'>步进电机控制</font>,正转反转等
51单片机之lcd1602步进电机控制
#include reg51.h //51芯片管脚定义头文件 #include intrins.h //内部包含延时函数 _nop_(); #define uchar unsigned char #define uint unsigned int #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; char code SST516 _at_ 0x003b; uchar code FFW ={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV ={0xf9,0xf8,0xfc,0
[单片机]
解读半导体供应链的全球挑战
本文作者:捷普全球采购副总裁Graham Scott 近年来,半导体行业经历了起起伏伏,既要应对经济放缓,又要应对地缘政治紧张局势导致供应链中断等问题。尽管面临这些挑战,但2025年,在人工智能技术需求激增的推动下,半导体行业仍有望实现增长。 尽管如此,半导体市场仍具有周期性,受经济趋势、新产品发布和技术创新的影响。尽管已恢复到疫情前的水平,但交货时间仍可能随着市场变化而剧烈波动。由于生产和工艺周期长,半导体制造流程仍然冗长。这导致“良品库存”水平低,产能利用率低于最佳水平。虽然分销库存看似稳定,但库存结构显示,不可取消、不可退货 (NCNR) 的零件比例较高,这些零件未来的需求可能不大,这带来了挑战。 贸易争端、地缘
[半导体设计/制造]
8x8LED点阵+单片机++江科大自化协
1 功能: (1)静态显示:显示一个笑脸; (2)动态显示:a,移动显示“HELLO!”,b,显示笑脸哭脸的变化; 2 原理 3 框图 4 硬件原理图 5 软件设计 5.1 静态显示源程序 (1)主函数 #include REGX52.H #include delay100ms.h sbit SER = P3^4; //74HC595的串行数据输入DS sbit RCK = P3^5; //74HC595的移位寄存器SH_CP sbit SCK = P3^6; //74HC595的锁存寄存器ST_CP #define matrixled_col P0 //笑脸的数据,列向取模 unsigned
[单片机]
8x8LED点阵+单片机+<font color='red'>普</font><font color='red'>中</font>+江科大自化协
Ubuntu下sdcc写的一个基于V2单片机数码管头文件
/* 使用此头文件需先包含头文件: #include 8051.h #include base8051.h */ uchar __code smgduan = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; void shumaguan(uchar duan, uchar wei) { switch (duan) { case 1: P2 &= 0xE3; //1110 0011 相当于LSC=0;LSB=0;LSA=0;
[单片机]
数码管显示1314-520(51-单核-A2)
#include reg52.h #include intrins.h typedef unsigned int uint; typedef unsigned char uchar; #define LED P0 sbit tube2=P2^2; sbit tube3=P2^3; sbit tube4=P2^4; uint code num ={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , //高电平控制亮 //显示数字 0x6d , 0x7d , 0x07 , 0x7f , 0x6f }; void delay(uint i); void run(); void main(){ whi
[单片机]
数码管显示1314-520(<font color='red'>普</font><font color='red'>中</font>51-单核-A2)
适计算的定位感知系统
摘要:普适计算的目的是为了使计算机更好地为人类服务,提高人们的生活质量。普适计算中的定位感知系统是普适计算研究中的核心部分之一。如何确定室内用户的动态位置信息,如何主动向用户提供各种所需的信息,都是本文的研究话题。文章最后给出一种自行设计的普适计算室内定位感知系统的最小功能模型。 关键词:普适计算 定位系统 位置系统 定位感知系统 引 言 随着计算机计算能力不断呈指数型的增长以及硬件的微型化,各种计算型的小器件应运而生。由于其重量和体积都足够小,用户能够随身携带,因而被应用在各个领域。 Mark Weiser 在《21世纪的计算机》一文中这样描述:计算机硬件技术的飞速发展以及无线通信技术的不断成熟,造就了新一代普
[嵌入式]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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