⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 v27源程序.asm

📁 电动绕线机计数器(电路及源代码).很简单的入门的东东。 简要说明 2004年12月做的小项目
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;******************************************;
;    绕线机计数器程序                      ;
;    CPU : 89C2051    版本:V2.7           ;
;    可预置数--(电机车间专用)            ;
;    创建:2005-02-01 修改于:2005.09.29   ;
;    设计:孙世林                          ;
;    www.mcswe.com                         ;
;    转载请注明出处!                      ;
;******************************************;
;
;****************;
;    伪定义       ;
;****************;
LED0    EQU    3AH;   存放显存的小数
LED1    EQU    3BH;   存放显存个位数
LED2    EQU    3CH;   存放显存十位数
LED3    EQU    3DH;   存放显存百位数
LED4    EQU    3FH;   存放显存千位数
SLOW0   EQU    40H;   存放减速预置数 小数
SLOW1   EQU    41H;   存放减速预置数 个位
SLOW2   EQU    42H;   存放减速预置数 十位
SLOW3   EQU    43H;   存放减速预置数 百位
SLOW4   EQU    44H;   存放减速预置数 千位
TOEND0  EQU    45H;   存放预置数  小数位
TOEND1  EQU    46H;   存放预置数  个位
TOEND2  EQU    47H;   存放预置数  十位
TOEND3  EQU    48H;   存放预置数  百位
TOEND4  EQU    49H;   存放预置数  千位
L1BIT1  EQU    4AH;   存放相应键位中的预置数L1
L1BIT2  EQU    4BH;
L1BIT3  EQU    4CH;
L1BIT4  EQU    4DH;
L2BIT1  EQU    4EH;   存放相应键位中的预置数L2
L2BIT2  EQU    4FH;
L2BIT3  EQU    50H;
L2BIT4  EQU    51H;
L3BIT1  EQU    52H;   存放相应键位中的预置数L3
L3BIT2  EQU    53H;
L3BIT3  EQU    54H;
L3BIT4  EQU    55H;
L4BIT1  EQU    56H;   存放相应键位中的预置数L4
L4BIT2  EQU    57H;
L4BIT3  EQU    58H;
L4BIT4  EQU    59H;
MOVD    EQU    5EH;
MOVE    EQU    5FH;
MOVDAT4    EQU    60H;  存放寄存数L0-L4
MOVDAT3    EQU    61H;
MOVDAT2    EQU    62H;
MOVDAT1    EQU    63H;
MOVDAT0    EQU    64H;
RUNOVER    EQU    65H;
L1ORL2     EQU    5CH;
L1ORL      EQU    5DH;

;************;
;  中断入口   ;
;************;
ORG     0000H    ;程序执行开始地址
LJMP    START    ;跳至START执行
ORG     0003H    ;外中断0中断入口地址
LJMP    INTEXT0  ;
ORG     000BH    ;定时器T0中断入口地址
RETI             ;中断返回
ORG     0013H    ;外中断1中断入口地址
LJMP    INTEXT1  ;
ORG     001BH    ;定时器T1中断入口地址
RETI             ;中断返回
ORG     0023H    ;串行口中断入口地址
RETI             ;中断返回
ORG     002BH    ;定时器T2中断入口地址
RETI             ;中断返回

;************;
; 初始化程序 ;
;************;
START:  LJMP    LODLED;          进入开机显示信息程序
START0: MOV     LED4,#0DH;       清零时显示"CLR" 并为不限制计数范围、清除循环计数标志
        MOV     LED3,#0FH;C
        MOV     LED2,#0AH;L
        MOV     LED1,#010H;R
        MOV     LED0,#0DH;
START1: ACALL   DISPLAY;          等待键释放
        JNB     P1.7,  START1
CLEAR:  MOV     TOEND0,#0AH;      初始化预置数值及减速数值
        MOV     TOEND1,#0AH
        MOV     TOEND2,#0AH
        MOV     TOEND3,#0AH
        MOV     TOEND4,#0AH
        MOV     SLOW1,#0AH
        MOV     SLOW2,#0AH
        MOV     SLOW3,#0AH
        MOV     SLOW4,#0AH
        MOV     L1ORL2,#00H;          不循环计数标记
        MOV     L1BIT1,#0H;*L1-10     载入初始默认数
        MOV     L1BIT2,#1H;
        MOV     L1BIT3,#0H;
        MOV     L1BIT4,#0H;
        MOV     L2BIT1,#0H;*L2-20
        MOV     L2BIT2,#2H;
        MOV     L2BIT3,#0H;
        MOV     L2BIT4,#0H;
        MOV     L3BIT1,#5H;*L3-15
        MOV     L3BIT2,#1H;
        MOV     L3BIT3,#0H;
        MOV     L3BIT4,#0H;
        MOV     L4BIT1,#0H;*L4-30
        MOV     L4BIT2,#3H;
        MOV     L4BIT3,#0H;
        MOV     L4BIT4,#0H;

CLEARP: ACALL   CLRALL;       调用清零程序
        ACALL   CLRMOV;
        LJMP    MAIN;         跳到主程序开始计数
CLRALL: MOV     A,#00H;       将LED0至LED4计数显存置0
        MOV     LED0,A
        MOV     LED1,A
        MOV     LED2,A
        MOV     LED3,A
        MOV     LED4,A
        CLR     C;
        MOV     P3,#0FFH
        MOV     P1,#0FFH
        RET
CLRMOV: MOV    A,#00H;         暂存器置零
        MOV    MOVDAT4,A
        MOV    MOVDAT3,A
        MOV    MOVDAT2,A
        MOV    MOVDAT1,A
        MOV    MOVDAT0,A
        RET

;************************;
; 快速预置数程序 L1~L4     ;
;************************;

CLEAR1: MOV     TOEND0,#0H;     载入预置数到寄存器L1
        MOV     TOEND1,L1BIT1
        MOV     TOEND2,L1BIT2
        MOV     TOEND3,L1BIT3
        MOV     TOEND4,L1BIT4
        MOV     R1,L1BIT1;      处理减速数值
        MOV     R2,L1BIT2;
        MOV     R3,L1BIT3;
        MOV     R4,L1BIT4;
        MOV     L1ORL,#00H;     建立循环标记
        AJMP    CLEPOG;
CLEAR2: MOV     TOEND0,#0H;     载入预置数到寄存器L2
        MOV     TOEND1,L2BIT1
        MOV     TOEND2,L2BIT2
        MOV     TOEND3,L2BIT3
        MOV     TOEND4,L2BIT4
        MOV     R1,L2BIT1;      处理减速数值
        MOV     R2,L2BIT2;
        MOV     R3,L2BIT3;
        MOV     R4,L2BIT4;      建立循环标记
        MOV     L1ORL,#05H;
        AJMP    CLEPOG;
CLEAR3: MOV     TOEND0,#0H;     载入预置数到寄存器L3
        MOV     TOEND1,L3BIT1
        MOV     TOEND2,L3BIT2
        MOV     TOEND3,L3BIT3
        MOV     TOEND4,L3BIT4
        MOV     R1,L3BIT1;      处理减速数值
        MOV     R2,L3BIT2;
        MOV     R3,L3BIT3;
        MOV     R4,L3BIT4;
        AJMP    CLEPOG;
CLEAR4: MOV     TOEND0,#0H;     载入预置数到寄存器L4
        MOV     TOEND1,L4BIT1
        MOV     TOEND2,L4BIT2
        MOV     TOEND3,L4BIT3
        MOV     TOEND4,L4BIT4
        MOV     R1,L4BIT1;      处理减速数值
        MOV     R2,L4BIT2;
        MOV     R3,L4BIT3;
        MOV     R4,L4BIT4;

