📄 充气电缆气压自动监测系统.asm
字号:
JC COMP3 ;小于UP的高位,TO COMP3 ,去判断下限
JNZ COMP1 ;大于UP的高位,TO COMP1 置OVER=1
INC R0 ;等于UP的高位,继续判断
MOV A,ADBUFB
CLR C
SUBB A,@R0
JNC COMP1 ;大于等于UP的低位,TO COMP1 置OVER=1
DEC R0
COMP3:
INC R0
INC R0 ;DOWN
MOV A,ADBUFA
CLR C
SUBB A,@R0
JC COMP1 ;小于 DOWN的低位,TO COMP1,置OVER=1
JNZ COMP4 ;大于 DOWN的低位,TO COMP4, OVER=0,退出
INC R0 ;等于 继续判断
MOV A,ADBUFB
CLR C
SUBB A,@R0
JC COMP1 ;低位<DOWN
COMP4:
CLR OVER
AJMP COMP2
COMP1:
SETB OVER
COMP2:
RET
/****************************************
查表比较修改值是否合理,合理置标志OK为1
*****************************************/
CHECK:
MOV DPTR,#TAB ;表地址
MOV A,DMODE ;确定查表位置,与对应的路
RL A ;*2,每路气压占两个内存单元
ADD A,#40H
MOV R0,A
MOV A,DMODE
RL A
RL A
MOV R3,A
MOVC A,@A+DPTR
CLR C
SUBB A,@R0
JC CHECK3 ;UP1<修改值跳转,到CHECK3,清OK=0
JNZ CHECK4 ;UP1>修改值,跳到CHECK4,判断DOWN满足否
INC R0 ;UP1=修改值,继续判断UP2
INC R3
MOV A,R3
MOVC A,@A+DPTR
CLR C
SUBB A,@R0
JC CHECK3 ;UP2<修改值,清OK=0
DEC R0 ;回到前两位(DOWN1)
DEC R3
CHECK4: ;跳过来的要+2,否则+1
INC R3
INC R3
MOV A,R3
MOVC A,@A+DPTR
CLR C
SUBB A,@R0
JC CHECK1 ;DOWE1<修改值,置OK=1
JNZ CHECK3 ;DOWN1>修改值,清OK=0
INC R0 ;DOUN1<修改值,继续判断
INC R3
MOV A,R3
MOVC A,@A+DPTR
CLR C
SUBB A,@R0
JC CHECK1 ;DOWN2<修改值,置OK=1 。>= ,CLR OK
;也就是说,修改值<=下限值清0
CHECK3:
CLR OK
AJMP CHECK2
CHECK1:
SETB OK
CHECK2:
RET
/***********************************
刷新显示缓冲区
**********************************/
NEWBUF:
MOV R2,#02H ;A,R2,R0,R1
MOV A,DMODE
RL A
ADD A,#40H
MOV R0,A
MOV R1,#32H
NEWBUF1:
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R0
INC R1
DJNZ R2,NEWBUF1
RET
/************************************
刷新显示内容
***********************************/
DYP:
MOV R0,#35H ;R0,R2,R3
MOV R3,#80H
MOV R2,#06H
DYP1:
MOV A,R3
ACALL SENDHD
MOV A,@R0
CJNE R0,#34H,DYP2 ;小数点!
MOV R4,DMODE
CJNE R4,#9,DYP3 ;显示时间时不要小数点
AJMP DYP2
DYP3:
ORL A,#80H
DYP2:
ACALL SENDHD
DEC R0
INC R3
DJNZ R2,DYP1
RET
/***************************************
刷新闪烁位
*************************************/
SHINE:
MOV A,#88H ;闪烁
ACALL SENDHD
MOV A,FLASH
ACALL SENDHD
RET
/*****************************************************************************
尺度变换,将000H对应0,将FFF对应2000。根据分析,可以将数据乘125,再除256。乘(128-3)可这样得到,先左移7位,再减原来数的2倍,再减原数值。除以256相当于右移8位。
*****************************************************************************/
RULE:
MOV R3,ADBUFA
MOV R4,ADBUFB
MOV R5,#0
MOV R2,#7
RULE1:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
DJNZ R2,RULE1
MOV R7,ADBUFA ;-2*
MOV R6,ADBUFB
CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
JNC RULE2
DEC R5
RULE2:
CLR C
MOV A,R3 ;-1*
SUBB A,ADBUFB
MOV R3,A
MOV A,R4
SUBB A,ADBUFA
MOV R4,A
JNC RULE3
DEC R5
RULE3:
CLR C
MOV R2,#8
RULE4:
MOV A,R5
RRC A
MOV R5,A
MOV A,R4
RRC A
MOV R4,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R2,RULE4
MOV ADBUFB,R3
MOV ADBUFA,R4
RET
/**********************************
通信程序,内容有各路气压及时间
*********************************/
RS232:
MOV R0,#40H ;传送0路气压值
MOV A,@R0
ACALL SERIAL
INC R0
MOV A,@R0
ACALL SERIAL
MOV R0,#46H ;传送3路气压值
MOV A,@R0
ACALL SERIAL
INC R0
MOV A,@R0
ACALL SERIAL
MOV R0,#4CH ;传送6路气压值
MOV A,@R0
ACALL SERIAL
INC R0
MOV A,@R0
ACALL SERIAL
MOV R0,#52H ;传送时间
MOV R2,#04H
RET
SER1:
MOV A,@R0
ACALL SERIAL
INC R0
DJNZ R2,SER1
RET
SERIAL:
MOV SBUF,A ;发送子程序
JNB TI,$ ;等待,查询TI
CLR TI ;查询结束,清TI
RET
/***************************************
读时钟芯片
***************************************/
RDTIME:
MOV A,#83H ;分钟寄存器
ACALL READT ;调读DS1302子程序
MOV MINUTE,A ;将分钟存于MINUTE单元
MOV A,#85H ;小时寄存器
ACALL READT ;调读DS1302子程序
MOV HOUR,A ;将小时存于HOUR单元
RET
READT:
SETB T_RST ;启动
MOV R2,#8 ;循环8次
TIMEL1:
RRC A ;写8位,控制字
MOV T_PIO,C ;写1位给DS1302
NOP
NOP
SETB T_SCLK ;发一个时钟信号
NOP
NOP
CLR T_SCLK
DJNZ R2,TIMEL1 ;循环8次
NOP
NOP
SETB T_PIO
CLR A
CLR C
MOV R2,#8 ;循环8次
TIMEL2:
MOV C,T_PIO ;读1位
RRC A ;存于A
NOP
NOP
SETB T_SCLK ;发一时钟脉冲
NOP
NOP
CLR T_SCLK
DJNZ R2,TIMEL2 ;8次
RET
/**********************************
启动AD转换器
*********************************/
RD_AD:
CLR AD_CLK
SETB AD_CS
CLR AD_CS ;开始一个工作周期
MOV R4,#08 ;循环8次
MOV A,R7 ;通道值送A
SWAP A ;高低4位交换,使A成为控制字,控制字的底4位为0
AD1:
MOV C,DOUT ;取TLC2543输出的一位数
RLC A
MOV DIN,C ;控制字一位给TLC2543
SETB AD_CLK ;产生一个时钟脉冲
CLR AD_CLK
DJNZ R4,AD1 ;循环8次
MOV ADBUFA,A ;高8位存于ADBUFA
MOV A,#00H
MOV R4,#04H ;循环4次,取低4位
AD2:
MOV C,DOUT ;取TLC2543输出的一位数
RLC A
SETB AD_CLK ;产生一个时钟脉冲
CLR AD_CLK
DJNZ R4,AD2 ;循环4次
MOV ADBUFB,A ;低4位给ADBUFB
SETB AD_CS ;关闭TLC2543
RET
/****************************
写HD7279
******************************/
SENDHD: ;写8位
MOV R7,#08H
CLR CS ;使能有效
CALL LONG_DELAY ;长延时
SEND_LOOP:
RLC A ;将A中的值送入
MOV DAT,C ;送一位
SETB CLK ;发时钟脉冲
CALL SHORT_DELAY ;短延时
CLR CLK
DJNZ R7,SEND_LOOP ;8次
RET
读HD7279的键值:
READHD:
MOV R7,#08H ;读8次
SETB DAT ;先写1
CALL LONG_DELAY 长延时
READ_LOOP:
SETB CLK ;发时钟脉冲
CALL SHORT_DELAY
RL A
MOV C,DAT
MOV ACC.0,C ;存于A
CLR CLK
CALL SHORT_DELAY ;短延时
DJNZ R7,READ_LOOP
MOV KYE,A ;将键值存放与KYE单元
RET
LONG_DELAY:
MOV TIMER,#25 ;约50us延时
DELAY_LOOP:
DJNZ TIMER,DELAY_LOOP
RET
SHORT_DELAY:
MOV TIMER,#4 ;约8us延时
SHORT_LP:
DJNZ TIMER,SHORT_LP
RET
/*******************************
修改前保存先前值
******************************/
SAVE:
MOV A,DDMODE
RL A ;*2
ADD A,#40H
MOV R0,A
MOV SETBUFA,@R0
INC R0
MOV SETBUFB,@R0
RET
/*****************************************
修改值不合理时,将先前值写回
****************************************/
RESAVE:
MOV A,DDMODE
RL A
ADD A,#40H
MOV R0,A
MOV @R0,SETBUFA
INC R0
MOV @R0,SETBUFB
RET
/**********************************
格式调整,要将输入的0~9转换到相应压缩BCD位
**********************************/
REGULATE:
MOV A,DMODE
RL A
ADD A,#40H
MOV R0,A
JNB FLASH_A,REG1
MOV A,@R0
SWAP A
MOV @R0,A ;1
MOV A,KYE
XCHD A,@R0
MOV A,@R0
SWAP A
MOV @R0,A
MOV FLASH,#00000100B
AJMP REG5
REG1:
JNB FLASH_B,REG2
MOV A,KYE
XCHD A,@R0
MOV FLASH,#00000010B
AJMP REG5
REG2:
INC R0
JNB FLASH_C,REG3
MOV A,@R0
SWAP A
MOV @R0,A ;1
MOV A,KYE
XCHD A,@R0
MOV A,@R0
SWAP A
MOV @R0,A
MOV FLASH,#00000001B
AJMP REG5
REG3:
MOV A,KYE
XCHD A,@R0
MOV FLASH,#00001000B
REG5:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -