翻出来的本科时单片机学科的一个课程设计,花了五天时间编写的汇编程序。
;-------------标识定义-----------------------------
IN0 EQU 7FF8H ;ad输入通道
ZXK EQU 0FFDCH ;字形口
ZWK EQU 0FFDDH ;字位口
XS EQU 23H ;显示缓存小数位
ZG EQU 22H ;个位
ZS EQU 21H ;十位
ZB EQU 20H ;百位
LS EQU 24H ;路数
T00 EQU 25H ;AD读入温度
T11 EQU 26H ;温度限缓存
T EQU 27H ;数值数码转换入口
TEMPH0 EQU 30H ;温度上限基址
TEMPL0 EQU 40H ;温度下限基址
;R0---------------------------------温度上限指针
;R1---------------------------------温度下限指针
;R2---------------------------------T0中断时间中50次
;R3---------------------------------8路
;R4---------------------------------AD中短延时
;-------------主程序-------------------------------
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_0
ORG 000BH
LJMP T_0
ORG 0013H
LJMP INT_1
ORG 0030H
MAIN: MOV SP, #60H ;初始化
MOV R2, #50 ;50*20ms
MOV XS, #0
MOV ZG, #0
MOV ZS, #0
MOV ZB, #0
CLR F0
MOV TMOD, #01H
MOV TH0, #0D8H ;20ms
MOV TL0, #0F0H
SETB EA
SETB ET0
SETB EX0
SETB EX1
;---------------------
SETB TR0 ;检查LED是否损坏
CLR P1.4
CLR P1.5
LCALL DISPLAY
CLR TR0
SETB P1.4
SETB P1.5
;--------------------
LOOP0: MOV DPTR, #IN0 ;传A/D基地址(IN0)
MOV LS, #00H
MOV R3, #08H
;-------------------- ;调用A/D读入子程序
LOOP1: LCALL READAD
MOV T00, A
LCALL ALERT ;调用报警判断子程序
CONTL: MOV T, A
SETB TR0
LCALL BIT_BCD ;调用数据数码转换程序
LCALL DISPLAY ;调用温度显示程序
INC DPTR
INC LS
DJNZ R3, LOOP1
SETB P1.6 ;喂狗
LJMP LOOP0
;-------------报警---------------------------------
ALERT: PUSH ACC ;入口参数T00
MOV R0, #TEMPH0
MOV R1, #TEMPL0
;-----------------
MOV A, LS ;T>TH的情况
ADD A, R0
MOV R0, A
MOV B, @R0
MOV A, T00
CJNE A, B, NEXTH
NEXTH: JC CONTH
LCALL RED
;-----------------
CONTH: MOV A, LS ;T
7,则LS=0
CJNE A, #08H, INEXT1
INEXT1: JC INEXT2
MOV LS, #00
INEXT2: MOV T, T11
LJMP IGOTO
;-----------------
IKEY4: INC T11
MOV A, T11 ;若T11>=FF,则T11=0
CJNE A, #0FFH, INEXT3
INEXT3: JC INEXT4
MOV T11 , #00H
INEXT4: LJMP INEXT6
;-----------------
IKEY5: DEC T11
MOV A, T11 ;若T11<0,则T11=FF
CJNE A, #00H, INEXT5
INEXT5: JNC INEXT6
MOV T11, #0FFH
INEXT6: MOV A, LS
ADD A, R0
MOV R0, A
MOV @R0, T11
MOV T, T11
IGOTO: LCALL BIT_BCD
ILY: MOV R7, #100
LP0: SETB F0
LCALL DISPLAY
DJNZ R6, LP0
DJNZ R7, ILY
LJMP KEY
IKEY6: RETI
;--------------温度下限设置------------------------
INT_1: MOV LS, #00H ;默认路数 0
MOV T11, #40H ;默认温度上限 75.0
MOV R0, TEMPL0
;-----------------
KEY: MOV A, #0FFH
MOV P1, A
MOV C, P1.0
JNC KEY3
MOV C, P1.1
JNC KEY4
MOV C, P1.2
JNC KEY5
MOV C, P1.3
JNC KEY6
LJMP LY
;-----------------
KEY3: INC LS
MOV A, LS ;若LS>7,则LS=0
CJNE A, #08H, NEXT1
NEXT1: JC NEXT2
MOV LS, #00
NEXT2: MOV T, T11
LJMP GOTO
;-----------------
KEY4: INC T11
MOV A, T11 ;若T11>=FF,则T11=0
CJNE A, #0FFH, NEXT3
NEXT3: JC NEXT4
MOV T11 , #00H
NEXT4 : LJMP INEXT6
;-----------------
KEY5: DEC T11
MOV A, T11 ;若T11<0,则T11=FF
CJNE A, #00H, NEXT5
NEXT5: JNC NEXT6
MOV T11, #0FFH
NEXT6: MOV A, LS
ADD A, R0
MOV R0, A
MOV @R0, T11
MOV T, T11
GOTO: LCALL BIT_BCD
LY: MOV R7, #100
MOV R6, #100
LP: SETB F0
LCALL DISPLAY
DJNZ R6, LP
DJNZ R7, LY
LJMP KEY
KEY6: RETI
END