/*这是一个控制步进电机正反转的实际应用程序*/
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
/*k7,k8键是设定步进电机转动速度参数的加减键*/
/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
/*k11是步进运行键,按一下,步进电机动一下*/
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
START:do;       
$INCLUDE(REG51.DCL)
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
declare l(5) byte;
declare (dat,data) byte at (30h);
declare delay word;
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
  41h,1fh,01h,09h,00h);
declare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/
declare so literally 'p22',cs literally 'p23';
dog:procedure;  /* 初始化看门狗x25045 */
 cs=1;
 call time(1);
 cs=0;
 call time(1);
 cs=1;
end dog;

run:procedure;  /*步进电机运行脉冲输出程序*/
  if ok=1 then  
  call dog;
  do;
    p14=0;
     call time(1);
    p14=1;
     call time(1);
  end;
end run;

DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/
DECLARE (L0,L10) BYTE; /*定义显示二位*/
n=L10;                 
  n=aco(n);           /*十位数BCD码译成段码*/
  sbuf=n;             /*十位数送164显示*/
  do while ti=0;      /*等待发送结束*/
     call dog;        /*看门狗定时器复位*/  
  end;
n=L0;                
   n=aco(n);          
   sbuf=n;           /*个位数送164显示*/ 
   do while ti=0;     
    call dog;
   end;
end display;       
outbyt:  procedure(da);       /*向看门狗存储器写入一字节*/
declare (i,da) byte;
j=da;                 /*将要写入的字节赋给临时变量J */
do i=0 to 7;          /*左移8位,送到口线si */
   sck=0;
   j=scl(j,1);
   si=cy;
   sck=1;            /*每移一位数据,跟一个时钟信号*/ 
end;
end outbyt;

inbyt:  procedure;   /* 从看门狗存储器读出一字节 */
declare (i,di) byte;
j=0;
 do i=0 to 7;   
   sck=1;
   sck=0;
   cy=so;
   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/
 end;
 dat=j;
end inbyt;

wrenable: procedure;   /* 置看门狗写使能*/
sck=0; 
cs=0;
;  /* write enable command */
call outbyt(06h); /* x25045 写使能指令06h */
cs=1;
sck=0;
end wrenable;

wrdisable: procedure;  /* 置看门狗写禁止 */
 sck=0;
 cs=0;
 ; /* write disable command */
 call outbyt(04h);
 sck=0;
 cs=1;
end wrdisable;

wrregister: procedure;   /* 写状态寄存器 */
 sck=0;
 cs=0;
 dat=01h;      /* write register command */ 
 call outbyt(dat);
 ;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
 call outbyt(00h); /* 设定看门狗定时时间 */
 ;
 sck=0;
 cs=1;
 call time(200); /* wait to complete writting cycle */
end wrregister;

rdregister:procedure;  /*  读看门狗状态寄存器 */
 sck=0;
 cs=0;
 ;   /* register read command */
 call outbyt(05h);
 call inbyt; /* status register read in <DAT> */
 sck=0;
 cs=1;
end rdregister;

wbyte:procedure;   /*  看门狗存储器字节写入子程序 */
  declare comm byte;
  sck=0;
  cs=0;
  comm=02h;  /*  写指令 02h */
  call outbyt(comm);
  call outbyt(addrl);
  call outbyt(dat);  /*  send one byte data to X25043 */
  cs=1;
  sck=0;
  call time(150);
end wbyte;

rbyte:procedure;  /*看门狗存储器字节读出子程序  */
  declare comm byte;
  sck=0;
  cs=0;
  comm=03h;     /* read command */
  call outbyt(comm);
  call outbyt(addrl);
  call inbyt;   /* read one byte to <DAT>  */
  sck=0;
  cs=1;
end rbyte;

incdata:   procedure;          /* 参数修改--"加"键处理子程序+ */
if p10=0 then         /* 如果K7键按下*/
    do;
do while p10=0;       /* 等待键松开有效 */
  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
end;
data=data+1;          /* 设定值+1 */
if data>99 then data=1;  /* 规定设定值的上限*/
L(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) */
L(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
call time(200);         /* 延时 */
call dog;
call time(200);
call dog;
call wrenable;           /* 置存储器写使能 */
addrl=00h;               /* 置存储器地址 */
dat=l(1);                 
call wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  
call wrenable;
addrl=01h;
dat=l(2);
call wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  
      end;
end incdata;               
decdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */    
IF p11=0 THEN         /* k8 键处理子程序 */  
     do;
do while p11=0;
   call dog;
end;
DATA=DATA-1;             /* 设定值-1 */
if data=0 then data=99;
L(1)=data MOD 10;       
L(2)=data/10;           
call display(l(1),l(2));
call dog;
call time(200);  
call dog; 
call time(200);
call dog;
 call wrenable;
 addrl=00h;           
 dat=l(1);
 call wbyte;
 call wrenable;
 addrl=01h;           
 dat=l(2);
 call wbyte;
   end;
END decdata;

starton:   PROCEDURE;         /* start */    
    declare sd byte;
    if p12=0 THEN         /* K9键处理子程序  */    
 do;
     do while p12=0;
call dog;
     end;
     if p17=0 then ok=0;  /* 如果p17 口线上有信号输入,则运行标志置0 (停止运行)*/
     p13=1;              /* 置步进电机正向运转 */
     call time(200);
      call dog;
     do while ok=1;      /* 当运行标志为1时,执行速度延时操作 */
       do sd= 0 to data; /* 根据设定值 data的数值延时来确定步进电机运行时的脉冲给定速度*/
   call dog; 
     end;
 end;
END starton;

step:   PROCEDURE;         /* step */    
declare sd byte;
p13=1;             /* 置步进电机正向运转 */
call time(200);
call dog;
IF p33=0 THEN      /* k11键处理子程序  */          
  do;
if p17=0 then ok=0; /* 如果p17上有信号输入,则停止运行*/
do while p33=0;
   do sd= 0 to data; /* 调用延时,调整步进电机的运行速度 */
       call dog;
      call time(2);
   end;
   call run;
   call dog;
end;
 end;
 ok=0;
END step;

back:   PROCEDURE;         /* 反向运行处理子程序 */    
declare sd byte;  
IF p34=0 THEN           
  do;
do while p34=0;
   call dog;
end;
if p15=0 then ok=0;   /* 反向运行时,如果遇到p15上有信号输入,则停止步进电机运行 */
p13=0;                /* 置步进电机反向运行 */
call time(200);
call dog;
     do while ok=1;
do sd=0 to data;     /*根据设定值调节步进电机的运行速度 */
   call dog;
   call time(2);
end;
call run;
if (p15=0 or p32=0 ) then ok=0; /* p15 或 p32 口线任意一个有信号输入,停止运行 */
     end;
 
 end;
END back;

MAIN$PROGRAM:    /* 初始化主程序 */
ea=0;             /* 关中断  */
SCON=00h;         /*置串口方式0 ,串行数据输出模式*/      
PCON=00h;                
tmod=11h;
et0=1;
enable;          /* 开中断 (ea=1) */
SCK=0;cs=1;      /* 定义存储器口线初始状态 */        
call wrenable;   
call wrregister;  /* 看门狗存储器 初始化  */
call wrenable;
call dog;
p2=0ffh;               /* 初始化各个口线的状态 */
p1=0ffh;ok=0;        
p14=1;p32=1;p33=1;p34=1;
p13=1;                    
ADDRL=00h;     /* 上电复位后从存储器中读出设定的速度值   */       
CALL rbyte;               
l(1)=dat;
addrl=01h;
call rbyte;
l(2)=dat;
DATA=L(1)+L(2)*10;    /*将读出的值合并成十进制,存入变量data中 */   
/* 以下是主循环程序 */
LOOP:  
IF p10=0 THEN CALL incdata;  /* 检测各个按键是否有按下 */
IF p11=0 THEN CALL decdata; 
if p12=0 then 
  do;
     ok=1;
     call starton;
  end;
if p34=0 then
  do;
    ok=1;
    call back;
  end;
if p33=0 then
  do;
    ok=1;
    call step;
  end;
call dog;
CALL DISPLAY(L(1),L(2));  /* 将设定值送164显示 */
call dog;
CALL TIME(100);      
call dog;
GOTO LOOP;                  
END START;

控制步进电机正反转的实际应用程序相关推荐

  1. 单片机控制步进电机正反转

    单片机控制步进电机正反转 硬件连接: 程序: #include <reg52.h> #define uint unsigned int #define uchar unsigned cha ...

  2. 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速-萌新入门

    ** 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速 ** 分享一个萌新入门小工程 一.原件连接: 第一种直接用51开发板 第二种用最小单元加unl2003驱动 二.开发板电路 ...

  3. 89c52单片机控制两个步进电机正反转加减速(程序+仿真)

    89c52单片机控制两个步进电机正反转加减速(程序+仿真) 先上图: 源代码: /*********************************************************** ...

  4. K_A07_003 基于 STM32等单片机驱动DRV8825模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8825模块 1. ...

  5. K_A07_001 基于 STM32等单片机驱动A4988模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+A4988模块 1.2. ...

  6. K_A07_005 基于 STM32等单片机驱动 DRV8833 模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8833模块 1.2.STM3 ...

  7. K_A07_002 基于 STM32等单片机驱动ULN2003模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 反向输出 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+ULN2003模块 1.2 ...

  8. Arduino输入0/1控制步进电机正反转一定行程

    Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(ArduinoIDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ban ...

  9. 51单片机通过按钮控制步进电机正反转角度

    51单片机通过按钮控制步进电机正反转角度

最新文章

  1. Functional Options
  2. Django的mode的分组查询和聚合查询和F查询和Q查询
  3. C++ 11 新特性 nullptr 学习
  4. Linxu安装Tomcat与Jdk并卸载自带OpenJdk
  5. 记一次院赛CTF的WEB题(入门级别)
  6. Faster-RCNN训练自己数据集遇到的问题集锦
  7. linux cmake 安装mysql5.5.11,以及更高版本
  8. mysql2800_mysql error 1045 (2800):。。 'root'@'localhost' (using password:YES)
  9. 个元素前面 个元素放在第i 链表将第j_彻底理解链表中为何使用二级指针或者一级指针的引用...
  10. js JSON转Excel并导出
  11. centos7修复libcrypto.so.10缺失的问题,导致ssh无法运行
  12. artDialog--经典的网页对话框组件
  13. 华为荣耀鸿蒙3.0安装谷歌Play商店,安装谷歌服务三件套GMS,Google
  14. 物联网是什么?物联网应用场景有哪些?物联网有什么好处?
  15. [T-ARA][남주긴 아까워][给别人可惜了]
  16. 互联网的那点事:商业模式、开放平台、开放开源标准
  17. “笨办法”学Python3,Zed A. Shaw, 习题1~2
  18. 15个技术类实习生工资最高的公司
  19. 电动汽车自燃事故及原因汇总
  20. 情感分析实战(中文)-共现语义篇

热门文章

  1. 【TypeScript】深入学习TypeScript模块
  2. 关于A类,B类,C类IP地址的网段和主机数的计算方法
  3. IE安全系列:脚本先锋(II)
  4. 阿里云短信使用步骤及代码模板【很遗憾现在个人无法申请短信功能了】
  5. 数据可视化matplotlib(一)---亚马逊销售飙升榜
  6. 如何辨别CAD图纸版本是不是2004版本
  7. C++ 比赛时 无穷小、无穷大的设定
  8. STM32学习之ADC(模拟数字转换器)
  9. 普通网红如何打造个人IP?个人IP打造有哪些注意事项?
  10. 蜗牛一般的UAP开发(二)元数据