CLEPOG: DEC     R1;                减速数值是终值的前一圈进行
        CLR     C;                 清进位标致
        CJNE    R1,#0FFH,CLEOUT;
        MOV     R1,#09H;
        DEC     R2;
        CLR     C;                 清进位标致
        CJNE    R2,#0FFH,CLEOUT;
        MOV     R2,#09H;
        DEC     R3
        CLR     C;                 清进位标致
        CJNE    R3,#0FFH,CLEOUT;
        MOV     R3,#09H;
        DEC     R4
        CLR     C;                 清进位标致
        CJNE    R4,#0FFH,CLEOUT;
        MOV     R4,#09H;
CLEOUT: MOV     SLOW1,R1;          载入减速数到寄存器
        MOV     SLOW2,R2;
        MOV     SLOW3,R3;
        MOV     SLOW4,R4;
        LJMP    CLEARP;            跳到初始化程序

CLEAREX:MOV     TOEND0,#0AH;       解除锁定电机控制,且不清零继续计数
        MOV     TOEND1,#0AH
        MOV     TOEND2,#0AH
        MOV     TOEND3,#0AH
        MOV     TOEND4,#0AH
        ACALL   CLEARPX;
        AJMP    MAIN
CLEARPX:MOV     SLOW1,#0AH;        不减速时载入的数
        MOV     SLOW2,#0AH
        MOV     SLOW3,#0AH
        MOV     SLOW4,#0AH
        MOV     P3,#0FFH
        MOV     P1,#0FFH
        RET

;**************************************;
;            主 程 序  ;
;**************************************;

MAIN:  MOV   A,SLOW4;        判断是否到减速的数值  (千位)
       MOV   MOVD,LED4
       CJNE  A,MOVD,LOOP0
       MOV   A,SLOW3;        判断是否到减速的数值 (百位)
       MOV   MOVD,LED3
       CJNE  A,MOVD,LOOP0
       MOV   A,SLOW2;        ...................十位
       MOV   MOVD,LED2
       CJNE  A,MOVD,LOOP0
       MOV   A,SLOW1;        ...................个位
       MOV   MOVD,LED1
       CJNE  A,MOVD,LOOP0
       MOV A,LED0;           减速(使P1.7口电压下降约0.6V)
       MOVC A,@A+DPTR;       递增减速
       MOV P1,A
       CLR P3.5;             高位高亮显示发出提示,并断开慢起动电路
       ACALL D1MS
       SETB P1.7
LOOP0: MOV   A,TOEND4;       判断是否到预置数了(千位)
       MOV   MOVD,LED4
       CJNE  A,MOVD,LOOP
       MOV   A,TOEND3;       ................百位
       MOV   MOVD,LED3
       CJNE  A,MOVD,LOOP
       MOV   A,TOEND2;       ................十位
       MOV   MOVD,LED2
       CJNE  A,MOVD,LOOP
       MOV   A,TOEND1;       ................个位
       MOV   MOVD,LED1
       CJNE  A,MOVD,LOOP
       MOV   A,TOEND0;       ................小数位
       MOV   MOVD,LED0
       CJNE  A,MOVD,LOOP
       CLR   P1.7;           控制电机停车
       LCALL DLS3;           延时约0.5秒
       MOV   A,#05H;
       CJNE  A,L1ORL2,LOOP1; 如标记位不是07则跳至LOOP1
       AJMP  ACTION_X;       到预置数时,跳到循环L1-L2计数
LOOP1: AJMP  ACTION;         跳到停机等待按键处理程序

LOOP:  ACALL DISPLAY;        调用显示程序
       MOV   P1,#0FFH;       置P1口为输入状态
       MOV   P3,#0FFH;       置P3口为输入状态
       JNB   P1.0,NUMNOW;    显示当前的预置数并将标志位置数
       JNB   P1.1,NOTSLOW;   不减速
       JNB   P1.7,ALLCLR;    如清零键按下跳至清零序清除所有已设定数
       JNB   P3.7,SELSAVE0;  如设置键按下跳到到点程序选数
       JNB   P1.6,LED_L1;    显示相应键位值是多少
       JNB   P1.2,LED_L2;
       JNB   P1.5,LED_L3;
       JNB   P1.3,LED_L4;
       JNB   P1.4,LED_L5;
