利用单片机+ULN2001A对步进电机进行调速控制并显示

发布者:EuphoricMelody最新更新时间:2020-08-26 来源: 51hei关键字:单片机  ULN2001A  步进电机  调速控制 手机看文章 扫描二维码
随时随地手机看文章

设计包含PROTEUS仿真电路图和程序代码。设计能实现步进电机的启停控制,加减档调速并显示当前档位和速度。

/***步进电机调速实验***/

/***实验内容:通过程序能够实现电机的启停,正反转,加减速。同时显示电机当前档位和速度。***/


#include


#define uchar unsigned char

#define uint unsigned int


void Delay_ms(uint x);//延时函数

void Key_pros(); //声明按键函数

void MotorControl_fwd();//声明电机控制函数

void MotorControl_bwd();

void Dig_display();//4位数码管显示函数

void Data_pros(uint temp);//速度处理显示


uchar code  Motor_fwd[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //正转动数组

uchar code  Motor_bwd[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反转动数组

uchar code  segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴显示段码,用于共阳数码管取反。

uchar V_pros[4];

uchar count=5; //初始挡位5档

uint loop=50,j; //初始速度50ms一步,通过改变loop调整调整脉冲频率达到调速的目的

uchar flag=1;  //正反转标志位 1正0反

uchar state=1; //启停标志位 1启动0关闭


sbit Motor_Dcl=P1^2; //电机减速

sbit Motor_Acl=P1^1; //电机加速

sbit Motor_Bwd=P1^4; //电机反转

sbit Motor_Fwd=P1^3; //电机正转

sbit Motor_Control=P1^0; //电机启停

sbit LSA=P2^0;

sbit LSB=P2^1;

sbit LSC=P2^2;


void main()

{

while(1)

  {

                uint speed;

          Key_pros();  

          while(state==1)

                {

                 if(flag==1)

                 {

                         MotorControl_fwd();

                         P2=~segcode[count];

                         Key_pros();

                 }

                 if(flag==0)

                 {

                  MotorControl_bwd();

                  Key_pros();

                        P2=~segcode[count];

                 }

         switch(loop)

          {

           case 10:speed=1900;break;

           case 20:speed=1800;break;

           case 30:speed=1700;break;

           case 40:speed=1600;break;

           case 50:speed=1500;break;

           case 60:speed=1400;break;

           case 70:speed=1300;break;

           case 80:speed=1200;break;

           case 90:speed=1100;break;

           default:break;

          }

                Data_pros(speed);

                Dig_display();

   }

  }

}

/***

    函数名: Delay()

    函数功能:延时函数

    输入:j

    输出:无

***/

void Delay_ms(uint x)

{

       

        uint i,j;

        for(i=0;i                for(j=0;j<112;j++);

}

/*******************************************************************************

* 函 数 名         : delay

* 函数功能                   : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(uint i)

{

        while(i--);       

}


/***

    函数名: MotorControl_fwd()

    函数功能: 电机正转函数

    输入:无

    输出:无

***/


void MotorControl_fwd()

{

uchar z;

for(z=0;z<8;z++)

        {

         P3=Motor_fwd[z];

         Delay_ms(loop);       

        }

}       


/***

    函数名: MotorControl_bwd()

    函数功能: 电机反转函数

    输入:无

    输出:无

***/


void MotorControl_bwd()

{

uchar z;

for(z=0;z<8;z++)

        {

         P3=Motor_bwd[z];

         Delay_ms(loop);

        }

}


/***

    函数名:void Key_pros()

    函数功能: 电机反转函数

    输入:

    输出:

***/

void Key_pros()

{

  P1=0xff;           

        if(P1!=0xff)

        Delay_ms(10);

        if(P1!=0xff)

        {

                switch(P1)        

                {

                        case 0xfe:state=~state;break;

                        case 0xfd:loop-=10;count++;break;

                        case 0xfb:loop+=10;count--;break;

                        case 0xf7:flag=1;break;

                        case 0xef:flag=0;break;

                }

                if(loop<10)  //超速保护,最快10ms一步

                {

                        count=9;loop=10;

                }

                else if(loop>90) //最低转速限制90ms一步

                {

                        count=1;loop=90;

                }

        }

        while(P1!=0xff);        //等待按键释放


}       


/***

    函数名:  VDisplay_pros();

    函数功能: 速度处理显示

    输入:speed

    输出:无

***/


void Data_pros(uint temp)

{

        V_pros[0]=segcode[temp/1000];

        V_pros[1]=segcode[temp%1000/100];

  V_pros[2]=segcode[temp%100/10];

        V_pros[3]=segcode[temp%10];

}


/***

    函数名:void Dig_display()

    函数功能: 4位数码管显示函数

    输入:无

    输出:无

***/

void Dig_display()

{

        uint i;

        for(i=0;i<4;i++)

        {

                switch(i)         //位选,选择点亮的数码管,

                {

                        case(0):

                                LSA=0;LSB=0;LSC=0; break;//显示第0位

                        case(1):

                                LSA=1;LSB=0;LSC=0; break;//显示第1位

                        case(2):

                                LSA=0;LSB=1;LSC=0; break;//显示第2位

                        case(3):

                                LSA=0;LSB=1;LSC=1; break;//显示第3位

                }

                P0=~V_pros[i];//发送段码

                delay(100); //间隔一段时间扫描       

                P0=0x00;//消隐

        }

}


关键字:单片机  ULN2001A  步进电机  调速控制 引用地址:利用单片机+ULN2001A对步进电机进行调速控制并显示

上一篇:51单片机控制12864液晶显示屏显示图片
下一篇:数码管动态扫描显示01234567显示

推荐阅读最新更新时间:2024-11-13 04:03

【51单片机学习过程记录】7 中断之 定时计数器0 操作前理解
声明:【51单片机学习过程记录】全是我自己学习、实践所记录的过程,我只是菜鸟,所有论点和观点仅代表我个人,不能确定是这个技术的真理。我的目的是学习和有可能成为可以向别人分享的经验,因此有错误我会虚心接受,并认真改正。 1 由数据手册可知,89c52rc单片机有六个中断,分别为 外部中断0 外部中断1定时计数器0 定时计数器1定时计数器2 以及串口中断,一共六个。 2 如何理解继而操作定时器0? A大概了解:定时器,其实就是单片机的机器周期计数器,工作原理就是 当给计数器设定初始值并开启后,定时计数器会自动计算,到达设定的时间后会产生中断。(当然,更详细还是需要专门查看定时计数器去深入了解) B操作:需要参考另外一个
[单片机]
【51<font color='red'>单片机</font>学习过程记录】7 中断之 定时计数器0 操作前理解
关于Msp430 Flash型单片机内部Flash的操作
1 Msp430Flash型单片机内部Flash存储器介绍 MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。 Msp430的Flash存储器的特点有: 1)产生内部编程电压 2)可位、字节、字编程,可以单个操作,也可以连续多个操作 3)超低功耗操作 4)支持段擦除和多段模块擦除 2 Flash存储器的分割 Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。 Flash 存储器被分割成两部分:主存储器和
[单片机]
普通8位单片机和STM32单片机复位电路区别
普通8位单片机,如AT、STC等芯片厂商,单片机须使用高电平复位,复位后保持低电平 STM32单片机,使用低电平进行复位,NRST复位引脚在一般情况需保持高电平电路才能正常工作。 另外单片机上电时间是有要求的,所以因根据数据手册匹配指定的RC复位电路。
[单片机]
STM8S单片机入门3(AD转换及锂电池管理)
锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于3V等,所以用锂电池供电的系统一般都需要专门的锂电池管理功能,确保锂电池在正确的工作状态下。 这部分内容以讲述在STM8S单片机系统中,如何使用典型的锂电池充电管理芯片TP4056来实现锂电池的充电,以及如何使用单片机内置的AD转换功能测量电池电压,实现电池电量监控。 1、电路设计 电路图如下,使用TP4056做充电管理,TP4056是一款采用恒定电流/恒定电压线性锂电池充电管理IC,电路简单,只需要外接一个编程电容即可实现恒流恒压充电,
[单片机]
STM8S<font color='red'>单片机</font>入门3(AD转换及锂电池管理)
中国MCU市场有望于2013年复苏
据IHS公司的一份中国研究专题报告,继2012年萎缩之后,随着能效要求与设备升级推动嵌入及自动应用对于 MCU芯片 的需求增长,中国微控制器(MCU)市场今年有望回升。 今年中国MCU市场的营业收入预计达到31亿美元,比2012年的29亿美元增长7.7%。去年该市场收缩2.6%,但从2013年开始至少会连续五年保持增长,预计2017年达到45亿美元。 去年中国MCU市场下滑主要是受全球经济形势低迷以及中国实施紧缩的货币政策所致。中国政府随后在第三季度放宽了限制,而且中国的MCU等产品出口市场开始缓慢复苏。 今年,中国MCU市场获得新的动力,在嵌入应用及自动控制产品及设备领域的销售再度快速增长,包括消费与工业电器、汽车系统和智能电
[单片机]
兆易创新GD32 MCU荣获“中国芯”最佳市场表现产品奖
电子网报道,2017 年10 月 23日昆山,在国家工业和信息化部软件与集成电路促进中心(简称“CSIP”)举办的第十二届“中国芯 • 新动能”中国集成电路产业促进大会上,北京兆易创新科技股份有限公司(GigaDevice)推出的GD32系列Cortex®-M内核32位通用微控制器产品GD32F130C6T6荣获“中国芯”最佳市场表现产品奖。
 
 兆易创新GD32 MCU作为中国高性能通用微控制器领域的领跑者,中国第一个推出的Arm® Cortex®-M3及Cortex®-M4 内核通用MCU产品系列,已经发展成为中国32位通用MCU市场的主流之选。并以累计超过1亿颗的出货数量,超过1万的客户数量,19个系列300余款产品选择所
