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

📄 pm521.asm

📁 给予主从式单片机的胶带跑篇报警系统
💻 ASM
📖 第 1 页 / 共 3 页
字号:
     ORG 0000H
STAR:LJMP MAIN
     ORG 0003H
     LJMP ITP0             ;INT0中断
     ORG 000BH
     LJMP TIM0             ;T0中断
     ORG 0013H
     LJMP PKEY             ;INT1中断
;**************************
     ORG 0030H
MAIN:MOV SP,#0C0H          ;堆栈
     MOV P1,#0E3H          ;P1='11100011','000'三个LED灭 
     LCALL DELY 
     LCALL DELY
     LCALL DELY
     LCALL LCDF 
     MOV DPTR,#TAB0        
     MOV CNTZ,#16          
     MOV A,#90H            ;'胶带跑偏报警系统'(L2),10010000,设定10H到地址计数器AC           
     LCALL SENC
     LCALL DSCL 
     
     MOV DPTR,#TAB1
     MOV CNTZ,#16
     MOV A,#98H            ;'江苏中显机械公司'(L3),10011000,设定18H到地址计数器AC 
     LCALL SENC
     LCALL DSCL 
     
     MOV R0,#08H
     MOV B,#0F8H
     CLR A
     
MLP1:MOV @R0,A             ;清内部RAM区
     INC R0
     DJNZ B,MLP1  
     
     MOV DPTR,#8001H       ;8279初始化,8000H数据,8001H命令
     MOV A,#0D1H           ;11010001,显示RAM所有单元清零
     MOVX @DPTR,A
MLP2:MOVX A,@DPTR
     JB ACC.7,MLP2         ;等DU=0,即清除操作完成,需时约160us

     MOV A,#00H            ;8279初始化,编码扫描,键盘输入,两键互锁
     MOVX @DPTR,A
     
     MOV A,#34H            ;00110100,扫描频率为外部时钟20分频
     MOVX @DPTR,A
     
     MOV DPTR,#0100H
     MOV A,#0FFH
     MOV R7,#0FFH
MLP3:MOVX @DPTR,A          ;清外部RAM区(0FFH),清除256B外部RAM????
     INC DPTR
     DJNZ R7,MLP3
     
     MOV TMOD,#21H         ;定时器初始化,00100001,T1方式2波特率发生器,T0方式1,16位定时
     MOV TH0,#4CH          ;T0定时50MS
     MOV TL0,#00H
     MOV PCON,#00H         ;串口初始化
     MOV SCON,#50H         ;01010000,串口方式1,接受允许 
     MOV TH1,#0FDH         ;波特率9600
     MOV TL1,#0FDH
     
     MOV DPTR,#8201H       ;8251初始化,8200H数据口,8201H命令口	
     MOV A,#4EH            ;方式选择:01001110,两个同步字符,外同步,无奇偶校验,字符长8位,波特率系数*16
     MOVX @DPTR,A     
     MOV A,#15H            ;命令指令:00010101,错误标志复位,正常工作接受允许,数据终端准备好,发送允许
     MOVX @DPTR,A   
     
     
     MOV CNT0,#00          ;T0中断次数计数器 

     SETB IT0              ;T0 T1下降沿有效 
     SETB IT1
     SETB EX0              ;开放INT0 INT1 SIO中断
     SETB EX1
     SETB EA
     SETB TR1              ;启动T1工作
     
;************************************************************     
KEYS:MOV BUFK,#80H         ;清除键值缓冲单元(BUFK键值缓冲单元)
MAN1:JNB 07H,KEYW          ;尚未运行,转判键         
MAN2:JNB 02H,MAN3          ;判访问下位机标志
     CLR 02H 
     LCALL XCAL            ;访问下位机,显示下位机信息
     JNB 03H,MAN3          ;无问题标志,转
     CLR 03H
     LCALL SAVE            ;有问题,存相应数据(时间、位置、状态)
     LCALL SEPC            ;向上位PC发
     JNB 08H,MAN3
     CLR 07H               ;强停机,清运行标志
     CLR 0FH
     SETB P1.4             ;红灯亮
     MOV DPTR,#TABP 
     MOV CNTZ,#16          
     MOV A,#80H            ;'**系统暂停工作**'(L1)           
     LCALL SENC
     LCALL DSCL 
     LCALL SSSS            ;显示强停机的信息
     SJMP KEYS
     
