📄 国旗升降控制系统的设计与实现.txt
字号:
3.系统程序清单
A8255 EQU 0FF7CH ;A口位选码 0/1/2/3键盘扫描
B8255 EQU 0FF7DH ;B口段位码
C8255 EQU 0FF7EH ;C口输入 0/1/2/3键盘扫描
D8255 EQU 0FF7FH ;控制口
JIANZHI EQU 21H ;GETKEY获得的键值存储空间
SAOM1 EQU 22H ;扫描1
SAOM2 EQU 23H ;扫描2
BIJIAO EQU 24H ;判断当前位置与设定值得大小
TOP BIT 00H ;是否上升到顶端
BOTTOM BIT 01H ;是否下降到底端
UPING BIT 02H ;上升状态
DOWNING BIT 03H ;下降状态
MTD EQU 77H ;C51中发往24C02数据存储单元首址(用于存储24C02内存储单元首址)
;不论往24C02写数据还是读数据都应该先向24C02写入一个24C02内存储单元首址的字节
MRD EQU 78H ;C51中接收24C02数据存储单元首址
NUMBYT EQU 70H ;读写24C02字节个数
SLA EQU 10H ;24C02中读写存储单元首址
CUNZUS EQU 33H ;存储组数
SLAW EQU 0A0H ;24C02写地址
SLAR EQU 0A1H ;24C02读地址
VSDA EQU P1.6 ;串行传输数据线
VSCL EQU P1.7 ;串行传输时钟线
;78h,79h,7ah实时显示国旗位置
;7dh,7eh,7fh显示输入的要到达的位置
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0013H
LJMP INTEX1 ;外部中断1,负脉冲时计圈数
MAIN: MOV SP,#60H
MOV A,#89H
MOV DPTR,#D8255
MOVX @DPTR,A
;LCALL DIS8SHAN
LCALL CLEARMEN
MOV MTD,#10H
LCALL RDE2PROM
MOV 43H,78H
MOV 42H,79H
MOV 41H,7AH
WAIT: LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0AH,KEYB
JB TOP,WAIT
LCALL UP ; 调上升子程序
SJMP WAIT
KEYB: CJNE A,#0BH,KEYC
JB BOTTOM,WAIT
LCALL DOWN ;调下降子程序
SJMP WAIT
KEYC: CJNE A,#0CH,KEYD
LCALL BANQI ;调半旗程序
SJMP WAIT
KEYD: CJNE A,#0DH,KEYF
LCALL AUTO ;调自动程序
SJMP WAIT
KEYF: CJNE A,#0FH,WAIT ;F键复位
AJMP MAIN
CLEARMEN:MOV A,#00H
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV 24H,A
MOV 25H,A
MOV 26H,A
MOV 27H,A
MOV 28H,A
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV 7BH,#12H
MOV 7CH,#12H
MOV 7DH,#12H
MOV 7EH,#12H
MOV 7FH,#12H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
SETB ET0
SETB EX1
SETB IT1
SETB EA
RET
;-----------------------------
; 上升子程序
;-----------------------------
UP:
SETB UPING ;上升过程
ULOP: LCALL ZTIAO
; CLR P1.1
; LCALL DIS
LCALL MUSIC
MOV A,78H
CJNE A,#00H,ULOP
MOV A,79H
CJNE A,#07H,ULOP
MOV A,7AH
CJNE A,#05H,ULOP
SETB TOP;上升到最高点,置标志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制动
CLR P1.0
LCALL DL1
;SETB P1.1
SETB P1.0
RET
;------------------------
; 下降子程序
;------------------------
DOWN:
SETB DOWNING ;下降过程
MOV P1,#0FFH
DLOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,#00H,DLOP
MOV A,79H
CJNE A,#00H,DLOP
MOV A,7AH
CJNE A,#00H,DLOP
SETB BOTTOM ;到最低点,置标志位
CLR TOP
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制动
CLR P1.1
LCALL DL1
MOV P1,#0FFH ;停止
RET
;----------------------
; 半旗子程序
;----------------------
BANQI: CLR P1.3
LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0AH,BQLOPD
LCALL UP
SETB DOWNING ;下降过程
BDLOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,#00H,BDLOP
MOV A,79H
CJNE A,#00H,BDLOP
MOV A,7AH
CJNE A,#06H,BDLOP
SETB BOTTOM ;到最低点,置标志位
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制动
CLR P1.1
LCALL DL1
MOV P1,#0FFH
SJMP BANQI
BQLOPD: CJNE A,#0BH,BANQI
SETB UPING ;上升过程
BULOP: CLR P1.1
LCALL DIS
MOV A,78H
CJNE A,#00H,BULOP
MOV A,79H
CJNE A,#01H,BULOP
MOV A,7AH
CJNE A,#00H,BULOP
SETB TOP ;上升到最高点,置标志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制动
CLR P1.0
LCALL DL1
MOV P1,#0FFH ;停止
LCALL DOWN
RET
;--------------------------------
;自动子程序
;--------------------------------
AUTO: LCALL GETKEY
MOV 7DH,JIANZHI
LCALL GETKEY
MOV 7EH,JIANZHI
LCALL GETKEY
MOV 7FH,JIANZHI
LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0EH,BACK
LCALL CMP
LCALL DIS
MOV A,26H
CJNE A,#01H,EXT0
LCALL ZHENG
JMP EXT2
EXT0: CJNE A,#02H,EXT2
LCALL FAN
JMP EXT2
EXT2: MOV P1,#0FFH
RET
BACK: MOV 7DH,#00H
MOV 7EH,#00H
MOV 7FH,#00H
JMP AUTO
RET
CMP: MOV A,78H
SUBB A,7DH
JC QEXT
MOV A,78H
CJNE A,7DH,NEXT1
MOV A,79H
SUBB A,7EH
JC QEXT
MOV A,79H
CJNE A,7EH,NEXT1
MOV A,7AH
SUBB A,7FH
JC QEXT
MOV A,7AH
CJNE A,7FH,NEXT1
MOV 26H,#00H
SJMP QE
QEXT: MOV 26H,#01H
SJMP QE
NEXT1: MOV 26H,#02H
QE: RET
ZHENG: SETB UPING ;上升过程
UOP: CLR P1.1
LCALL DIS
MOV A,78H
CJNE A,7DH,UOP
MOV A,79H
CJNE A,7EH,UOP
MOV A,7AH
CJNE A,7FH,UOP
SETB TOP;上升到最高点,置标志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制动
CLR P1.0
LCALL DL1
MOV P1,#0FFH ;停止
RET
FAN: SETB DOWNING ;下降过程
MOV P1,#0FFH
DOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,7DH,DOP
MOV A,79H
CJNE A,7EH,DOP
MOV A,7AH
CJNE A,7FH,DOP
SETB BOTTOM ;到最低点,置标志位
CLR TOP
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制动
CLR P1.1
LCALL DL1
MOV P1,#0FFH ;停止
RET
TINGZHI:SETB P1.1
SETB P1.0
LCALL DELAY
RET
;------------------------------
;外部中断1,将高度存在78-7AH中
;------------------------------
INTEX1: PUSH ACC
PUSH PSW
CLR EX1
INC 40H
LLLU: MOV A,40H
CJNE A,#01H,LLL ;数脉冲,满1厘米
MOV 40H,#00H
JNB UPING,LLLD
INC 41H
MOV A,41H
CJNE A,#0AH,LLL
MOV 41H,#00H
INC 42H
MOV A,42H
CJNE A,#0AH,LLL
MOV 42H,#00H
INC 43H
MOV A,43H
CJNE A,#0AH,LLL
MOV 43H,#00H
LLLD: JNB DOWNING,LLL
DEC 41H
MOV A,41H
CJNE A,#0FFH,LLL
MOV 41H,#09H
DEC 42H
MOV A,42H
CJNE A,#0FFH,LLL
MOV 42H,#09H
DEC 43H
MOV A,43H
CJNE A,#0FFH,LLL
MOV 41H,#00H ;减至负数,赋0
MOV 42H,#00H
MOV 43H,#00H
LLL: MOV 7AH,41H
MOV 79H,42H
MOV 78H,43H
SETB EX1
POP PSW
POP ACC
RETI
NOP
NOP
NOP
INTT0: INC 25H ;中断服务,中断计数器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
RETI
;-------------------------------------------------------------------------
GETKEY: ;最终键值存在21H(JIANZHI)中(0---F)
MOV A,#89H
MOV DPTR,#D8255
MOVX @DPTR,A
MOV SAOM1,#016H
YX1: MOV SAOM2,#04FH
KEY1: ACALL KS1 ;扫描有无键按下
JNZ LK2 ;有转LK2
;---------------------------------------
ACALL DIS ;调显示程序
;---------------------------------------
DJNZ SAOM2,KEY1 ;SM2(23H)为控制扫描次数
DJNZ SAOM1,YX1 ;SM1(22H)为控制扫描次数
SJMP KEY1 ;无键始终扫描
;---------------------------------------
LK2: MOV R2,#0FEH ;有键行扫描
MOV R7,#00H
LK4: MOV DPTR,#A8255 ;A口地址
MOV A,R2
MOVX @DPTR,A
MOV DPTR,#C8255 ;C口地址
MOVX A,@DPTR ;读C口
JB ACC.0,LONE ;不是A.0转移
MOV A,#00H
AJMP LKP
LONE: JB ACC.1,LTWO ;不是A.1转移
MOV A,#01H
AJMP LKP
LTWO: JB ACC.2,LTHR ;不是A.2转移
MOV A,#02H
AJMP LKP
LTHR: JB ACC.3,NEXT ;不是A.3转移
MOV A,#03H
LKP: ADD A,R7
PUSH ACC
;---------------------------------------
LK3: ACALL DIS ;是否还按键/是一直调显示程序
ACALL KS1
JNZ LK3
;---------------------------------------
POP ACC
MOV R0,#JIANZHI ;键值存在JIANZHI(21H)中
MOV @R0,A
RET
NEXT: INC R7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -