找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12548|回复: 5
打印 上一主题 下一主题
收起左侧

单片机ADC0809 8路数据采集 查询和中断法 带汇编程序和proteus仿真

[复制链接]
跳转到指定楼层
楼主
ID:137190 发表于 2016-9-27 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机驱动单片机ADC0809做的数据采集系统原理图如下(注意proteus中没有ADC0809采用ADC0808代替也是一样的):


所有的资料打包下载: ADC0809 8路数据采集系统.zip (52.37 KB, 下载次数: 196)


    AT89C51采用内部的12MHz晶振,
ALE引脚的频率是单片机时钟周期频率
的1/6,即2MHz。要想使ADC0808得到
500KHz的时钟基准,必须要把ALE输出
进行4分频,这样ADC0808才能可靠的
工作。这里由于仿真软件的原故,所以
直接给ADC0808的CLOCK端加了一个
500KHz的时钟信号。
控制线如下:
(1)、P0.0、P0.1、P0.2控制ADC0808
的8个通道。
(2)、P2.7和/WR、/RD控制ADC0808
的启动、地址锁存和输出


ADC0809 8路数据采集源码:
  1. ;本程序用到单元(30H~34H,3DH,3EH)
  2. ;(30H~34H)用于存放显示数据,(30H~33H)用于存放测量数据,34H用于存放通道号
  3. ;R1用于存放0809检测出来的8个数据
  4. ;(3DH、3EH)用于存放0809检测出来数据计算结果
  5.       ORG 0000H
  6.       AJMP MAIN
  7.       ORG 0013H
  8.       AJMP INT1
  9.       ORG 0030H
  10. ;======================================
  11. ;主程序
  12. MAIN: MOV R0,#30H      ;存放数据首地址
  13.       MOV R2,#0FH      ;计算数据存放单元个数
  14.       CLR A
  15. QING: MOV @R0,A        ;将数据存放单元清零
  16.       INC R0
  17.       DJNZ R2,QING
  18.       MOV R4,#08H      ;8路计数初值
  19.       MOV 34H,#00H     ;初始通道显示单元为1号通道
  20.       SETB IT1         ;INT1置为边沿触发
  21.       SETB EA          ;开中断
  22.       SETB EX1         ;允许INT1中断
  23.       MOV DPTR,#7FF8H  ;指向0809通道0
  24.       MOV A,#00H       ;此指令可缺省
  25.       MOVX @DPTR,A     ;启动A/D转换
  26. HERE: ACALL JI_SUAN
  27.       AJMP HERE        ;等待中断
  28. ;==========================================
  29. ;中断子程序
  30. INT1: CLR EX1
  31.       PUSH PSW         ;保护现场
  32.       MOVX A,@DPTR     ;读A/D转换结果
  33.       MOV R1,A         ;存数据
  34.       INC DPTR         ;更新通道
  35.       MOV A,34H
  36.       INC A
  37.       MOV 34H,A
  38.       DJNZ R4,LOOP     ;巡回未完继续
  39.       MOV R4,#08H      ;重新赋初值
  40.       MOV DPTR,#7FF8H
  41. LOOP:
  42.       MOVX @DPTR,A     ;启动A/D转换
  43.       POP PSW
  44.       RETI             ;返回中断

  45. ;========================================
  46. ;数据计算
  47. JI_SUAN:
  48.       MOV A,R1
  49.       MOV B,#20        ;基准电压为5伏,分辨率为5/256约为20毫伏
  50.       MUL AB           ;显示数值单位为毫伏
  51.       MOV R7,A         ;测量出来的数据乘20毫伏即为实际电压值,但还是十六进制
  52.       MOV A,B          ;高位存放在R6里,低位存放在R7里
  53.       MOV R6,A
  54.       MOV R5,#16
  55. ;=========================================
  56. ;双字节十六进制转双字节BCD码
  57. SBIN_SBCD:
  58.       MOV 3DH,#00H     ;数据计算结果清零
  59.       MOV 3EH,#00H
  60. SBIN_SBCD1:
  61.       MOV A,R7  ;R7左移一位并送回
  62.       RLC A
  63.       MOV R7,A
  64.       MOV A,R6  ;R6左移一位并送回
  65.       RLC A
  66.       MOV R6,A
  67.       MOV A,3DH
  68.       ADDC A,3DH
  69.       DA A       ;T_S乘2并调整后送回
  70.       MOV 3DH,A
  71.       MOV A,3EH
  72.       ADDC A,3EH
  73.       DA A       ;T_M乘2并调整后送回
  74.       MOV 3EH,A
  75.       DJNZ R5,SBIN_SBCD1 ;循环运行24次得到BCD码结果
  76. ;=====================================
  77. ;双字节BCD码制转4个单字节BCD码
  78. SBCD_DBCD:
  79.       MOV A,3DH
  80.       MOV B,A
  81.       ANL A,#0FH ;将T_S里面的数据存放寄存器B里后再进行与操作得到低四位
  82.       MOV 30H,A  ;并存放到数码管显示的第一位地址40H里面
  83.       MOV A,B
  84.       SWAP A     ;从寄存器取回原来保存的数,再进行高低位互换
  85.       ANL A,#0FH ;进行与操作后得到高四位
  86.       MOV 31H,A  ;最后存放到数码管显示的第二位地址41H里面
  87.       MOV A,3EH  ;同上
  88.       MOV B,A
  89.       ANL A,#0FH
  90.       MOV 32H,A
  91.       MOV A,B
  92.       SWAP A
  93.       ANL A,#0FH
  94.       MOV 33H,A

  95. ;=======================================
  96. ;显示子程序

  97. DIS:     MOV R5,#50      ;显示循环次数,即改变显示延时刷新时间
  98. DIS1:    MOV R1,#30H      ;把显示数据第一位放在R0里
  99.          MOV R2,#04H      ;把显示的位码放在R1里
  100.          MOV R3,#05H      ;把显示的长度放在R2里
  101. DIS2:    MOV A,@R1
  102.          ANL A,#0FH       ;屏蔽显示数据的高四位
  103.          MOV B,A
  104.          MOV A,R2
  105.          ANL A,#0FH       ;屏蔽位码的高四位
  106.          SWAP A
  107.          ORL A,B
  108.          MOV P0,A         ;送总显示数据到P0显示
  109.          LCALL DELY4ms    ;调用延时4ms
  110.          INC R1           ;取下一个显示数据
  111.          DEC R2
  112.          DJNZ R3,DIS2     ;四位显示晚后重新开始显示
  113.          DJNZ R5,DIS1
  114.          MOV A,34H        ;显示完后判断通道好是否为8
  115.          CJNE A,#08H,HUI
  116.          MOV 34H,#00H
  117. HUI:     SETB EX1         ;显示完毕再允许中断
  118.          RET
  119. ;=====================================
  120. ;延时子程序
  121. DELY4ms: MOV R6,#8         ;延时4毫秒
  122. D1:      MOV R7,#248
  123.          DJNZ R7,$
  124.          DJNZ R6,D1
  125.          RET
  126.          END
复制代码

ADC0808中断检测源码:
  1. ;占用单元R0,R1,A,DPTR,30H~37H
  2. ORG 0000H
  3. AJMP MAIN
  4. ORG 0013H
  5. AJMP INT1
  6. ORG 0030H
  7. MAIN: MOV R0,#30H      ;数据暂存区首地址
  8.       MOV R1,#08H      ;8路计数初值
  9.       SETB IT1         ;INT1置为边沿触发
  10.       SETB EA          ;开中断
  11.       SETB EX1         ;允许INT1中断
  12.       MOV DPTR,#7FF8H  ;指向0808通道0
  13.       MOV A,#00H       ;此指令可缺省
  14.       MOVX @DPTR,A     ;启动A/D转换
  15. HERE: NOP
  16.       AJMP HERE        ;等待中断

  17. INT1: PUSH PSW
  18.       MOVX A,@DPTR     ;读A/D转换结果
  19.       MOV @R0,A        ;存数
  20.       INC DPTR         ;更新通道
  21.       INC R0           ;更新暂存单元
  22.       DJNZ R1,HUI      ;巡回未完继续
  23.       MOV R0,#30H      ;数据暂存区首地址
  24.       MOV R1,#08H      ;8路计数初值
  25.       MOV DPTR,#7FF8H  ;指向0808通道0
  26. HUI:  MOVX @DPTR,A     ;再次启动A/D转换
  27.       POP PSW
  28.       RETI             ;返回中断
复制代码

ADC0808查询检测源程序:
  1. ;占用单元R0,R1,A,DPTR,30H~37H
  2. ORG 0000H
  3. AJMP MAIN
  4. ORG 0030H
  5. MAIN: MOV R0,#30H    ;数据暂存区首地址
  6.       MOV R1,#08H    ;8路计数初值
  7.       MOV DPTR,#7FF8H;指向0808通道0
  8.       MOV A,#00H     ;此指令可缺省
  9.       MOVX @DPTR,A   ;启动A/D转换
  10. L1:   JB P3.3,L1     ;查询INT1是否为0
  11.       MOVX A,@DPTR   ;若INT1为0,者转换结束,读出数据
  12.       MOV @R0,A      ;存数
  13.       INC DPTR       ;更新通道
  14.       INC R0         ;更新暂存单元
  15.       MOVX @DPTR,A   ;再次启动A/D转换
  16.       DJNZ R1,L1     ;判断8路查询是否完毕
  17.       AJMP MAIN      ;跳回重新开始
  18.       END
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:187913 发表于 2017-4-9 22:49 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:200970 发表于 2017-5-15 15:59 | 只看该作者
谢谢楼主,很有用..
回复

使用道具 举报

地板
ID:200970 发表于 2017-5-15 16:00 | 只看该作者
感谢楼主
回复

使用道具 举报

5#
ID:728732 发表于 2020-6-17 10:50 | 只看该作者
楼主有C语言版本的程序吗,没学过汇编
回复

使用道具 举报

6#
ID:219315 发表于 2021-6-25 10:20 | 只看该作者
居然还有人在用汇编,很怀旧啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表