各位大侠,帮忙看下这个程序,1路ad转换用数码管显示
P1ASF EQU 9DH ;定义P1ASF 口,P1 口模拟功能
ADC_CONTR EQU 0BCH ;定义AD 转换控制寄存器
ADC_RES EQU 0BDH ;定义AD 转换结果寄存器高
ADC_RESL EQU 0BEH ;定义AD 转换结果寄存器低
ADC_FLAG EQU 10H ;AD转换完成标志位
DBUF0 EQU 38H ;定义待显示十进制第0 位存储单元
DBUF1 EQU 39H ;定义待显示十进制第1 位存储单元
DBUF2 EQU 3AH ;定义待显示十进制第2 位存储单元
DBUF3 EQU 3BH ;定义待显示十进制第3 位存储单元
AUXR1 EQU 0A2H ;定义AUXR1寄存器
JSDY EQU 20H ;计数单元
ADC_Channel data 21h ;设置存放通道号的寄存器
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP ADC_ISR
ORG 0030H
MAIN:MOV SP,#3fH
MOV PSW,#00H
mov ADC_Channel,#06H
mov R0,#40H
MOV R1,#41H
MOV JSDY,#00H
LCALL INIT_UART
LCALL INIT_ADC
ORL AUXR1,#00000100B ;定义AUXR1寄存器中ADRJ位为1,取到高2位和低8位
MOV IE,#0A0H
lOOP:MOV A,JSDY
CJNE A,#8,LOOP
CLR JSDY
MOV R0,#40H
MOV R1,#41H
LCALL QHPJ
LCALL HBCD
LCALL DISP1
SJMP LOOP
;...............求和取8次平均子程序......................
;;功能:将AD对应通道转换出来的结果进行累加然后把结果除以8
;入口参数:R0,R1
;出口参数:R0,R1
QHPJ: MOV R7,#7
L6: MOV A,@R0
INC R0
INC R0
ADD A,@R0
MOV @R0,A
MOV A,@R1
INC R1
INC R1
ADD A,@R1
MOV @R1,A
JNC L8
INC @R0
L8: DJNZ R7,L6
MOV R7,#3
L9: CLR C
MOV A,@R0
RRC A
MOV @R0,A
MOV A,@R1
RRC A
MOV @R1,A
DJNZ R7,L9
RET
;........将十六进制数转换成BCD码子程序HBCD..........
;功能:将单字节十六进制整数转换成单字节BCD码整数
;入口参数:单字节十六进制整数在累加器A中
;出口参数:转换后的BCD码千位在DBUF3中,百位在DBUF2中,十位在DBUF1中,个位在DBUF0中
HBCD:
MOV A,@R0
ANL A,#0F0H
MOV DBUF3,A
MOV A,@R0
ANL A,#0FH
MOV DBUF2,A
MOV A,@R1
SWAP A
ANL A,#0FH
MOV DBUF1,A
MOV A,@R1
ANL A,#0FH
MOV DBUF0,A
RET
;.................LED动态显示子程序...............
;功能:用四位LED显示0.00-5.00数字
;入口参数DBUF0、DBUF1、DBUF2、DBUF3
DISP1:MOV DPTR,#TAB ;设置不含小数点显示字符表首地址
MOV A,DBUF3
MOVC A,@A+DPTR ;取显示字符
SETB P1.1 ;屏蔽百位显示
SETB P1.3 ;屏蔽个位显示
SETB P1.2 ;屏蔽十位显示
CLR P1.0 ;选择千位显示
MOV P0,A ;送千位显示字符
ACALL DELAY30MS
MOV DPTR,#TAB ;设置不含小数点显示字符表首地址
MOV A,DBUF2
MOVC A,@A+DPTR ;取显示字符
SETB P1.0 ;屏蔽千位显示
SETB P1.3 ;屏蔽个位显示
SETB P1.2 ;屏蔽十位显示
CLR P1.1 ;选择百位显示
MOV P0,A ;送百位显示字符
ACALL DELAY30MS
MOV DPTR,#TAB ;设置不含小数点显示字符表首地址
MOV A,DBUF1
MOVC A,@A+DPTR ;取显示字符
SETB P1.3 ;屏蔽个位显示
SETB P1.1 ;屏蔽百位显示
SETB P1.0 ;屏蔽千位显示
CLR P1.2 ;选择十位显示
MOV P0,A ;送十位显示字符
ACALL DELAY30MS
MOV DPTR,#TAB ;设置不含小数点显示字符表首地址
MOV A,DBUF0
MOVC A,@A+DPTR ;取显示字符
SETB P1.2 ;屏蔽十位显示
SETB P1.1 ;屏蔽百位显示
SETB P1.0 ;屏蔽千位显示
CLR P1.3 ;选择个位显示
MOV P0,A ;送个位显示字符
ACALL DELAY30MS
RET
;.............断服务程序..........................
ADC_ISR:PUSH ACC
PUSH PSW
INC JSDY
ANL ADC_CONTR,#NOT ADC_FLAG ;中断标志位
MOV A,ADC_RES ;把高2位送到寄存器A
MOV @R0,A ;暂存高2位的结果
MOV A,ADC_RESL ;把低8位送到寄存器A
MOV @R1,A ;暂存低8位的结果
INC R0
INC R0
CJNE R0,#50H,L21
MOV R0,#40H
L21:
INC R1
INC R1
CJNE R1,#51H,L22
MOV R1,#41H
L22:
mov a,ADC_Channel
ANL A,#07H
MOV ADC_Channel,A
ORL A,#88H
MOV ADC_CONTR,A
POP PSW
POP ACC
REti
;...............ADC初始化...........................
INIT_ADC:
MOV P1ASF,#01000000B
MOV ADC_RES,#0
MOV ADC_RESL,#0
MOV A,ADC_Channel
ORL A,#88H
MOV ADC_CONTR,A
MOV A,#2
LCALL DELAY1MS
RET
;...............设置串口工作方式...................
INIT_UART:MOV SCON,#50H ;设置串行通信方式1
MOV PCON,#00H
MOV TMOD,#20H ;设置定时器1定时工作方式2
MOV TH1,#0FDH ;波特率9600定时器初值
MOV TL1,#0FDH
SETB TR1 ;启动定时器1
RET
;................延时子程序........................
DELAY1MS: MOV R2,A
CLR A
MOV R3,A
MOV R4,A
DELAY1: DJNZ R3,DELAY1
DJNZ R4,DELAY1
DJNZ R2,DELAY1
RET
DELAY10MS:
MOV R7,#01H
DL2:
MOV R6,#26H
DL1:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL1
DJNZ R7,DL2
RET
DELAY30MS:
MOV R6,#65H
DL0:
MOV R5,#93H
DJNZ R5,$
DJNZ R6,DL0
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH ;字型码0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
END
|