P2口接数码管,4个数码管选通端由P1.4~P1.7控制,分别控制千位~个位。STC单片机P1口自带AD转换。
ADC_CONTR EQU 0C5H ;A/D转换寄存器
ADC_RES EQU 0C6H ;8位A/D转换结果寄存器
P1ASF EQU 9DH
;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1
ADC_Power_On_Speed_Channel_2 EQU 11100010B
P1M0 EQU 91H
P1M1 EQU 92H
ADC_Channel_2_Result EQU 32H ;2通道A/D转换结果
ORG 0000H
MOV DPTR,#TAB
AD: MOV SP, #7FH ;设置堆栈
ACALL ADC_Power_On ;开ADC电源, 第一次使用时要打开内部模拟电源
;开ADC电源, 可适当加延时,1mS以内就足够了
ACALL Set_P12_ASF ;设置 P1.2 为模拟功能口
ACALL Set_ADC_Channel_2 ;设置 P1.2 作为A/D转换通道
ACALL Get_AD_Result
MOV A,ADC_Channel_2_Result
MOV B,#20 ;计算电压值
MUL AB
MOV 60H,A
MOV 61H,B
MOV R2,#00H ;十六进制转换十进制
MOV R3,#00H
MOV R4,#16
YI:MOV A,60H
RLC A
MOV 60H,A
MOV A,61H
RLC A
MOV 61H,A
MOV A,R2
ADDC A,R2
DA A
MOV R2,A
MOV A,R3
ADDC A,R3
DA A
MOV R3,A
DJNZ R4,YI
MOV A,R3
MOV B,#16 ;取出千位百位
DIV AB支持小数点的进制转换器
ADD A,#0AH ;显示小数点
MOV 50H,A
MOV 51H,B
MOV A,R2
MOV B,#16 ;取出十位个位
DIV AB
MOV 52H,A
MOV 53H,B
MOV R0,#50H
MOV DPTR,#TAB1 ;显示电压值
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
CLR P1.4
LCALL DELAY
SETB P1.4
INC R0
MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
CLR P1.5
LCALL DELAY
SETB P1.5
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
CLR P1.6
LCALL DELAY
SETB P1.6
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
CLR P1.7
LCALL DELAY
SETB P1.7
sjmp AD
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR, #80H ;开A/D转换电源
MOV A, #20H
ACALL DELAY ;开A/D转换电源后要加延时,1mS以内就足够了
POP ACC
RET
;设置P1.2为模拟功能
Set_P12_ASF:
PUSH ACC
MOV A, #00000100B
ORL P1ASF, A
ORL P1M0, A
ORL P1M1, A
POP ACC
RET
Set_ADC_Channel_2:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2
;选择P1.2作为A/D转换通道
MOV A, #05H ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
;以后如果不更换 A/D 转换通道的话, 不需要加延时
ACALL DELAY ;切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关
;如果输入电压信号源的内阻在10K以下,可不加延时
RET
Get_AD_Result:
PUSH ACC ;入栈保护
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;启动 AD 转换
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
Wait_AD_Finishe:
MOV A, #00010000B ;判断 AD 转换是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待
ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换
MOV A, ADC_RES
MOV ADC_Channel_2_Result, A ;保存 AD 转换结果
POP ACC
RET
DELAY:MOV R6 ,#05H ;延时程序
DL2:MOV R7 ,#7DH
DL1:NOP
NOP
DJNZ R7,DL1
DJNZ R6,DL2
RET
TAB:DB 44H , 0DEH , 62H , 52H , 0D8H , 51H , 41H , 0D6H , 40H , 50H , 04H,9EH,22H,
12H,98H,11H,01H,96H,00H,10H ;前10为不带小数点字码表后10为带小数点字码表
END
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论