[半导体设计/制造]
C51单片机小程序(一)
好久没碰单片机了,有些生疏了。到现在还依稀记得自己独自坐在电脑屏幕前自学单片机,硬生生的去看了单片机的基础,现在想想还是挺有趣的。附上当初一点初学的单片机小程序,请大家多多指教! 用P1口作为输出口,接8位用作逻辑电平显示的发光二极管。设计程序使发光二极管间隔300ms先奇数亮再偶数亮,循环3次;一个发光二极管亮上下循环3次;两个分别从两边向中间流动3次;再从中间向两边流动3次;8个全部闪烁3次;关闭全部发光二极管,停止。 综合实验程序: #库定义 #include reg52.h #include intrins.h sbit led=P1^0; #位定义 int i,j,k,num,e,p,m;
[单片机]
什么是步进电机 步进电机的工作原理
  步进电机是一种电动机,它通过逐步改变电磁场的方向来驱动转子,从而实现转动。步进电机的特点是可以精确定位,因为它们可以在每一个步骤中停下来,不需要反馈系统。另外,步进电机的转速和扭矩与电流的大小成正比,因此它们非常适合需要精确控制和定位的应用,例如打印机、数控机床、3D打印机和机器人等。   步进电机的原理基于磁场的相互作用和转子位置的变化。它由定子和转子两部分组成,定子上有若干个线圈,每个线圈上面带有电流,通过不断改变电流的方向和大小来驱动转子。具体来说,步进电机的原理如下:   1、定子上的线圈通过通电,产生一个磁场。   2、磁场作用于转子上的磁极,使得转子旋转到一个新的位置。   3、当定子上的线圈的电流方向改变
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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