SELOD: SETB   IT0;
       SETB   EX0;
       SETB   IT1;
       SETB   EX1;
       SETB   EA;               开总中断
       AJMP   MAIN;             返回主程序重复

LED_L1:  AJMP   LOOKL1;         跳至显示当前键位的预置数是多少L1
LED_L2:  AJMP   LOOKL2;         跳至显示当前键位的预置数是多少L2
LED_L3:  AJMP   LOOKL3;         跳至显示当前键位的预置数是多少L3
LED_L4:  AJMP   LOOKL4;         跳至显示当前键位的预置数是多少L4
LED_L5:  AJMP   LOOKL5;
ALLCLR:  LJMP   START0;
NUMNOW:  AJMP   LOOKNOW
NOTSLOW: ACALL  LOOKLX;
NOTSLOW1:ACALL  DISPLAY0
         LCALL  DLS1
         SETB   P1.1
         JNB    P1.1,NOTSLOW1
         LCALL  CLEARPX;        调用不减速程序
         MOV    SLOW4,#0FH
         MOV    LED4,#0EH;      高位显示PXXXX
         AJMP   MAIN
SELSAVE0:ACALL  LOOKLX;         将当前数寄存在指定单元
SELSAVE: JB     P3.7,SELOD5
         LCALL  DLS1
         JNB    P3.7,SELOD2;   若按下大于1秒则跳
         LCALL  SELOD3
SELOD1:  AJMP   SELOD5
SELOD2:  ACALL LOOKLX;
         MOV  LED4,#013H;       显示“-----”
         MOV  LED3,#013H;
         MOV  LED2,#013H;
         MOV  LED1,#013H;
         MOV  LED0,#013H;
SELOD21: ACALL DISPLAY0
         SETB P3.7
         JNB  P3.7,SELOD21
         LJMP SELNUM;          跳到设置预置数状态
SELOD3:  MOV   A,LED2
         MOV   MOVD,#011H;     如为T则返回避免在显示SET时出错
         CJNE  A,MOVD,SELOD5
         AJMP  SELOD
SELOD5:  CLR   P1.7
         CLR   EA;             关总中断
         MOV  LED4,#0DH;       设置键按下时显示"SET"
         MOV  LED3,#05H
         MOV  LED2,#011H
         MOV  LED1,#012H
         MOV  LED0,#0DH
         ACALL DISPLAY0
         SETB P3.7
         JNB  P3.7,SELOD5;
ACTION:  CLR   P1.7
         ACALL DISPLAY0
         MOV   P1,#0FFH;          置P1.0至P1.6为输入状态
         CLR   P1.7
         SETB  P3.7
         JNB   P1.0,KBSET3;       执行超程计数
         JNB   P1.1,KBSET0;
RETF:    JNB   P1.2,KBOUT22;      L2    只有L1至L4与SET\SEL键输入有效
         JNB   P1.3,KBOUT40;      L4
         JNB   P1.4,KBOUT0;       L--------rel--------NEXT
         JNB   P1.5,KBOUT3;       L3
         JNB   P1.6,KBOUT11;      L1
         JNB   P3.7,KBSET1;       SET
         AJMP  ACTION;
KBSET0:  AJMP  ACTION;

KBSET1:  MOV   A,LED2
         MOV   MOVD,#011H;       如为E则返回
         CJNE  A,MOVD,KBSET12;
         AJMP  ACTION;
KBSET12: ACALL DISPLAY0
         LCALL  DLS1
         JNB    P3.7,KBSET11;    若按下大于1秒则跳
         AJMP   ACTION;
KBSET11: AJMP   SELSAVE;
KBSET3:  MOV   A,LED2
         MOV   MOVD,#011H;          看是否为SET
         CJNE  A,MOVD,KBOUT60;      如不为SET就执行超程计数
         AJMP  RETF;                是SET则返回
KBOUT60: LJMP  KBOUT6;
KBOUT0:  AJMP  KBOUT5;
KBOUT40: AJMP  KBOUT4;
KBOUT11: MOV   A,#05H;
         CJNE  A,L1ORL2,KBOUT1;     如标记位不是05则跳
         MOV   RUNOVER,#08H;        建立循环次数8次
