**

1. A/D0809芯片特点

**
ADCO809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,可根据地址码选通其中一路输入信号进行AD转换。该芯片主要具有以下特性:
☆8路输入通道,8位AD转换器,即分辨率为8位;
☆具有转换启动停止控制端;
☆转换时间为100us(时钟为640KHz时),130us(时钟为500KHz时)﹔
☆单个+5V电源供电,低功耗,约15mV;
☆模拟输入电压范围O~+5V,不需零点和满刻度校准;
☆工作温度范围为-40~~+85摄氏度;

2.A/D0809引脚

ADCO809芯片有28个引脚,采用双列直插式封装。如下图所示:

3.时序图

4.实验仿真

Tips:因为Proteus里面无法使用0809,所以用0808代替0809,两者的功能差不多

首先是proteus的仿真图:

其中的蓝色的时钟在这里找:

因为0809时钟周期的典型值为100us,所以我的频率设置为10kHz

其中仿真的器件表如下:

器件 名称
ADC0808数模转换芯片 ADC0808
滑动变阻器 POT-HG
共阳极数码管(Common anode) 7SEG-MPX4-CA
单片机 80C51

汇编代码如下:

 ORG     1000HDB     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90     AD0809_ADDA BIT P1.4AD0809_ADDB BIT P1.5AD0809_ADDC BIT P1.6AD0809_CLK  BIT P1.3AD0809_STAT BIT P1.2AD0809_EOC  BIT P1.1AD0809_OE   BIT P1.0AD0809_DA   EQU 71HORG 0000HSJMP MAINORG 0030H
MAINLOOP:ACALL MAINSJMP  MAINLOOP
MAIN: ;选择0通道输出CLR AD0809_ADDACLR AD0809_ADDBCLR AD0809_ADDC;产生一个下降沿启动AD转换CLR AD0809_STATSETB AD0809_STATCLR AD0809_STAT
LOOP1:;等待转换完成JNB AD0809_EOC,LOOP1;允许输出SETB AD0809_OE;P3的输出到AMOV A,P3;下面是计算16进制转换为10进制的数,从0-255映射到0-5的比较精确的做法,;这个做法相当于0-25500映射到0-500,然后显示的时候在百位后面加一个小数点就好;而最后面一种做法是0-255映射到0-5,这种计算方法的累计误差到最后映射时会增大到0.1;下面的注释都是以A=ff计算出来的结果,可以直接将A赋值为ffH,然后在调试窗口观察得到;计算个位MOV B,#33H   ;B=51,A=254DIV ABMOV 30H,A         ;A=4,B=50,(30h) = 4;计算小数点后一位MOV A,B        ;A= B=50MOV B,#0AH      ;A=50,B= 10MUL AB          ;A=244,B=1=256(因为计算后B保存高位,111110100=100000000+11110100=256+244)ADD A,B         ;A=245,加B是因为b的值除以51后余数为1,要加入低位中进行计算,否则会漏掉一些数MOV R0,A        ;保存低位的值,因为后面要用AMOV A,#05H      ;A=5,B=1将A赋值为5,是因为B是高位,B=1实际是B=100000000=256除以51后为五MUL AB          ;A=5,B=0MOV R1,A        ;这个5的值是小数点后的一部分,还可能因为最开始A输入的值的不同而等于零,A的实际的数字是以A=0xFE计算所得MOV A,R0        ;A=245,B=0;MOV B,#33H      ;A=245,B=51DIV AB         ;A=4,B=41ADD A,R1       ;R1=9MOV 31H,A      ;(31h)=9;计算小数点后两位,步骤跟上面一样,可以从B保存了的值计算出第二位小数MOV A,#0AH      ;A=10,B=41MUL  AB         ;A=9A=154,B=1=256ADD A,B         ;A=9B=155,B=1=256MOV R0,A        ;A=155,R0=155MOV A,#05H      ;A=5,B=1MUL AB          ;A=5,B=0MOV R1,A        ;R1=A=5,B=0MOV A,R0        ;A=155,B=0MOV B,#33H        ;A=155,B=51=0X33DIV  AB         ;A=3,B=2ADD A,R1       ;R1=8MOV 32H,A      ;(32H)=8//    以下是第二种计算方法,在做乘法的时候原本以为高位不会有值
//;但只要乘法后的数字大于255就会对高位进行赋值但本题目高位最多为1或者为零
//   MOV B,#0x33
//   DIV AB
//   MOV 30H,A
//   MOV A,B
//   MOV B,#0AH
//   MUL AB
//   MOV B,#0x33
//   DIV AB
//   MOV 31H,A
//   MOV A,B
//   MOV B,#0AH
//   MUL AB
//   MOV B,#33
//   DIV AB
//   MOV 32H,A;以下是第一种转换数值的方法,发现误差太大;MOV R0,#71H; MOV @R0,A;将16进制数转换到10进制数并且保存到30H,31H,32H; MOV B,#64H; DIV AB; MOV 30H,A; MOV A,B; MOV B,#0AH; ;DIV AB; MOV 31H,A; MOV 32H,B ;原来的数字,; MOV R0,#30H; MOV A,@R0; MOV 33H,A; MOV R0,#31H;MOV A,@R0; MOV 34H,A;  MOV R0,#32H; MOV A,@R0;  MOV 35H,A;转换函数.乘二
;    MOV R0,#32H
;    MOV A,@R0
;    RL A
;    MOV B,#0AH
;    DIV AB
;    MOV 32H,B
;    MOV R0,#31H
;    MOV B,A    ;对A里面的内容进行保存
;    MOV A,@R0 ;更新A
;    RL  A     ;乘二
;    ADD A,B    ;加一
;    MOV B,#0AH
;    DIV AB
;    MOV 31H,B; MOV R0,#30H
;    MOV B,A    ;对A里面的内容进行保存
;    MOV A,@R0 ;更新A
;    RL  A     ;乘二
;    ADD A,B    ;加一
;    MOV 30H,A
;显示函数---------------------------------------------------------
;段选:P1.0->P1.7
;位选:P2.0->P2.3
DISPLAY1:
MOV     DPTR, #1000H            ;码表起始地址
MOV     R0, #30H                ;显存起始地址
MOV     R1, #02H                ;位选码 P3.7->0 0 0 0 0 0 0 1->P3.0;四位循环----------------------------------------------------------
DISPLAYLOOP:
MOV     P0, #0FFH               ;消影;查表操作
MOV     A, @R0                 ;间接寻址,获取显存
MOVC    A, @A+DPTR                ;将显存中的数字映射到段码CJNE    R1,#02H,LOOP2
MOV     R3,#80H
ADD     A,R3
LOOP2:
MOV     P0, A                   ;段选赋值
MOV     P2, R1                  ;位选赋值
ACALL   DELAY                   ;延时
INC     R0                      ;显存地址自加,切换到下一位数字的显存;位选左移,切换到下一位显示
MOV     A, R1
RL      A
MOV     R1, ACJNE   R1, #10H,DISPLAYLOOP    ;根据位选码,判断是否完成四位切换
SJMP    MAIN
RET;延时函数----------------------------------------------------------
DELAY:
MOV     R7, #2
DELAYLOOP1:
MOV     R6, #2
DELAYLOOP2:
MOV     R5, #10
DELAYLOOP3:
NOP
DJNZ    R5, DELAYLOOP3
DJNZ    R6, DELAYLOOP2
DJNZ    R7, DELAYLOOP1
RET
END

上面的代码废话有点多,不喜欢的可以直接看这个:

  ORG        1000HDB     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90     AD0809_ADDA BIT P1.4AD0809_ADDB BIT P1.5AD0809_ADDC BIT P1.6AD0809_CLK  BIT P1.3AD0809_STAT BIT P1.2AD0809_EOC  BIT P1.1AD0809_OE   BIT P1.0AD0809_DA   EQU 71HORG 0000HSJMP MAINORG 0030H
MAINLOOP:ACALL MAINSJMP  MAINLOOP
MAIN: ;选择0通道输出CLR AD0809_ADDACLR AD0809_ADDBCLR AD0809_ADDC;产生一个下降沿启动AD转换CLR AD0809_STATSETB AD0809_STATCLR AD0809_STAT
LOOP1:;等待转换完成JNB AD0809_EOC,LOOP1;允许输出SETB AD0809_OE;P3的输出到AMOV A,P3;下面是计算16进制转换为10进制的数,从0-255映射到0-5的比较精确的做法,;这个做法相当于0-25500映射到0-500,然后显示的时候在百位后面加一个小数点就好MOV B,#33H   DIV ABMOV 30H,A           MOV A,B       MOV B,#0AH      MUL AB          ADD A,B         MOV R0,A       MOV A,#05H      MUL AB          MOV R1,A       MOV A,R0       MOV B,#33H     DIV AB        ADD A,R1     MOV 31H,A    MOV A,#0AH     MUL  AB        ADD A,B        MOV R0,A        MOV A,#05H     MUL AB          MOV R1,A       MOV A,R0        MOV B,#33H      DIV  AB         ADD A,R1      MOV 32H,A
;显示函数---------------------------------------------------------
;段选:P1.0->P1.7
;位选:P2.0->P2.3
DISPLAY1:
MOV     DPTR, #1000H            ;码表起始地址
MOV     R0, #30H                ;显存起始地址
MOV     R1, #02H                ;位选码 P3.7->0 0 0 0 0 0 0 1->P3.0;四位循环----------------------------------------------------------
DISPLAYLOOP:
MOV     P0, #0FFH               ;消影;查表操作
MOV     A, @R0                 ;间接寻址,获取显存
MOVC    A, @A+DPTR                ;将显存中的数字映射到段码CJNE    R1,#02H,LOOP2
MOV     R3,#80H
ADD     A,R3
LOOP2:
MOV     P0, A                   ;段选赋值
MOV     P2, R1                  ;位选赋值
ACALL   DELAY                   ;延时
INC     R0                      ;显存地址自加,切换到下一位数字的显存;位选左移,切换到下一位显示
MOV     A, R1
RL      A
MOV     R1, ACJNE   R1, #10H,DISPLAYLOOP    ;根据位选码,判断是否完成四位切换
SJMP    MAIN
RET;延时函数----------------------------------------------------------
DELAY:
MOV     R7, #2
DELAYLOOP1:
MOV     R6, #2
DELAYLOOP2:
MOV     R5, #10
DELAYLOOP3:
NOP
DJNZ    R5, DELAYLOOP3
DJNZ    R6, DELAYLOOP2
DJNZ    R7, DELAYLOOP1
RET
END

这是我做单片机实验的时候做的,如果您翻阅这篇文章的时间离我发表的时间够近,我还可以帮您解答您的相关疑问,但是时间长了我可能就忘记了,到时候说不定有些地方我自己也看不懂,也就也爱莫能助了,抱歉!!!

AD转换汇编语言模数转换实验相关推荐

  1. ad转换汇编语言程序_C程序如何转换成汇编

    ad转换汇编语言程序 在较早的文章中,我们已经了解了C运行时:启动main和如何将C程序存储在RAM存储器中之前 . 在这里,我们将看到" C程序如何转换为程序集?" 以及它在机器 ...

  2. pic1路AD转换c语言,pic单片机的ad转换(实例解析)

    描述 AD转换就是模数转换.顾名思义,就是把模拟信号转换成数字信号.主要包括积分型.逐次逼近型.并行比较型/串并行型.Σ-Δ调制型.电容阵列逐次比较型及压频变换型.A/D转换器是用来通过一定的电路将模 ...

  3. AD转换中【参考电压】的作用

    AD转换 AD转换就是模数转换.顾名思义,就是把模拟信号转换成数字信号.主要包括积分型.逐次逼近型.并行比较型/串并行型.Σ-Δ调制型.电容阵列逐次比较型及压频变换型. A/D转换器是用来通过一定的电 ...

  4. AD转换中参考电压的作用

    AD转换 AD转换就是模数转换.顾名思义,就是把模拟信号转换成数字信号.主要包括积分型.逐次逼近型.并行比较型/串并行型.Σ-Δ调制型.电容阵列逐次比较型及压频变换型. A/D转换器是用来通过一定的电 ...

  5. 单片机模数转换实验c语言程序,单片机实验AD转换实验

    <单片机实验AD转换实验>由会员分享,可在线阅读,更多相关<单片机实验AD转换实验(5页珍藏版)>请在人人文库网上搜索. 1.实验报告课程名称: 单片机原理及应用 实验项目: ...

  6. 计算机控制系统AD实验报告,实验一AD转换实验报告.docx

    文档介绍: 实验一AD转换实验报告.docx计算机控制系统实验报告实验一实验名称:A/D转换实验二零一六年三月实验_A/D转换实验.实验要求利用ADC做A/D转换器,将模拟量转换成二进制数字量,用延时 ...

  7. c语言ad转换实验报告,数据采集AD转换实验报告.doc

    数据采集AD转换实验报告.doc 学生实验报告册课程名称学 院专业班级姓 名学 号指导教师成 绩学年学期2017-2018学年 秋学期重庆邮电大学教务处制实验项目名称数据采集_A/D转换实验地点控制专 ...

  8. 计算机控制系统AD实验报告,实验一AD转换实验报告

    实验一AD转换实验报告 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 计算机控制系统实验报告实验一实验名称:A/D转换实验二零一六年三 ...

  9. AVR单片机 实验六 AD转换应用实验

    AVR单片机 实验六 AD转换应用实验 1 实验目的 通过实验,了解AVR单片机模数转换器的初始化,及以定时器自动触发AD转换的方法和工作原理. 2 实验内容 (1) 调整可变电阻, 以获取模拟电压输 ...

最新文章

  1. freemarker 读取字符串模板,(非文件)
  2. 您认为有关垃圾收集的7件事-完全错了
  3. 在linux 5上配置戴尔MD3220i
  4. 实现pv uv统计_聊聊前端监控(二)--行为监控的技术实现
  5. 学好Windows编程要看的书籍
  6. .NET下实现分布式缓存系统Memcached
  7. javaweb中jsp调试8080端口被占用问题
  8. mysql按年创建分区表,增加分区表,删除分区表,实战练习
  9. 把代码写成艺术,真正体会面向对象编程思想
  10. 基于图神经网络的时空预测
  11. 用纯css打造表格第一行和前几列锁定
  12. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)
  13. java从零到项目实战(八)
  14. vi编辑器终端程序的运行(hello world)
  15. ubuntu(18.04LTS)切换 tty终端模式 和图形桌面
  16. 使用endnote导入参考文献后的诸多问题
  17. Django urls 下划线的坑-Using the URLconf defined in xxx, Django tried these URL patterns, in thi
  18. 2021 中国一流大学名单(30 所)和中国大学综合实力 700 强出炉!
  19. 重庆大学教授向宏:360扣扣保镖不是病毒和间谍软件
  20. 用C语言编写数字时钟

热门文章

  1. SAP中内部订单月结差异问题的实例
  2. 机器学习-文本处理之电影评论多分类情感分析
  3. 八皇后问题——列出所有的解,可推至N皇后
  4. c#和python_饮冰三年-人工智能-Python-10之C#与Python的对比
  5. 大数据入门--hadoop(三)--MR编程
  6. 模态振型的一些概念解释
  7. 网易云音乐 ubuntu
  8. 捋一捋人工智能(AI)、机器学习(ML)、深度学习(DL)之间的关系
  9. htmlmo标签,index.html
  10. 线性代数-矩阵及其运算(总结)