采用AT89C2051控制稳压输出与同步显示的电路源程序
ORG 0000H
START: AJMP MAIN
TAB1: DB 128,64,32,16 ;Dn值表格
TAB2: DB 0C0H,92H,0C0H,0C0H ;数字0.5.0.0字段代码表
TAB3: DB 0B0H,99H,82H,90H ;数字3.4.6.9字段代码表
MAIN: MOV SCON,#0 ;设串行口模式0
SETB P3.7 ;接继电器实现极性状态改变,开始置P3.7=1
SETB P3.4 ;电压及显示控制按钮
SETB P3.5 ;极性转换按钮
BEGIN: MOV SP, #60H
MOV 23H,#0 ;送输出P1.7=1的Dn值指针
MOV 20H,#0 ;小数点一位指针指向“0”字符(20H是小数点的指针)
MOV 21H,#0 ;个位指针指向“3”字符(21H是个位数点的指针)
ACALL DSP ;调用显示、输出子程序
NOP
JNB P3.4,$
ACALL DEL200
;
KEY1: JB P3.4, KEY2 ;电压及显示键是否有键?
ACALL DEL10
JB P3.4, KEY2
ACALL K1
;
KEY2: JB P3.5, KEY1 ;极性转换键是否有键?
ACALL DEL10
JB P3.5, KEY1
ACALL K2
AJMP KEY1
;
DEL10: MOV R6,#0DH ;10ms延时子程序
D1MS1: MOV R7,#0FFH
DLL1: DJNZ R7, DLL1
DJNZ R6, D1MS1
RET
;
DEL200: MOV R3, #0FFH ;200ms延时子程序
D1MS2: MOV R4, #0FFH
DLL2: DJNZ R4, DLL2
DJNZ R3, D1MS2
RET
;
K1: MOV A,23H ;电压及显示键处理子程序
CJNE A, #03H, REL1
AJMP BEGIN
REL1: INC 23H
INC 20H
INC 21H
ACALL DSP
NOP
JNB P3.4,$
ACALL DEL200
NOP
RET
;
K2: CPL P3.7 ;极性转换键处理子程序
JNB P3.5,$
ACALL DEL200
NOP
RET
;
DSP: MOV R7, #02 ;显示、输出子程序
MOV R0, #20H
MOV R1, #21H
MOV DPTR, #TAB2
MOV A, @R0
DSP1: MOVC A, @A+DPTR
MOV SBUF, A
DSP2: JNB TI, DSP2
CLR TI
MOV A, @R1
MOV DPTR, #TAB3
DJNZ R7, DSP1
MOV DPTR, #TAB1
MOV A, 23H
MOVC A, @A+DPTR
MOV P1, A
RET
;
END
源程序说明
程序中定义了三个表TAB1、TAB2、TAB3,分别存放P1口的数据、小数点后一位字符、个位字符。并且用23H、20H、21H分别作为P1口的数据、小数点后一位字符、个位字符的指针,指针开始时均指向“0”,即分别对应着128、0C0H、0B0H。
程序运行后,调用“显示/输出子程序”,在“显示/输出子程序”中依次执行:将字符“0”对应的代码“0C0H”发送、将字符“3”对应的代码“0B0H”发送、将P1口置为“128”(即表示P1.7—P1.0为10000000)。显然在“显示/输出子程序”中输出字符和置P1口的数据等,用的是查表指令MOVC A,@A+DPTR,DPTR是数据指针,查表时采用DPTR作为基址寄存器,在该指令执行前,DPTR中存放表的起始地址(例如MOV DPTR,#TAB2),A的内容(用MOV R0,#20H和MOV A,@R0两条指令完成)作为无符号数与DPTR的内容相加得到一个16位地址,由该地址指出的程序存储器的单元的内容送到累加器A中,再由MOV SBUF,A指令将字符对应的代码发送出往,同样对P1口数据的传送用指令MOV A,23H和MOVC A,@A+DPTR以及MOV P1,A完成。
程序在结束此次调用“显示/输出子程序”后,就反复扫描P3.4口和P3.5口,随时响应按键S1和S2的操纵,如S1按下,则进进“S1处理子程序”,即“电压及显示键处理子程序”;如S2按下,则进进“S2处理子程序”即“极性转换键处理子程序”。
在“电压及显示键处理子程序”中,每执行一次该子程序,都是先将三个指针23H、20H、21H加1,然后调用“显示/输出子程
序”,下面的过程是与开始一样的,只不过,由于指针改变而改变了相应代码,实现显示、稳压输出为“4.5、4.5V”→“6.0、6.0V” →“9.0、9.0V”→“3.0、3.0V”的循环过程。留意,当23H指针加到03H后,表明电路应回到起始状态,重新以“3.0、3.0V”开始,程序用CJNE A,#03H,ACTION1指令来控制,即当A中内容即是03H后,程序不会执行标号ACTION1开始的程序段,而是转到执行标号FW的程序段,回到起始状态。
在“极性转换键处理子程序”中,每执行一次该子程序,就对P3.7取反一次,实现极性转换。