MAN3:JNB 10H,KEYW          ;判秒标志
     CLR 10H
     JB 0FH,KEYW           ;查询时,显示的是故障时间
     LCALL TINC            ;修改显示时间
     
KEYW:MOV A,BUFK            ;判键
     JNB ACC.7,KYON        ;有键按下(ACC.7='0')转
     SJMP MAN1             ;无键盘按下等待
     
KYON:MOV B,#03H
     MOV DPTR,#KPRG
     MUL AB
     JMP @A+DPTR
     
KPRG:LJMP KEY0
     LJMP KEY1
     LJMP KEY2
     LJMP KEY3
     LJMP KEY4
     LJMP KEY5
     LJMP KEY6
     LJMP KEY7
     LJMP KEY8     
     LJMP KEY9
     LJMP KEYA
     LJMP KEYB
     LJMP KEYC
     LJMP KEYD
     LJMP KEYE
     LJMP KEYF     
     
KEY0:MOV BFDA,#00H         ;保存输入的数字
     LJMP PKDA
KEY1:MOV BFDA,#01H
     LJMP PKDA
KEY2:MOV BFDA,#02H
     LJMP PKDA
KEY3:MOV BFDA,#03H
     LJMP PKDA
KEY4:MOV BFDA,#04H
     LJMP PKDA
KEY5:MOV BFDA,#05H
     LJMP PKDA
KEY6:MOV BFDA,#06H
     LJMP PKDA
KEY7:MOV BFDA,#07H
     LJMP PKDA
KEY8:MOV BFDA,#08H
     LJMP PKDA
KEY9:MOV BFDA,#09H
     LJMP PKDA
     
KEYA:LCALL STOP            ;停机键处理子程序      
     LJMP KEYS
KEYB:LCALL KRUN            ;运行键处理子程序
     LJMP KEYS
KEYC:LCALL KSET            ;参数设置键处理子程序
     LJMP KEYS
KEYD:LCALL ENTR            ;参数确认键处理子程序
     LJMP KEYS
KEYE:LCALL SECH            ;查询键处理子程序(乒乓功能)
     LJMP KEYS
KEYF:LCALL SDEC            ;查询地址减处理
     LJMP KEYS
;**********************
PKDA:JB 07H,EPKD           ;运行状态,数字键无效
     JB 0FH,EPKD           ;查询状态,数字键无效
     JB 11H,PAD0
     JB 12H,PAD0
     JB 13H,PAD0
EPKD:LJMP KEYS             ;非参数设置状态,数字键无效 

PAD0:MOV A,#30H
     ADD A,BFDA            ;数字-->ASCII-->显示缓冲单元
     MOV DADP,A 
     JNB 11H,PAD1          ;时间设置标志11H='1'
     LCALL KDL1            ;时间设置数字输入处理
     LJMP KEYS
PAD1:JNB 12H,PAD2          ;下位机数目设置标志12H='1'
     LCALL KDL2            ;下位机数目设置数字输入处理
     LJMP KEYS             
PAD2:JNB 13H,EPKD          ;速度设置标志13H='1'
     LCALL KDL3            ;速度设置数字输入处理
     LJMP KEYS
     NOP
     NOP
     NOP

SDDY:MOV A,BFDA
     MOV @R0,A             ;保存数字(在工作区WOK2) 
     INC R0
     MOV A,DADP            ;数字(ASCII码)送显示
     LCALL SEND
     RET
     NOP
     NOP
     NOP
     
KDL1:INC CONT              ;数字输入计数器+1
     MOV A,CONT            ;时间设置(12个数字)
     CJNE A,#01H,KD10
     MOV A,#89H            ;第一个显示位置(L3.3) '--01年01月01日--'
     LCALL SENC            ;10001001,设定09H到地址计数器AC
     LCALL SDDY            ;保存1#数字并送显示
     LJMP EKD1
KD10:CJNE A,#02H,KD11
     LCALL SDDY            ;保存2#数字并送显示
     MOV A,#8BH            ;第二个显示位置(L3.7)
     LCALL SENC            ;10001011,设定0BH到地址计数器AC
     LJMP EKD1
KD11:CJNE A,#03H,KD12
     LCALL SDDY            ;保存3#数字并送显示
     LJMP EKD1
