51单片机实现三相六拍的步进电机控制

发布者:huijiazi5210最新更新时间:2019-11-19 来源: 51hei关键字:51单片机  三相六拍  步进电机控制 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下

#include      

    

#define uchar unsigned char

#define uint  unsigned int

uint speed = 100;                                                //初始转速

uint max = 200;                                                        //最慢转速

uint min = 20;                                                        //最快转速


sbit swich = P2^0;                                           //总开关

sbit dir = P2^1;                                        //电机旋转方向

sbit le1=P2^6;

sbit le2=P2^7;

sbit speedadd=P3^2;

sbit speedsub=P3^3;                                   


unsigned char uca_MotorStep[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};    //励磁电流数组。

                                                                                                             


uchar leddata[]={ 


                0x3F,  //"0"

                0x06,  //"1"

                0x5B,  //"2"

                0x4F,  //"3"

                0x66,  //"4"

                0x6D,  //"5"

                0x7D,  //"6"

                0x07,  //"7"

                0x7F,  //"8"

                0x6F,  //"9"

                0x40,  //"-"

                0x00,  //熄灭

                         };



void delay1ms(void)   //误差 0us

{

    unsigned char a,b,c;

    for(c=1;c>0;c--)

        for(b=142;b>0;b--)

            for(a=2;a>0;a--);

}


void delay(uint x )                          //多功能毫秒延时

