📄 voltage.asm
字号:
;----------------------------------
; 数字电压表实例
; 功能:单片机通过ADC0804实现简单的数字电压表
;-----------------------------------
;//定义ADC的连接端口
ad_wr equ P3.6 ;芯片选择
ad_cs equ P2.0 ;转换开始
ad_rd equ P3.7 ;RD=LOW,数字信号输出
ad_input_port equ p1 ;定义数据位
Counter EQU 59H ;计数器,显示程序通过它得知现正显示哪个数码管
FIRST EQU P2.4 ;第一位数码管的位控制
SECOND EQU P2.5 ;第二位数码管的位控制
THEER EQU P2.6 ; 第三位数码管的位控制
DISPBUF EQU 5AH ;显示缓冲区为5AH和5BH
ORG 0000h
AJMP main
ORG 000BH ;定时器T0的入口
AJMP DISP ;显示程序
ORG 0030h
MAIN:
MOV SP,#5FH ;设置堆栈
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH ;初始化,所显示器,LED灭
MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式)
MOV TH0,#HIGH(65536-2000)
MOV TL0,#LOW(65536-2000)
SETB TR0 ;开定时器0
SETB EA ;开总中断
SETB ET0 ;开定时器0中断
MOV Counter,#0 ;计数器初始化
LOOP:
LCALL adc_demo ;调用AD子程序
AJMP LOOP
;―――――――――――――――――――――――――
; 启动AD转换
;―――――――――――――――――――――――――
Adc_Start:
CLR ad_cs
NOP
CLR ad_wr
NOP
SETB ad_wr
NOP
SETB ad_cs
NOP
RET
;―――――――――――――――――――――――――
; 读AD转换
;―――――――――――――――――――――――――
Adc_Read:
MOV AD_INPUT_PORT,#0FFH
CLR ad_cs
NOP
CLR ad_rd
NOP
NOP
MOV A,AD_INPUT_PORT
NOP
SETB ad_rd
NOP
SETB ad_cs
RET
;―――――――――――――――――――――――
; AD转换读取延时程序,显示读到的数值
;―――――――――――――――――――――――
Adc_Demo:
LCALL Adc_Start
LCALL delay1ms
LCALL adc_read
MOV B,#100 ; AD转换出的值除100商为百位数
DIV AB ; 取百位数 余数在B寄存器
MOV DISPBUF,A ; 把百位存入百位寄存器DISPBUF
MOV A,B ; 余数再送A
MOV B,#10 ; 余数除10商为十位数
DIV AB ; 除法,余数在寄存器B
MOV DISPBUF+1,A ; A是十位数存第二位显示寄存器
MOV DISPBUF+2,B ; B是个位数存第三位显示寄存器
RET
;――――――――――――――――――――――――――――
; ; 定时器T0的中断响应,通过中断服务程序动态扫描
;――――――――――――――――――――――――――――――
DISP:
PUSH ACC ; ACC入栈
PUSH PSW ; PSW入栈
MOV TH0,#HIGH(65536-2000); 定时时间为2000个周期,约2170微秒
MOV TL0,#LOW(65536-2000)
SETB FIRST
SETB SECOND ; 关显示
SETB THEER
MOV A,#DISPBUF ; 显示缓冲区首地址
ADD A,Counter
MOV R0,A
MOV A,@R0 ; 根据计数器的值取相应的显示缓冲区的值
MOV DPTR,#DISPTAB ; 字形表首地址
MOVC A,@A+DPTR ; 取字形码
MOV P0,A ; 将字形码送P0位(段口)
MOV A,Counter ; 取计数器的值
JZ DISPFIRST ; 如果是0则显示第一位
DEC A
JZ DISPSECOND ; 如果是1显示第二位
CLR THEER ; 否则显示第3位
AJMP DISPNEXT
DISPFIRST:
CLR FIRST ; 显示第一位
AJMP DISPNEXT
DISPSECOND:
CLR SECOND
DISPNEXT:
INC Counter ; 计数器加1
MOV A,Counter
DEC A ; 如果计数器计到3,则让它回0
DEC A
DEC A
JZ RSTCOUNT
AJMP DISPEXIT
RSTCOUNT:
MOV Counter,#0 ; 计数器的值回0
DISPEXIT:
POP PSW
POP ACC
RETI
DISPTAB:DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ; 字形代码表
;0 1 2 3 4 5 6 7 8 9
DELAY1ms: ; 延时子程序
MOV R7,#10
MM:
MOV R6,#50
DJNZ R6,$ ;2us
DJNZ R7,MM
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -