ADC0809
管脚功能说明
(1)IN7~IN0:8路模拟量输入端.允许8路模拟量分时输入,共用一个A/D转换器.
(2)D7~D0:8位数字量输出. D7为最高位, D0为最低位.由于有三态输出锁存,可与主机数据总线直接相连.
(3)C、B、A:3位地址线即模拟量通道选择线.ALE为高电平时,地址译码与对应通道选择见表2-2 .
(4)ALE:地址锁存允许信号(Address Latch Enable),输入,高电平有效.上升沿时锁存3位通道选择信号.
(5)START:启动A/D转换信号,输入,高电平有效.上升沿时将转换器内部清零,下降沿时启动A/D转换.
(6)EOC(End of Convention):转换结束信号,输出,AD转换完成,EOC变为高电平.
(7)OE(Output Enable):输出使能信号,输入,高电平有效.该信号用来打开三态输出缓冲器,将A/D转换得到的8位数字量送到数据总线上.
(8)CLOCK:外部时钟脉冲输入端.当脉冲频率为640kHz时,A/D转换时间为100ms
(9)Vref+,Vref-:参考电压源正、负端.取决于被转换的模拟电压范围,通常Vref+ = +5V,Vref- = 0V
(10)Vcc:工作电源,+5V
(11)GND:电源地
ADC0809与单片机连接示意图
外部中断+三总线 模式控制ADC0809
采样通道地址
以P2.7引脚为例→对应地址7FFFH
分析各个通道的地址:IN0到IN7的地址为7FF8H到7FFFH
对应下图的ABC连接A0 A1 A2,作为P0口复用地址线低8位的其中低3位
C | B | A | 选中通道 |
---|---|---|---|
0 | 0 | 0 | IN0 |
0 | 0 | 1 | IN1 |
0 | 1 | 0 | IN2 |
0 | 1 | 1 | IN3 |
1 | 0 | 0 | IN4 |
1 | 0 | 1 | IN5 |
1 | 1 | 0 | IN6 |
1 | 1 | 1 | IN7 |
ADC0809转换过程
ADC0809例题
ADC0809采集
①中断触发方式
💡例:ADC0809 IN1通道读取AD数据存储在内部RAM30H处
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1SUB
START:
MOV SP ,#60H
SETB IT1
SETB EX1
SETB EA
MOV DPTR ,#7FF9
MOVX @DPTR ,A ;启动A/D转换
SJMP $
INT1SUB:
MOVX A ,@DPTR
MOV 30H A
MOVX @DPTR ,A ;启动A/D转换
RETI
END
②中断查询方式
ORG 0000H ;主程序入口地址
AJMP MAIN ;跳转主程序
ORG 1000H ;程序入口地址
MAIN:
MOV DPTR,#7FF8H ;指向0809 IN0通道地址
MOV R7,#08H
MOVX @DPTR,A ;启动A/D转换
LOOP:
JNB P3.3,$ ;EOC直接和P3.3相连(INT1引脚)
MOVX A,@DPTR ;读A/D转换结果
MOV @R0,A ;存数
INC R0
INC DPTR
DJNZ R7,LOOP
SJMP $
END
💡例:ADC0809 ,对8个通道IN0-IN7进行模数转换 ,fosc = 6MHz,并将转换结果一次存储到内部RAM40H-47H中
ORG 0000H
LJMP MLOOP
ORG INT1SUB
MLOOP:
MOV SP ,#60H
MOV R0 ,#40H
MOV R7 ,#08H
SETB IT1 ;边沿触发
SETB EA
SETB EX1
MOV DPTR ,#7FF8H ;指向0809IN0通道地址
MOVX @DPTR ,A ;启动A/D转换
SJMP $ ;等待中断
INT1SUB:
MOVX A ,@DPTR ;读A/D转换结果
MOV @R0 ,A
INC R0
INC DPTR
DJNZ R7 ,NEXT ;若未采完8次则NEXT
CLR EX1
NEXT:
MOVX @DPTR ,A ;启动A/D转换
RETI
END
ADC0809+定时器
💡例:间隔1s采集一次,IN0采集AD数据存储在内部RAM30H中,使用定时器1方式1,外部中断1
定时100ms,计数初值为:X=15536=3CB0H
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1SUB
ORG 001BH
LJMP T1SUB
START:
MOV TH1 ,#3CH
MOV TL1 ,#0B0H
SETB TR1
SETB ET1
SETB EA
MOV R2 ,#10
SETB EX1
SETB IT1 ;边沿触发
MOVX DPTR ,#7FF8H
SJMP $
T1SUB:
MOV TH1 ,#3CH
MOV TL1 ,#0B0H
DJNZ R2 ,NEXT ;100ms跳过
MOV R2 ,#10
MOVX @DPTR ,A ;1s启动A/D转换
NEXT:
RETI
INT1SUB:
MOVX A ,@DPTR ;读A/D转换结果
MOV 30H ,A
RETI
END
💡例:并编写汇编代码,fosc=6MHz,每间隔1秒对AD0809八个AD通道IN0~IN7进行模数转换,并将转换结果依次存储到内部RAM 的40H~47H位置
ORG 0000H
LJMP START
ORG 0003H
LJMP INT0SUB
ORG 000BH
LJMP T0SUB
START:
MOV SP ,#60H
MOV TH0 ,#3CH
MOV TL0 ,#0B0H
SETB TR0
SETB ET0
SETB EA
MOV R2 ,#10
MOV R0 ,#40H
MOV R7 ,#08H
SETB EX0
SETB IT0
MOVX DPTR ,#0FF78H ;16个引脚只用到4个 A7 , A0,A1,A2 0111_1000
SJMP $
T0SUB:
MOV TH0 ,#3CH
MOV TL0 ,#0B0H
DJNZ R2 ,NEXT ;100ms跳过
MOV R2 ,#10
MOVX @DPTR ,A ;1s启动A/D转换
NEXTT0:
RETI
INT0SUB:
MOVX A ,@DPTR ;读A/D转换结果
MOV @R0 ,A
INC R0
INC DPTR
DJNZ R7 ,NEXTINT ;若未采完8次则NEXT
MOVX DPTR ,#0FF78H
MOV R7 ,#08H
MOV R0 ,#40H
NEXTINTI:
MOVX @DPTR ,A ;启动A/D转换
RETI
END
ADC0809+定时器+串口
💡例:用ADC0809以100Hz的频率采集1个通道的模拟信号,并将获得的数字量,通过串口发送到计算机,串口工作方式1,波特率4800bps,fosc=11.0592MHz,10ms采集一次
定时器10ms,初值: 2 16 − 10 × 1 0 − 3 1.08507 × 1 0 − 6 = 56320 2^{16}-\frac{10\times 10^{-3}}{1.08507\times 10^{-6}}=56320 216−1.08507×10−610×10−3=56320 → DC00H
ORG 0000H
LJMP START
ORG 000BH
LJMP T0SUB
;ORG 0023H
;LJMP TXSRV
ORG 0003H
LJMP INT0SUB
START:
MOV SP ,#60H
MOV TH1 ,#0F4H
MOV TL1 ,#0F4H ;定时器1工作方式2 8位自动重装载作为串口波特率发生器
MOV TMOD ,#21H ;定时器1方式2-波特率,定时器0定时1s方式1 16位.TMOD = 00100001
MOV SCON ,#40H ;串口工作方式1
SETB TR1
MOV PCON ,#80H ;SMOD = 1
MOV TH0 ,#0DCH
MOV TL0 ,#00H ;fosc = 11.0592MHz 11059200/12=9216,65536-9216=DC00H
SETB ET0
SETB EA
SETB EX0 ;外部中断0
SETB IT0 ;边沿触发
MOV DPTR ,#7FF8H ;AD地址通道0地址
SJMP $
T0SUB:
;10ms进入定时器中断采样
MOV TH0 ,#0DCH
MOV TL0 ,#00H ;fosc = 11.0592MHz 11059200/12=9216,65536-9216=DC00H
MOVX @DPTR ,A
RETI
INT0SUB:
MOVX A ,@DPTR
MOV SBUF A
JNB TI ,$ ;串口发送标志位查询方式
CLR TI
RETI
END