📄 v27源程序.asm
字号:
;******************************************;
; 绕线机计数器程序 ;
; 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 + -