📄 shuzizhong.asm
字号:
ADCS BIT P3.5 ;使能接口
ADCLK BIT P3.4 ;时钟接口
ADDO BIT P3.3 ;数据输出接口(复用)
ADDI BIT P3.3 ;数据输入接口
KG EQU P1.3 ;KG为切换时钟显示于水位显示开关
SW1 EQU P1.0 ;调时按钮下降沿有效
SW2 EQU P1.1 ;时加1按钮下降沿有效
SW3 EQU P1.2 ;分加1按钮下降沿有效
;************************************************************
;主程序和中断程序入口
;************************************************************
ORG 0000H
LJMP START
ORG 000BH
LJMP INT00 ;250微秒中断
ORG 0030H
;**************************************************************
;程序初始化
;**************************************************************
START: MOV P1, #0FFH ;置p1口为输入口
MOV 5FH, #0FFH ;把p1口的健值放入5FH单元里
MOV B, #02H ;装入通道功能选择数据值
MOV SP, #60H
MOV TMOD, #02H ;选定工作方式二
MOV TH0, #06
MOV TL0, #06 ;设定计数250微秒
MOV R3, #200
MOV R4, #20 ;设定循环次数
SETB EA
SETB ET0
SETB TR0 ;启动定时器
;********************************************************
MOV 30H, #11H
MOV 31H, #12H
MOV 32H, #12H ;开机显示12:12
;*********************************************************
MAIN: JB KG, SW ;转水位测试和显示
LCALL SZXS ;SZXS为时钟显示子程序
SJMP MAIN
SW: LCALL SUIWEI
SJMP MAIN
;***********************************************************
;时钟显示子程序
;***********************************************************
SZXS: LCALL CAIBCD ;调用拆BCD码子程序
LCALL DIP ;调用数码管显示子程序
LCALL TIAOSHI ;调用调整时钟子程序
RET
;****************************************************
;数码管时钟显示程序
;****************************************************
DIP: MOV R6, #0FBH ;用于数码管逐个显示的段选码
MOV R0, #41H ;送显示数据的首地址
MOV DPTR, #TAB ;送查表指令的首地址
MOV R5, #04 ;数码管动态显示一次的次数
LOOP1:
MOV A, R6 ;把位选地址送给A
MOV P0, A ;把地址送给p0口
RR A ;右移A让下个数码管显示
MOV R6, A ;回存到r6中
MOV A, @R0 ;取字符显示
MOVC A, @A+DPTR
MOV P2, A
LCALL DELAY ; 延时一毫秒
MOV P2, #0FFH ;消除鬼阴
INC R0
DJNZ R5,LOOP1
RET
;******************************************************************
;30~32H中的数据拆分到41~46H中
;******************************************************************
CAIBCD: MOV R7, #6 ;设拆分的次数使程序循环
MOV R0, #30H ;时间的首地址
MOV R1, #41H ;拆分后时间存放的首地址
FANHUI: MOV A, @R0
SWAP A
ANL A, #0FH
MOV @R1, A
MOV A, @R0
ANL A, #0FH
INC R1
MOV @R1, A
INC R0
INC R1
DJNZ R7, FANHUI
RET
;***************************************************
;延时一毫秒子程序
;***************************************************
DELAY: MOV R7,#1
DML1: MOV R2,#3
DML2: MOV R1,#10
DML3: DJNZ R1,DML3
DJNZ R2,DML2
DJNZ R7,DML1
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9的数据查表
;***********************************************************
;250微秒中断入口程序
;***********************************************************
INT00: PUSH ACC
PUSH PSW ;保护现场
SETB RS0
DJNZ R3, GO
MOV R3, #200
DJNZ R4, GO
MOV R4, #20 ;设循环次数4000
MOV A, 32H
ADD A, #01H
DA A
MOV 32H, A
CJNE A,#60H, GO
MOV 32H, #00H
MOV A, 31H
ADD A, #01H
DA A
MOV 31H, A
CJNE A,#60H, GO
MOV 31H, #00H
MOV A, 30H
ADD A, #01H
DA A
MOV 30H, A
CJNE A,#24H, GO
MOV 30H, #00H
GO: POP PSW
POP ACC
RETI
;**********************************************************
;按钮扫描子程序的入口
;**********************************************************
KEY: MOV A, P1
ORL A, #0F7H ;屏蔽高5位
CJNE A,5FH, HAVE ;若不等则说明有键按下
NOKEY: MOV A, #0FFH
AJMP RET1
HAVE: MOV 5FH, A
JNC NOKEY ;判断是否为下降沿处发
RET1: RET
;**********************************************************
;调时子程序入口
;**********************************************************
TIAOSHI:
LCALL KEY
JB ACC.0, RET2 ;若ACC.0=0,则调时按钮sw1按下,进入调时循环
AA: JB KG, RET2 ;总开关
LCALL CAIBCD
LCALL DIP ;用于数码管显示,否则会熄灭
LCALL KEY
JNB ACC.0, RET2 ;SW1再次按下退出调时程序
JB ACC.1, NEXT
MOV A,30H
ADD A,#01H
DA A
MOV 30H,A
CJNE A,#24H,AA
MOV 30H,#00H
SJMP AA
NEXT: JB ACC.2, AA
MOV A,31H
ADD A,#01H
DA A
MOV 31H,A
CJNE A,#60H,AA
MOV 31H,#00H
SJMP AA
RET2: RET
;******************************************************
;水位测控子程序
;******************************************************
SUIWEI: NOP
RET
;*****************************************************
;ADC0832转换子程序且把数据存放在33H中
;*****************************************************
ADCONV:
SETB ADDI ;初始化通道选择
NOP
NOP
CLR ADCS ;拉低/CS端
NOP
NOP
SETB ADCLK ;拉高CLK端
NOP
NOP
CLR ADCLK ;拉低CLK端,形成下降沿
MOV A,B
MOV C,ACC.1 ;确定取值通道选择
MOV ADDI,C
NOP
NOP
SETB ADCLK ;拉高CLK端
NOP
NOP
CLR ADCLK ;拉低CLK端,形成下降沿2
MOV A,B
MOV C,ACC.0 ;确定取值通道选择
MOV ADDI,C
NOP
NOP
SETB ADCLK ;拉高CLK端
NOP
NOP
CLR ADCLK ;拉低CLK端,形成下降沿3
SETB ADDI
NOP
NOP
MOV R7,#8 ;准备送下后8个时钟脉冲
AD_1: MOV C,ADDO ;接收数据
MOV ACC.0,C
RL A ;左移一次
SETB ADCLK
NOP
NOP
CLR ADCLK ;形成一次时钟脉冲
NOP
NOP
DJNZ R7,AD_1 ;循环8次
MOV C,ADDO ;接收数据 接收数据的最后一位
MOV ACC.0,C
MOV B,A
MOV R7,#8
AD_13: MOV C,ADDO ;接收数据
MOV ACC.0,C
RR A ;右移一次
SETB ADCLK
NOP
NOP
CLR ADCLK ;形成一次时钟脉冲
NOP
NOP
DJNZ R7,AD_13 ;循环8次
CJNE A,B,ADCONV ;数据校验
MOV 33H,A ;把数据存放在30H单元中
SETB ADCS ;拉高/CS端
CLR ADCLK ;拉低CLK端
SETB ADDO ;拉高数据端,回到初始状态
RET
;******************************************************
;把所测数据转换成水位的子程序 ,显示数据转为3位码存入47H,48H,49H
;******************************************************
TUNBCD: MOV A, 33H
MOV B, #51
DIV AB
MOV 49H, A
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10
MUL AB
MOV B,#51
DIV AB
JB F0,LP2
ADD A,#5
LP2: MOV 48H,A
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10
MUL AB
MOV B,#51
DIV AB
JB F0,LP3
ADD A,#5
LP3: MOV 47H,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -