⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voltage.asm

📁 数字电压表实例 功能:单片机通过ADC0804实现简单的数字电压表
💻 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 + -