采用 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取反一次,实现极性转换 。
|