前言
附:http://www.jh-tec.cn/archives/7313
大家好,上一条博客写了关于基于51单片机以及ADC0808的数字电压表,但是采用的C语言,本章讲一下采用汇编语言来实现电压的测量,同样采用数码管显示。
硬件设计
该设计采用的MCU同样是51单片机,ADC也是采用的TI的ADC0808,显示部分采用4位数码管,最终的测试电压范围为0~5V,这次的精度提高到约为0.01V,仿真图如下:
右下方是模拟的输入电压
部分汇编代码如下: (代码详细备注,方便阅读)
LED_0 EQU 30H ;百分位
LED_1 EQU 31H ;十分位
LED_2 EQU 32H ;个位
LED_3 EQU 33H ;十位
ADC EQU 35H
CLOCK BIT P1.4 ;定义0808时钟位
ST BIT P1.5
EOC BIT P1.6
OE BIT P1.7
ORG 0000H
LJMP START
ORG 000BH
LJMP INT_T0
ORG 30H
START: MOV LED_0,#00H
MOV LED_1,#00H
MOV LED_2,#00H
MOV DPTR,#TABLE ;表格数值赋到DPTR
MOV TMOD,#02H ;定时器选择方式2
MOV TH0,#0F5H ;防止数码管数位闪动,可设定的置为小于等于245的数
MOV TL0,#00H
MOV IE,#82H ;开T0中断
SETB TR0 ;T0开始计数
WAIT: CLR ST
SETB ST ;上升沿清零SAR(SAR用来在A/D转化过程中存放暂态数字量)
CLR ST ;下降沿启动ADC工作
JNB EOC,$ ;等待转换结果
SETB OE ;ADC输出
MOV ADC,P2 ;读取AD转换结果
CLR OE
MOV A,ADC
MOV R7,A ;R7储存AD转换后的结果
MOV LED_3,#00H ;清空十位
MOV LED_2,#00H ;清空个位
MOV A,#00H
LOOP1: ADD A,#20H ;一位二进制码对应100mV
DA A ;结果转换成BCD码
JNC LOOP2 ;Cy为0跳转,Cy为1继续执行
MOV R4,A ;R4储存百分位、十分位
INC LED_2 ;个位加1
MOV A,LED_2
CJNE A,#0AH,LOOP4 ;个位不为10跳转,为10继续执行
MOV LED_2,#00H ;个位置0
INC LED_3 ;十位加1
LOOP4: MOV A,R4
LOOP2: DJNZ R7,LOOP1 ;R7减1不为0跳转,为0继续执行
ACALL BTOD1
LCALL DISP ;调用显示子程序
LJMP WAIT
ORG 0200H
BTOD1: MOV R6,A ;R6储存R7为0后的A的值