导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→偶用adc0804作的数字电压表, 学adc的朋友看一看!

* 79413: 偶用adc0804作的数字电压表, 学adc的朋友看一看!

   wuyong 
wuyong发表的帖子 

 偶用adc0804作的数字电压表, 学adc的朋友看一看!

此主题相关图片如下:
按此在新窗口浏览图片用adc0804做的万用表!
;AD 0804控制程序:转动电位器,数码管后三位依次显示000-255,此程序可以做一个温度计, 一个电压表...
;***************************************************************************
;*  sxj1974@163.com       (51c51 test web)          *
;*  Create by :石学军       更多例程请登陆网站            *
;***************************************************************************
;//定义ADC的连接端口
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

;//==========================================
;// 启动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

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




发表时间:2005年6月10日10:34:28

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:各位大侠你们难道真的见死不救吗
[下一篇帖子]:在UCGUI嵌入式系统论坛当中有提供UCOS2.0下载在UCGUI嵌入式系统论坛当中有提供.....