KBOUT1:  MOV   LED4,#0AH;           当K1按下时显示“L 1”
         MOV   LED3,#0DH
         MOV   LED2,#01H
         MOV   LED1,#0DH
         MOV   LED0,#0DH
         ACALL DISPLAY0
         SETB  P1.6
         JNB   P1.6,KBOUT1;      延时消抖
         ACALL DISPLAY0
         LCALL DLS3
         LJMP  CLEAR1;           如松开键时跳至CLEAR1置数程序
KBOUT22: MOV   A,#05H;
         CJNE  A,L1ORL2,KBOUT2;  如标记位不是05则跳,(不循环计数)
         MOV   RUNOVER,#06H;     建立循环次数6次
KBOUT2:  MOV   LED4,#0AH;        .L 2
         MOV   LED3,#0DH;        .
         MOV   LED2,#02H;        .
         MOV   LED1,#0DH
         MOV   LED0,#0DH
         ACALL DISPLAY0
         SETB  P1.2
         JNB   P1.2,KBOUT2
         ACALL DISPLAY0
         LCALL DLS3
         LJMP  CLEAR2
KBOUT3:  MOV   LED4,#0AH;    L 3
         MOV   LED3,#0DH
         MOV   LED2,#03H
         MOV   LED1,#0DH
         MOV   LED0,#0DH
         ACALL DISPLAY0
         SETB  P1.5
         JNB   P1.5,KBOUT3
         ACALL DISPLAY0
         LCALL DLS3
         LJMP  CLEAR3
KBOUT4:  MOV   LED4,#0AH;    L 4
         MOV   LED3,#0DH
         MOV   LED2,#04H
         MOV   LED1,#0DH
         MOV   LED0,#0DH
         ACALL DISPLAY0
         SETB  P1.3
         JNB   P1.3,KBOUT4
         ACALL DISPLAY0
         LCALL DLS3
         LJMP  CLEAR4
KBOUT5:  ACALL DISPLAY0
         SETB  P1.4
         JNB   P1.4,KBOUT5
         LJMP  LOOKL5
KBOUT6:  MOV   LED4,#011H;      E....  解除电机锁定并继续计数,同时高位用E显示
         ACALL DISPLAY0
         LCALL DL05S
         SETB  P1.0
         JNB   P1.0,KBOUT6
         LJMP  CLEAREX

ACTION_X:ACALL DISPLAY0;        循环数判别
         CLR   C;               清进位标致
         LCALL DLS3;            延时约1秒
         LCALL DLS3
         DJNZ  RUNOVER,NEXT;    是否计完8/6次?不是则再继续循环
         LJMP  ACTION;          跳到停机状态,等待按键处理
NEXT:    MOV   A,#05H;
         CJNE  A,L1ORL,GOL2;    如是L1则转L2、如是L2则转L1
         LJMP  KBOUT1;
GOL2:    LJMP  KBOUT2;

;***************************;
;  显示当前键位中的预置数      ;
;***************************;
LOOKL1:  ACALL LOOKLX;
         MOV   LED4,L1BIT4;
         MOV   LED3,L1BIT3;
         MOV   LED2,L1BIT2;
         MOV   LED1,L1BIT1;
         AJMP  LOOKALL
LOOKL2:  ACALL LOOKLX;
         MOV   LED4,L2BIT4;
         MOV   LED3,L2BIT3;
         MOV   LED2,L2BIT2;
         MOV   LED1,L2BIT1;
         AJMP  LOOKALL
LOOKL3:  ACALL LOOKLX;
         MOV   LED4,L3BIT4;
         MOV   LED3,L3BIT3;
         MOV   LED2,L3BIT2;
         MOV   LED1,L3BIT1;
         AJMP  LOOKALL
LOOKL4:  ACALL LOOKLX;
         MOV   LED4,L4BIT4;
         MOV   LED3,L4BIT3;
         MOV   LED2,L4BIT2;
         MOV   LED1,L4BIT1;
         AJMP  LOOKALL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -