51单片机控制两个步进电机

发布者:CelestialMagic最新更新时间:2020-02-12 来源: 51hei关键字:51单片机控制  步进电机  数据端口 手机看文章 扫描二维码
随时随地手机看文章

/*-----------------------------------------------
步进电机控制
------------------------------------------------*/

#include

#define KeyPort P3
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量

sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit a1=P1^4; //定义步进电机连接端口
sbit b1=P1^5;
sbit c1=P1^6;
sbit d1=P1^7;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

#define Coil_ab1 {a1=1;b1=1;c1=0;d1=0;}//AB相通电,其他相断电
#define Coil_bc1 {a1=0;b1=1;c1=1;d1=0;}//BC相通电,其他相断电
#define Coil_cd1 {a1=0;b1=0;c1=1;d1=1;}//CD相通电,其他相断电
#define Coil_da1 {a1=1;b1=0;c1=0;d1=1;}//D相通电,其他相断电
#define Coil_a1 {a1=1;b1=0;c1=0;d1=0;}//A相通电,其他相断电
#define Coil_b1 {a1=0;b1=1;c1=0;d1=0;}//B相通电,其他相断电
#define Coil_c1 {a1=0;b1=0;c1=1;d1=0;}//C相通电,其他相断电
#define Coil_d1 {a1=0;b1=0;c1=0;d1=1;}//D相通电,其他相断电
#define Coil_OFF1 {a1=0;b1=0;c1=0;d1=0;}//全部断电

unsigned char Speed=1;
bit StopFlag;
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0(void);
unsigned char KeyScan(void);
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main()
{
unsigned int i=512;//旋转一周时间
unsigned char num;
Init_Timer0();
Coil_OFF
        Coil_OFF1
while(1)  //正向
  { 
   num=KeyScan();    //循环调用按键扫描
   if(num==1)//第一个按键,速度等级增加
      {
           if(Speed<18)
           Speed++;
          }        
   else if(num==2)//第二个按键,速度等级减小
      {
           if(Speed>1)
           Speed--;
          }        
   else if(num==3)//电机停止
     {
      Coil_OFF
                         Coil_OFF1
          StopFlag=1;
          }
   else if(num==4)//电机启动
     {
          StopFlag=0;
          }
  //分解显示信息,如要显示68,则68/10=6  68%10=8  
  TempData[0]=dofly_DuanMa[Speed/10];
  TempData[1]=dofly_DuanMa[Speed%10];
  }
}

/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示
从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
          

           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;

           i++;
       if(i==Num)
              i=0;


}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
PT0=1;           //优先级打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
static unsigned char times,i,j;
TH0=(65536-1000)/256;                  //重新赋值 1ms
TL0=(65536-1000)%256;

Display(0,8);
if(!StopFlag)
   {
  if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2
   {
   times=0;
   switch(i)
       {
          case 0:Coil_A1;i++;break;
                case 1:Coil_B1;i++;break;
                case 2:Coil_C1;i++;break;
                case 3:Coil_D1;i++;break;
                case 4:i=0;break;
            default:break;
                         }
         switch(j)
       {
          case 0:Coil_a1;j++;break;
                case 1:Coil_b1;j++;break;
                case 2:Coil_C1;j++;break;
                case 3:Coil_d1;j++;break;
                case 4:j=0;break;
            default:break;
           }
    }
times++;
  }
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
   {
    DelayMs(10);
    if(KeyPort!=0xff)
           {
            keyvalue=KeyPort;
            while(KeyPort!=0xff);
                switch(keyvalue)
                {
                 case 0xfe:return 1;break;
                 case 0xfd:return 2;break;
                 case 0xfb:return 3;break;
                 case 0xf7:return 4;break;
                 case 0xef:return 5;break;
                 case 0xdf:return 6;break;
                 case 0xbf:return 7;break;
                 case 0x7f:return 8;break;
                 default:return 0;break;
                }
          }
   }
   return 0;
}

关键字:51单片机控制  步进电机  数据端口 引用地址:51单片机控制两个步进电机

上一篇:51单片机PCA9685驱动9个舵机
下一篇:解决51单片机复位触发的4种方法

推荐阅读最新更新时间:2024-11-18 20:57

以C8051F021单片机和RA8835液晶控制器为核心的液晶
本文给出了一种基于C8051F021和RA8835实现的低成本液晶显示方案。随着电子产品设计技术的不断发展,电子产品的设计,尤其是人机交互界面的设计日益趋向人性化。这其中的液晶显示屏以其具有能显示复杂文字及图形、显示面积大小随意、功耗低、轻薄等优点,而得到广泛的应用。近年来,随着单片机技术的飞速发展,涌现了多种性能优良且成本很低的单片机品种。C8051F系列单片机就是其中之一。在工程应用中,C8051F021可在满足性能要求的前提下,减少浪费、降低成本。 1 系统主要器件 1.1 C8051F021单片机 本系统选用性能优良且成本较低的SOC单片机C8051F021作为控制核心。C8051F201是完全集成的混合信号系统级M
[单片机]
以C8051F021<font color='red'>单片机</font>和RA8835液晶<font color='red'>控制</font>器为核心的液晶
基于AT89C51单片机低成本温度控制实验系统
  笔者在电子市场购买了一块3.6V450mAh的锂离子充电本文介绍一种以AT89C51单片机为核心的低成本温度控制实验系统。该系统采用温度传感器DS18820实现一线数字式测温,经过PID算法输出PWM波,再由PWM信号控制固态继电器,调节热阻丝发热功率,最终达到控制被控对象温度的目的,该系统还扩展了人机接口和串口通信,实现温度设定、控制及图像显示。   硬件设计   1.总体设计   系统结构框图如图1所示,以AT89C51单片机为控制核心,DS18820电池,外型尺寸完全符合原机的内部空间要求。按照正确的正负极性焊连到 电路 中即可完成电池的更换工作。实际使用效果极佳,连续播放时间超过了7个小时(图4)。测量被控温度
[单片机]
基于AT89C<font color='red'>51</font><font color='red'>单片机</font>低成本温度<font color='red'>控制</font>实验系统
8051微控制器架构的简要说明
此前已经介绍了关于8051微控制器基础知识和引脚图说明等相关知识,而在本文中,将重点介绍8051微控制器的硬件方面内容,如 I/O 端口、RAM、ROM、定时器和串行端口等。 微控制器的基本组件 微处理器和微控制器之间的区别在于片上外围设备的可用性,如内存(RAM 和 ROM)、I/O 端口、定时器/计数器、通信接口(如串行端口)等。 下图显示了微控制器的基本组件。由于所有组件(以及一些其他组件)都集成在单个芯片(集成电路IC)上,因此可以将微控制器视为微型计算机(或单片机)。 1、CPU(中央处理器);它是微控制器的大脑,主要由算术逻辑单元(ALU)和控制单元(CU)等重要部件组成。CPU是与内存、输入和输出等外围设
[单片机]
8051<font color='red'>微控制</font>器架构的简要说明
基于GAL器件的步进电机控制器的研究与设计
摘要:介绍了利用阵列逻辑器件GAL16V8对三相六拍步进电机实现控制的方法及其电路设计。通过计算机编程器对GAL进行编程,可以满足各种控制要求。该电路简单,工作稳定可靠,编程灵活方便。 关键词:通用阵列逻辑器件 步进电机 GAL16V8 三相六拍 步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可
[半导体设计/制造]
基于单片机步进电机控制系统设计
单片机实现的步进电机控制系统具有成本低、使用灵活的特点,广泛应用于数控机床、机器人,定量进给、工业自动控制以及各种可控的有定位要求的机械工具等应用领域。步进电机是数字控制电机,将脉冲信号转换成角位移,电机的转速、停止的位置取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,非超载状态下,根据上述线性关系,再加上步进电机只有周期性误差而无累积误差,因此步进电机适用于单片机控制。步进电机通过输入脉冲信号进行控制,即电机的总转动角度由输入脉冲总数决定,而电机的转速由脉冲信号频率决定。步进电机的驱动电路是根据单片机产生的控制信号进行工作。因此,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。 1 系统设计原理 步进
[模拟电子]
基于<font color='red'>单片机</font>的<font color='red'>步进</font><font color='red'>电机</font><font color='red'>控制</font>系统设计
AT89C51单片机在LED显示屏控制电路设计中的应用
LED显示屏又叫电子显示屏,是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时更换,通常由显示模块、控制系统及电源系统组成。显示模块由LED灯组成的点阵构成,负责发光显示;控制系统通过控制相应区域的亮灭,可以让屏幕显示文字、图片、视频等内容,恒舞动卡主要是播放动画的;电源系统负责将输入电压电流转为显示屏需要的电压电流。   LED显示屏广泛应用于信息指示灯,大屏幕显示,液晶显示的背光灯,固体照明等。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。   一、控制
[单片机]
AT89C<font color='red'>51</font><font color='red'>单片机</font>在LED显示屏<font color='red'>控制</font>电路设计中的应用
步进电机14问
1.什么是步进电机? 步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 2.步进电机分哪几种? 步进电机分三种:永磁式(PM) ,反应式(VR)和混合式(HB) 永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度 或15度; 反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永
[单片机]
步进电机开环控制的原理
  步进电机开环控制的原理   当步进电机的定子一相绕组流过直流电流时,最接近该相的转子齿被定子相吸引,因产生的电磁转矩大于负载转矩,从而使转子运动。当转子转动到电磁转矩与负载转矩平衡位置时,转子就静止不动了,此电磁转矩也就把负载转至需要定位的位置。然后再对下一相施加激磁电流,另外一个最接近该相的转子齿被吸引,负载被该相电磁转矩驱动,移动1个步距角,到达下一个静止位置。激磁相切换的次数与频率决定了转子旋转的最终角度与速度。切换相的次数与步距角的乘积为步进(专有名词为步动作增加的角度)角度,此值决定最终静止位置。相对负载转矩来说,如步进电机产生的转矩足够大,则切换指令就能驱动负载,作位置控制。此时的位置平衡力是由步进电机静态转矩产生
[嵌入式]
<font color='red'>步进</font><font color='red'>电机</font>开环<font color='red'>控制</font>的原理
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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