51单片机数字电压表汇编语言
时间: 2023-09-24 12:10:56 浏览: 143
使用51单片机实现直流数字电压表仿真设计源程序资料
以下是51单片机数字电压表的汇编语言代码:
```
;51单片机数字电压表
;VCC为供电电压,REF为参考电压
;数码管显示电压值(VCC/255*AD值)
;P1.0-P1.7接数码管段选,P2.0-P2.3接数码管位选,P3.0接ADC输入
;使用定时器0和定时器1进行时间计数
ORG 0H ;程序从地址0开始
MOV P1, #0FFH ;P1口设置为输出,段选端口全部置高
MOV P2, #0F0H ;P2口设置为输出,位选端口全部置高
MOV P3, #00H ;P3口设置为输入,ADC输入端口
MOV TMOD, #11H ;定时器0和定时器1均为16位计数模式
MOV TH0, #0FEH ;定时器0初始值设为0FEH
MOV TL0, #0CCH ;定时器0初始值设为0CCH
MOV TH1, #0 ;定时器1初始值设为0
MOV TL1, #0 ;定时器1初始值设为0
SETB TR0 ;启动定时器0
SETB TR1 ;启动定时器1
LOOP: ;主程序循环
MOV A, P3 ;将ADC输入值读入寄存器A
DIV AB, #0FFH ;将寄存器A除以255,商存在B中,余数存在A中
MOV P2, #0F0H ;位选端口全部置高
MOV P1, #0FFH ;段选端口全部置高
CALL DISPLAY ;调用显示子程序
SJMP LOOP ;跳回主程序循环
DISPLAY: ;显示子程序
MOV C, #00H ;清零进位标志
MOV A, B ;将商B的值赋给寄存器A
CJNE A, #0, A1 ;如果A不为0,跳转A1
MOV A, #0 ;否则将寄存器A置为0
JMP A2 ;跳转A2
A1: ;A1标签
CLR C ;清零进位标志
MOV R0, #0AH ;将R0寄存器置为10
DIV AB, R0 ;将寄存器A除以R0,商存在B中,余数存在A中
MOV R1, A ;将余数A的值赋给R1寄存器
ADD A, #30H ;将寄存器A加上30H
MOV P1, A ;将寄存器A的值赋给段选端口
MOV A, B ;将商B的值赋给寄存器A
DIV AB, R0 ;将寄存器A除以R0,商存在B中,余数存在A中
ADD A, #30H ;将寄存器A加上30H
MOV P1+1, A ;将寄存器A的值赋给段选端口
MOV A, R1 ;将R1寄存器的值赋给寄存器A
ADD A, #30H ;将寄存器A加上30H
MOV P1+2, A ;将寄存器A的值赋给段选端口
A2: ;A2标签
MOV A, C ;将进位标志的值赋给寄存器A
JZ A3 ;如果进位标志为0,跳转A3
ADD A, #30H ;将寄存器A加上30H
MOV P1+3, A ;将寄存器A的值赋给段选端口
A3: ;A3标签
ACALL DELAY ;调用延时子程序
RET ;返回
DELAY: ;延时子程序
MOV R2, #0FFH ;将R2寄存器置为0FFH
MOV R3, #0FFH ;将R3寄存器置为0FFH
DJNZ R2, $ ;R2寄存器自减,如果不为0,跳转$
DJNZ R3, DELAY ;R3寄存器自减,跳转DELAY
RET ;返回
```
该程序使用定时器0和定时器1进行时间计数,并通过ADC输入端口读取电压值,然后将其转换成数码管可以显示的数字,并在数码管上显示。其中,P1.0-P1.7为数码管的段选端口,P2.0-P2.3为数码管的位选端口,P3.0为ADC输入端口。
在DISPLAY子程序中,使用了除法和取余操作,将电压值转换成可以在数码管上显示的数字。DELAY子程序用于延时,以便数码管上的数字能够稳定显示。
阅读全文