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

📄 adc0804-2.asm

📁 单片机例程打包 液晶 AD EEPROM LED 电机 BEEP 键盘等
💻 ASM
字号:
;天逸版adc0804 A/D转换应用,转动电位器数码管依次显示000-255,此程序加以改动可以用作多种用途
;天逸版JP8需接上,应用于天逸版内部5V电压,
;***************************************************************************
;*  ohm@szsxmcu.com	      深圳随想电子科技有限公司版权所有    *
;*  Create by :欧海明     www.szsxmcu.com 更多例程及单片机专业    *
;*  咨讯请登陆网站      因为专业所以做得更好!深圳随想电子科技 	  *
;***************************************************************************
;将AD转换的连接端口赋值
ad_cs   equ P3.6   ;芯片选择
ad_wr   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
Adc_Start:              ; 开始AD转换
    clr ad_cs
    nop
    clr ad_wr
    nop
    setb    ad_wr
    nop
    setb    ad_cs
    nop
    ret

Adc_Read:              ;读取AD转换结果
    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
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

DISP:                       ;定时器T0的中断响应程序动态扫描
    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 + -