KD12:CJNE A,#04H,KD13
     LCALL SDDY            ;保存4#数字并送显示
     MOV A,#8DH            ;第三个显示位置(L3.11)
     LCALL SENC
     LJMP EKD1
KD13:CJNE A,#05H,KD14
     LCALL SDDY            ;保存5#数字并送显示
     LJMP EKD1
KD14:CJNE A,#06H,KD15
     LCALL SDDY            ;保存6#数字并送显示
     MOV A,#99H            ;第四个显示位置(L4.3)'--01时01分01秒--'
     LCALL SENC
     LJMP EKD1
KD15:CJNE A,#07H,KD16
     LCALL SDDY            ;保存7#数字并送显示
     LJMP EKD1
KD16:CJNE A,#08H,KD17
     LCALL SDDY            ;保存8#数字并送显示
     MOV A,#9BH            ;第五个显示位置(L4.7)
     LCALL SENC
     LJMP EKD1
KD17:CJNE A,#09H,KD18
     LCALL SDDY            ;保存9#数字并送显示
     LJMP EKD1
KD18:CJNE A,#0AH,KD19
     LCALL SDDY            ;保存10#数字并送显示
     MOV A,#9DH            ;第五个显示位置(L4.7)
     LCALL SENC
     LJMP EKD1
KD19:CJNE A,#0BH,KD1A
     LCALL SDDY            ;保存11#数字并送显示
     LJMP EKD1
KD1A:CJNE A,#0CH,EKD1
     LCALL SDDY            ;保存12#数字并送显示
     MOV A,#89H            ;显示位置重新返回(L3.3)
     LCALL SENC
     MOV CONT,#00H         ;清数字输入计数器
     MOV R0,#WOK2          ;输入数字暂存区首址WOK2
EKD1:RET
     NOP
     NOP
     NOP
     
KDL2:INC CONT              ;数字输入计数器+1       
     MOV A,CONT            ;数目设置(3个数字)
     CJNE A,#01H,KD20
     MOV A,#8AH            ;第一个显示位置(L3.5)  
     LCALL SENC
     LCALL SDDY            ;保存1#数字并送显示
     LJMP EKD2
KD20:CJNE A,#02H,KD21
     LCALL SDDY            ;保存2#数字并送显示
     MOV A,#8BH            ;第二个显示位置(L3.7)
     LCALL SENC
     LJMP EKD2
KD21:CJNE A,#03H,EKD2
     LCALL SDDY            ;保存3#数字并送显示
     MOV A,#8AH            ;回到1#位置
     LCALL SENC
     MOV CONT,#00H         ;清数字输入计数器
     MOV R0,#WOK2          ;输入数字暂存区首址WOK2
EKD2:RET
     NOP
     NOP
     NOP
     
KDL3:MOV A,#8AH            ;速度设置(1个数字)
     LCALL SENC
     MOV A,BFDA            ;保存数字并送显示
     MOV WOK2,A 
     MOV A,DADP            
     LCALL SEND 
     MOV A,#8AH            ;回到1#位置
     LCALL SENC
     RET
     NOP
     NOP
     NOP  
     
DSCL:CLR A                 ;将ROM内容直接送显示
     MOVC A,@A+DPTR        ;内容(DPTR),字节数(CNTZ)
     LCALL SEND
     INC DPTR
     DJNZ CNTZ,DSCL
     RET
     NOP
     NOP
     NOP
     
KSET:JB 01H,SET1           ;有手动停机标志,直接进入设置
     JB 07H,ESET                       
     JB 0FH,ESET           ;运行或查询时本键无效          
SET1:MOV A,#01H            ;清屏
     LCALL SENC
     MOV DPTR,#TABS        
     MOV CNTZ,#16          
     MOV A,#80H            ;显示'**系统参数设置**'(L1)           
     LCALL SENC
     LCALL DSCL 
     MOV DPTR,#TAB2
     MOV CNTZ,#16
     MOV A,#90H            ;'请输入当前时间: '(L2)   
     LCALL SENC
     LCALL DSCL    
     CLR A
     MOV R0,#WOK2          ;工作区充零
     MOV B,#16
SETL:MOV @R0,A
     INC R0
     DJNZ B,SETL
     MOV DPTR,#TAB3        ;显示预置时间
     MOV CNTZ,#16
     MOV A,#88H            ;'  00年00月00日  '(L3)                
     LCALL SENC
     LCALL DSCL            
     MOV DPTR,#TAB4
     MOV CNTZ,#16
     MOV A,#98H            ;'  00时00分00秒  '(L4)    
     LCALL SENC
     LCALL DSCL
     MOV A,#89H            ;在**年位置上数字反白闪烁
     LCALL SENC
     MOV A,#0DH
     LCALL SENC
     MOV CONT,#00H         ;清数字输入计数器
     MOV R0,#WOK2          ;输入数字暂存区首址WOK2 
     SETB 11H              ;置时间设置标志 
ESET:RET 
     NOP
     NOP
     NOP
     
ENTR:JB 07H,EENT           ;参数确认键处理子程序                          
     JB 0FH,EENT           ;运行或查询时,本键无效                  
     JB 11H,ENT0
     SJMP ENT1 
ENT0:LCALL STIM            ;时间设置确认
     SJMP EENT
ENT1:JB 12H,ENT2
     SJMP ENT3
ENT2:LCALL SNUM            ;下位机数目设置确认
     SJMP EENT 
ENT3:JB 13H,ENT4
     SJMP EENT 
ENT4:LCALL SSPD            ;速度设置确认   
EENT:RET 
     NOP
     NOP
     NOP  
     
DBCD:MOV A,@R0             ;二字节BCD-->单字节二进制数
     MOV B,#10             ;(R0)-->R2,BCD高位在前
     MUL AB
     INC R0
     ADD A,@R0
     MOV R2,A
     RET 
     NOP
     NOP
     NOP  
     

STIM:MOV R0,#WOK2          ;判时间设置是否正确 
     LCALL DBCD
     MOV A,R2
     MOV R7,A              ;设置的年(BCD)-->R7(二进制数)
     MOV B,#04             ;判闰年
     DIV AB
     MOV A,B
     JZ STM0
     CLR 0EH               ;清闰年标志
     SJMP STM1
STM0:SETB 0EH              ;置闰年标志0EH='1'
STM1:INC R0                ;指向月 
     LCALL DBCD                      
     MOV A,R2
     JNZ STM2              
     LJMP ERTM             ;月设置值='0',错      
STM2:CLR C
     SUBB A,#13
     JC STM3
     LJMP ERTM             ;月设置值>12,错
STM3:MOV A,R2
     MOV R6,A              ;月(BCD)-->R6(二进制数)
     INC R0                ;指向日
     LCALL DBCD                      
     MOV A,R2
     MOV R5,A              ;日(BCD)-->R5(二进制数)
     MOV A,R6              ;判月份
     CLR C
     SUBB A,#08          
     JNC STM8              ;>=8月份,转STM8
     MOV A,R6
     CJNE A,#02,STM5       ;<8月份,但不是2月份,转STM5
     JB 0EH,STM4           ;闰年2月份,转STM4
     MOV A,R5   
     CLR C           
     SUBB A,#29
     JC STM9             
     LJMP ERTM             ;非闰年2月份,日设置值>28,错                
STM4:MOV A,R5
     CLR C
     SUBB A,#30
     JC STM9
     LJMP ERTM             ;闰年2月份,日设置值>29,错
STM5:MOV A,R6              ;<8月份        
     RRC A             
     JNC STM7              ;<8月份的双月(30天)
STM6:MOV A,R5              ;<8月份的单月(31天)             
     CLR C
     SUBB A,#32            
     JC STM9
     LJMP ERTM             ;日设置值>31,错
STM7:MOV A,R5               
     CLR C
     SUBB A,#31           
     JC STM9
     LJMP ERTM             ;日设置值>30,错   
STM8:MOV A,R6              ;>=8月份
     RRC A
     JNC STM6              ;>=8月份的双月(31天) 
     SJMP STM7             ;>=8月份的单月(30天)
STM9:INC R0                ;指向时
     LCALL DBCD                      
     MOV A,R2
     MOV R4,A              ;时(BCD)-->R4(二进制数)
     CLR C
     SUBB A,#24
     JC STMA
     LJMP ERTM             ;时设置值>=24,错
STMA:INC R0                ;指向分
     LCALL DBCD                      

⌨️ 快捷键说明

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