{

    uint i;

        for(i=0;i        {

          delay1ms();

        }

}




void display(void)

{        

  if(swich==1)

  {

                   P0=        leddata[11];

                delay(1);

                le2=1;

                le1=1;

                delay(1);

                le2=0;                

                le1=0;


  }        

  else

  {

  if(dir==1)

                {

                P0=        leddata[11];

                delay(1);

                le2=1;

                delay(1);

                le2=0;

                }

        else

            {

                P0 =leddata[10];

                delay(1);

                le2=1;

                delay(1);

                le2=0;

                }  


        P0=leddata[9-(speed-20)/20];

        delay(30);

        le1=1;

        delay(5);

        le1=0;

                   

}        

}



void Init_INT0()

{

EX0=1;    //开启外部中断 0

IT0=1;          //设置成低电平触发,1为下降沿触发

EX1=1;    //开启外部中断 1

IT1=1;          //设置成低电平触发,1为下降沿触发

EA=1;   //开启总中断

}


void Interrupt0_handler() interrupt 0

{

    EA=0;   //首先关闭总中断,以消除按键出现的抖动所产生的干扰

    delay(20); //同样是为了消除抖动而产生新的中断

    if(speed>min)

       {speed=speed-20;}        //限制最快转速

        else

                {speed=min;}

        while(speedadd==0);

    EA=1;            //恢复中断

}



void Interrupt1_handler() interrupt 2

{

    EA=0;   //首先关闭总中断,以消除按键出现的抖动所产生的干扰

    delay(20); //同样是为了消除抖动而产生新的中断

    if(speed       {speed=speed+20;}

        else

                {speed=max;}         //限制最慢转速

        while(speedsub==0);

    EA=1;            //恢复中断

}


void main()

{

int i;                                   //初始化

dir=1;

le1=0;

le2=0;



start:

if(swich==0)

     {Init_INT0();}                  //总开关开启,初始化中断,开始转动

   else

         {display(); goto start;        }



        if(dir==1)

  seq:

        { 

          while(1)

          {         

             display();

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

                {

                  P1 = uca_MotorStep[i];         //取数据

                  delay(speed);            //调节转速

                }

                 if(dir==0)                                                         //是否换向

                    {

                        delay(5);                                                 //        换向延时

                        goto oppo;                                                 //换向

                        }

                if(swich==1)                                                 //总开关运行中关闭

                   goto start;                                                 //等待开启

         

          } 

         

        }

        else

        oppo:

……………………



关键字:51单片机  三相六拍  步进电机控制 引用地址:51单片机实现三相六拍的步进电机控制

上一篇:89c52单片机仿真ILI9341液晶屏驱动程序
下一篇:单片机智能窗帘proteus仿真图与代码

推荐阅读最新更新时间:2024-11-06 11:55

51单片机最小系统介绍
前言 在学习51单片机的时候我们最先接触到的就是单片机最小系统,单片机最小系统又叫最小应用系统,顾名思义就是能够使单片机实现简单运行的最小元件的组合。 提示:以下将以51单片机最小系统为例进行介绍 一、51单片机最小系统模块构成 二、电源电路 一个系统的正常工作离不开电源,单片机常见的电源电压分为5V 和低功耗的3.3V。本文介绍的是STC89C51这款芯片,该芯片是在5V电压下正常工作。 1.电源引脚 VCC(VDD):第40脚,电源端,接+5V电源,用于给整个系统供电。 VSS(GND):第20脚,接地端,接GND端。 EA :第31引脚,EA为片外程序存储器选用端,该引脚低电平时,选用片外程序存储器,高电平或悬空时选
[单片机]
<font color='red'>51单片机</font>最小系统介绍
51单片机汇编语言的指令格式
  一个简单的循环灯实例   下图中的8个发光 二极管 代表 8 个彩灯,让我们看看是如何实现的   STAT: MOV A , #01H ; 高电平对应的发光二极管亮   LOOP: MOV P1, A ; 从 P1 口输出到发光二极管   MOV R1, #10   DEL1: MOV R2 , #200   DEL2: MOV R3, #126   DEL3: DJNZ R3, DEL3   DJNZ R2, DEL2   DJNZ R1, DEL1   RL A   LJMP LOOP ; 左移一位 , 下一个发光二极管亮   END    汇编语言 指令格式    : 操作码 ;  
[单片机]
<font color='red'>51单片机</font>汇编语言的指令格式
跟我学51单片机(八)——图型带字库液晶128×64
  上期我向大家介绍了字符型液晶1602的基本功能,并用51单片机的驱动显示,你可以用它表达你的幸运日期或者你喜欢的数字。虽然说1602液晶使用方便,但如果你想用它表达更多的语言,就难以满足要求了,因此,我向大家介绍一款128×64的带字库液晶。   一、原理简介   我手里的这款128×64液晶内部是以ST7920芯片作为控制器,是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16×16点汉字,和128个16×8点ASCII字符集。可以显示8×4行16×16点阵的汉字。因此利用该液晶模块可以灵活的构成全中文人机交互图形界
[单片机]
跟我学<font color='red'>51单片机</font>(八)——图型带字库液晶128×64
C51单片机通过串口调节PWM波
PWM 是一种常用的电子控制技术 PWM 本意为 脉冲宽度调制,可以简单理解为对占空比的控制。下图就是占空比图例,一个周期内高电平时间与周期时间的比值。 现在的一些MCU自带PWM控制功能,但是51/52单片机还是没有这个功能。可以用程序自己实现。 用到的51单片机资源如下: 1.双定时器及定时器中断 2.串口和串口中断 下面看下程序: PWM.H #ifndef _PWM_H #define _PWM_H #include #include #include #define uint unsigned int #define uchar unsigned char #define Pwm_pe
[单片机]
C<font color='red'>51单片机</font>通过串口调节PWM波
89S51单片机PT2221红外解码汇编程序
;******************************************************* ;name: PT2221红外解码V1.0 ;device: pt2221红外编码+89S51单片机解码+红外一体化接收头 ;Copyright (c) 2007-2008 张兴电子设计工作室技术开发部 ;author: 张兴 ;web: http://mcu.5d6d.com ;date: 2007.7.4---14:44 ;description: PT2221发送的红外编码最前面为13.5ms的引导码,而后为32位的数据,32位数据的前16位为用户码, ;用于区别各个厂家的遥控器的不同,而后16位为数据码,分前8
[单片机]
89c51单片机的复位电路,89c51复位电路图详解
  复位电路的目的就是在上电的瞬间提供一个与正常工作状态下相反的电平。一般利用电容电压不能突变的原理,将电容与电阻串联,上电时刻,电容没有充电,两端电压为零,此时,提供复位脉冲,电源不断的给电容充电,直至电容两端电压为电源电压,电路进入正常工作状态。   这篇文章我们就一起来了解一下关于89C51单片机的复位电路方面的消息,希望可以给你带来惊喜。   89c51复位电路图详解   复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。   图1所示的RC复位电路可以实现上述基本功能,图
[单片机]
89c<font color='red'>51单片机</font>的复位电路,89c51复位电路图详解
学习MCS-51单片机需要哪些软件工具
要想学51单片机,先要进行器件选型! 小白:什么?51单片机不是就一种么,还需要选型? MCU起航:呵呵,自从intel在上世纪八十年代将51单片机的内核转让给各个厂家以后,每个厂家都生产了带有自己特色的51单片机。每种厂家的单片机下载软件都是不太一样的。 小白:那么,我们应该如何选择呢? MCU起航:像winbond厂家生产的89C52单片机,下载的时候需要昂贵的下载器,同时配套他们厂家的软件。美国ATMEL公司和STC公司的芯片下载起来非常简单,对于入门的同学来说,是不错的选择。 小白:少废话,具体有哪些? MCU起航:ATMEL厂家的AT89S52,还有STC公司的STC89C52RC系列
[单片机]
AT89C51单片机应用于数控车床切削力测量
 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。   本文就介绍了应用AT89C51单片机测量数控车床切削力的新方法,重点阐述了单片机实现连续自动采样、A/D转换、标度变换及数据处理的方法。   1 问题的提出   在数控车床的加工中,切削力的测量甚为重要。通过对切削力的测量可以分析与研究数控车床各零部件、机构或结构的受力情况和工作状态,验证设计和计算结果
[单片机]
AT89C<font color='red'>51单片机</font>应用于数控车床切削力测量
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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