共同学习,2009年电子大赛低频功率放大器程序。主要是功率测量。
MY MSN:
;5DH,5EH,5FH显示缓存区
DATA1 EQU P0
RS EQU P2.2
RW EQU P2.3
E EQU P2.4
PSB EQU P2.1
RST EQU P2.0
CS EQU P2.6
OL EQU 54H
OM EQU 55H
OH EQU 56H
IL EQU 57H
IM EQU 58H
IH EQU 59H
EL EQU 5AH
EML EQU 5BH
EMH EQU 5CH
EH EQU 5DH
ORG 00H
LJMP START
ORG 030H
START:MOV SP,#6FH
MOV PSW,#00H
MOV P0,#0FFH
LCALL LCDINT ;LCD初始化程序
LCALL YDELAY
LCALL DISP_0 ;主屏显示,初始化显示
SETB PSB
SETB RST
MOV 50H,#0E8H
MOV 51H,#03H ;F X 1000显示
MOV 52H,#01H
MOV 53H,#00H ;OUT 的乘数
MOV 40H,#01H
MOV 41H,#00H ;OUT 的除数
MOV 42H,#01H
MOV 43H,#00H ;IN 的乘数
MOV 44H,#01H
MOV 45H,#00H ;IN 的除数
STA: MOV 30H,#00H
MOV 31H,#00H
MOV 36H,#00H
MOV 35H,#00H
CLR CS ;选择OUT功率通道
; LCALL DELAY
LCALL JISHU
MOV A,TL1
MOV 30H,A ;将TL1存入固定地址
MOV A,TH1
MOV 31H,A ;将TH1存入固定地址
SETB CS ;选择IN功率通道
LCALL JISHU
MOV A,TL1
MOV 35H,A ;将TL1存入固定地址
MOV A,TH1
MOV 36H,A ;将TH1存入固定地址
;*********CESHI******
; MOV 30H,#96H
; MOV 40H,30H
; MOV 31H,#01H
; MOV 41H,31H
; MOV 35H,#46H
; MOV 45H,35H
; MOV 36H,#02H
; MOV 46H,36H
;====================================================
; O,I,F显示
;
;====================================================
LCALL OJISUAN
LCALL ODISP
LCALL IJISUAN
LCALL IDISP
; LJMP $
LCALL EJISUAN
LCALL EDISP
LJMP STA
;*************************
;T1计数 压频
;======================================
JISHU: MOV R2,#14H ;定时20个0.05秒
MOV TMOD,#51H ;设置T0定时T1计数
MOV TH0,#3CH;置定时器初值
MOV TL0,#0B0H
MOV TH1,#00H;置计数器初值
MOV TL1,#00H
SETB TR0 ;启动定时
SETB TR1 ;启动计数
XX: JBC TF0,LOOP ;定时溢出则转移
SJMP XX ;否则继续查询
LOOP: MOV TH0,#3CH ;置定时初值
MOV TL0,#0B0H
DJNZ R2,XX ;R2不等于0则转移
CLR TR1 ;停止计数
RET
OJISUAN: MOV R0,#30H
MOV R2,#02H
MOV R1,#52H
MOV R3,#02H
LCALL MMUL
MOV R0,#30H
MOV R1,#40H
MOV R3,#2
LCALL MDIV
MOV 46H,#00H
MOV 47H,#00H
MOV 48H,#00H
MOV R0,#30H
MOV R1,#46H
ODTB5: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,ODTB5
MOV R4,46H
MOV R3,47H
MOV R2,48H
MOV R6,#03H
MOV R0,#54H
LCALL MBTD
RET
IJISUAN: MOV R0,#35H
MOV R2,#02H
MOV R1,#42H
MOV R3,#02H
LCALL MMUL
MOV R0,#35H
MOV R1,#44H
MOV R3,#2
LCALL MDIV
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV R0,#35H
MOV R1,#60H
IDTB5: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,IDTB5
MOV R4,60H
MOV R3,61H
MOV R2,62H
MOV R6,#03H
MOV R0,#57H
LCALL MBTD
RET
EJISUAN: MOV R0,#46H
MOV R2,#2
MOV R1,#50H
MOV R3,#2
LCALL MMUL
; LJMP $
MOV R0,#46H
MOV R1,#60H
MOV R3,#2
LCALL MDIV
; LJMP $
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV R0,#46H
MOV R1,#60H
EDTB5: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,EDTB5
MOV R4,60H
MOV R3,61H
MOV R2,62H
MOV R6,#04H
MOV R0,#5AH
LCALL MBTD
RET
;----------------------------------------
ODISP: MOV R2,#95H
LCALL WRC
MOV DPTR,#TAB5
MOV A,OH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,#10
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,OM
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,OL
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
RET
IDISP: MOV R2,#08DH ;写入显示缓冲区起始地址为第?行第?列
LCALL WRC
MOV DPTR,#TAB5
MOV A,IH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,#10
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,IM
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,IL
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
RET
EDISP: MOV R2,#09DH ;写入显示缓冲区起始地址为第?行第?列
LCALL WRC
MOV DPTR,#TAB5
MOV A,EH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,#10
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,EMH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,EML
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
MOV A,EL
MOVC A,@A+DPTR
MOV R2,A
LCALL WRD
RET
;--------------------------------------------------
MMUL: MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
SWAP A
RR A
INC A ;求累加移位次数
MOV R6,A
MOV A,R0
ADD A,R2
MOV R0,A
CLR A
MUL1: MOV @R0,A
INC R0
DJNZ R3,MUL1;清计算区
MUL5: MOV A,R5
MOV R3,A
PUSH PSW
MOV A,R4
ADD A,R3
MOV R2,A
POP PSW
MUL2: DEC R0
MOV A,@R0
RRC A
MOV @R0,A
DJNZ R2,MUL2;被乘数连同中间结果右移,
JNC MUL3 ;得出被乘数相应位是否为1
MOV A,R4
ADD A,R0
MOV R0,A
; CLR C
MUL4: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,MUL4;是1,在中间结果上加乘数
PUSH PSW
CLR C
MOV A,R1
SUBB A,R5
MOV R1,A
POP PSW
DJNZ R6,MUL5;进入下一循环
SJMP YUI0
MUL3: MOV A,R0 ;非1,移指针
ADD A,R4
ADD A,R5
MOV R0,A
DJNZ R6,MUL5;进入下一循环
YUI0: MOV A,R4
ADD A,R5
MOV R2,A
MUL7: DEC R0
DEC R2
CJNE @R0,#0H,MUL6
CJNE R2,#0H,MUL7 ;检出结果长度
MUL6: MOV A,R0
SUBB A,R2
MOV R0,A ;设置结果指针
INC R2
RET ;返回
;-----------------------------
MDIV: MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
SWAP A
RR A
INC A ;求出移位减次数
MOV R6,A
MOV A,R0
ADD A,R2
MOV R0,A
CLR A
DIV1: MOV @R0,A
INC R0
DJNZ R3,DIV1;清计算区
DIV6: MOV A,R5
MOV R3,A
MOV A,R4
MOV R2,A
PUSH PSW
CLR C
MOV A,R0
SUBB A,R3
SUBB A,R2
MOV R0,A
MOV A,R2
ADD A,R3
MOV R2,A
POP PSW
DIV2: MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R2,DIV2;被除数连同结果一起左移
MOV F0,C ;溢出位保存于F0
CLR C
MOV A,R0
SUBB A,R3
MOV R0,A
SETB C
DIV3: MOV A,@R1
CPL A
ADDC A,@R0
MOV @R0,A
INC R0
INC R1
DJNZ R3,DIV3
JC DIV4 ;移出值减除数,
SETB C
JBC F0,DIV4
CLR C ;不够减
MOV A,R5
MOV R3,A
MOV A,R0
SUBB A,R3
MOV R0,A
MOV A,R1
SUBB A,R3
MOV R1,A
DIV5: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,DIV5;加上除数,恢复原移出值
CLR C ;并设结果为0
DIV4: JBC F0,EDIV;结果溢出错
PUSH PSW ;够减,保存1结果
CLR C
MOV A,R1
SUBB A,R5
MOV R1,A ;恢复指针
POP PSW
DJNZ R6,DIV6;进入下一循环
PUSH PSW
CLR C
MOV A,R0
SUBB A,R5
SUBB A,R4
MOV R0,A
MOV A,R4
MOV R2,A
POP PSW
DIV7: CLR A
ADDC A,@R0
MOV @R0,A
INC R0
DJNZ R4,DIV7;四舍五入
JC EDIV ;溢出错
DIV9: DEC R0
DEC R2
CJNE @R0,#0H,DIV8
CJNE R2,#0H,DIV9;求结果位数
DIV8: MOV A,R0
SUBB A,R2
MOV R0,A ;设置结果指针
INC R2
MOV A,R5
MOV R3,A
CLR C ;清C,表示计算正确
RET ;返回
EDIV: SETB C ;设C,表示计算有误
RET ;返回
;---------------------MBTD-----------------------
MBTD: MOV R7,#0AH
LCALL CHU
MOV A,R7
MOV @R0,A
INC R0
DJNZ R6,MBTD
RET
;三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7
;入口 :R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口 :(R2),R3,R4,R7,OV
CHU :MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 :MOV R2,A
INC R4
NDV313 :DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 :XCH A,R2
MOV R7,A
RET
;====================================================================
LCDINT: MOV R2,#38H ;功能设置:DL=1 8位,N=1 双行显示,F=0 5X7点阵
LCALL WRC
MOV R2,#01H ;清屏,AC=0
LCALL WRC
MOV R2,#06H ;字符进入模式:光标右移,AC+1,字符不动
LCALL WRC
MOV R2,#0CH ;D=1,开显示;C=0,关光标;B=0,字符不闪烁
LCALL WRC
RET
;------------------------------------------------------------
DISP_0: MOV DPTR,#TAB1 ;使用数据表TAB1
MOV R2,#80H ;写入显示缓冲区起始地址为第1行第1列
LCALL WRC
LCALL YDELAY
MOV R4,#15 ;N位数据
LCALL WRN ;
MOV DPTR,#TAB2 ;使用数据表TAB2
MOV R2,#090H ;写入显示缓冲区起始地址为第2行第1列
LCALL WRC
LCALL YDELAY
MOV R4,#15 ;N位数据
LCALL WRN
MOV DPTR,#TAB3 ;使用数据表TAB3
MOV R2,#088H ;写入显示缓冲区起始地址为第3行第1列
LCALL WRC
LCALL YDELAY
MOV R4,#15 ;N位数据
LCALL WRN ;
MOV DPTR,#TAB4 ;使用数据表TAB4
MOV R2,#098H ;写入显示缓冲区起始地址为第4行第1列
LCALL WRC
LCALL YDELAY
MOV R4,#15 ;N位数据
LCALL WRN
RET
; -------查询忙碌标志BF位-------------
BUSY:
CLR RS ;RS=0
SETB RW ;RW=1
MOV DATA1,#0FFH ;读取
CLR E ;E=0
NOP
SETB E ;E=1
NOP
MOV A,DATA1
CLR E
JB ACC.7,BUSY ;BF=1则等待,表示忙
RET
;-------写控制指令-------------------
WRC: LCALL BUSY ;先查询BF位
CLR RS ;RS=0
CLR RW ;RW=0
SETB E ;E=1
NOP
MOV DATA1,R2 ;指令存入A
CLR E ;E=0 信号下降 写信号
RET
;-------写一个字符数据---------------
WRD: LCALL BUSY ;先查询BF位
;CLR E
SETB RS ;RS=1
CLR RW ;RW=0
SETB E ;E=1
NOP
MOV DATA1,R2 ;数据存入A
CLR E ;E=0
RET
;-------读一个字符数据---------------
RDD: LCALL BUSY ;先查询BF位
SETB RS ;RS=1
SETB RW ;RW=1
MOV DATA1,#0FFH ;读入DATA1
SETB E ;E=1
NOP
NOP
CLR E ;E=0
MOV A,DATA1 ;读数据存入A
RET
;-------连续读入N个字符数据并写入DDRAM-------
;寄存器:R2:数据寄存器,调用时,发送至DATA1
; R4:数目N寄存器
;--------------------------------------------
WRN: CLR A ;A清零
MOVC A,@A+DPTR ;查表
INC DPTR ;查表指针加1
MOV R2,A ;存入R2寄存器,等待发送至DATA1
LCALL WRD
DJNZ R4,WRN ;连续写N位数据
RET
TAB1: DB '低频功率放大器 '
TAB2: DB '输出功率: W'
TAB3: DB '供给功率: W'
TAB4: DB '整机效率: '
TAB5: DB '0123456789. '
YDELAY: MOV R6,#20
YD1: MOV R7,#250
DJNZ R7,$
DJNZ R6,YD1
RET
;******显示子程序******