实验六 ADC0808 PWM实验
一、实验目的
1、掌握A/D的常用芯片使用基础知识
2、掌握单片机与A/D常用芯片接口程序书写方法
二、实验说明
使用数模转换芯片 ADC0808,通过调节可变电阻RV1 来调节脉冲宽度,运行程序时,通过虚拟示波器观察占空比的变化。
三、实验内容及步骤 (一)实验内容
A/D的常用芯片使用基础知识
1. A/D转换器概述
A/D转换器用以实现模拟量向数字量的转换。 按转换原理可分为 4 种: 计数式、 双积分式、逐次逼近式以及并行式A/D转换器
。逐次逼近式A/D转换器是一种速度较快, 精度较高的转换器, 其转换时间大约在几微秒到几百微秒之间。常用的这种芯片有:
(1) ADC0801~ADC0805型 8 位MOS型A/D转换器; (2) ADC0808/0809 型 8 位MOS型A/D转换器; (3) ADC0816/0817 型 8 位MOS型A/D转换器;
A/D转换器的主要性能指标1.分辨率2.转换时间3.量程4.转换精度 量化间隔和量化误差是A/D转换器的主要技术指标之一。 量化间隔由下式计算: 满量程输入电压 2n1其中n为A/D转换器的位数。
量化误差有两种表示方法: 一种是绝对量化误差; 另一种是相对量化误差。 绝对量化误差
量化间隔 22
1
n1 22. 典型A/D转换器芯片ADC0809 简介
ADC0809 是采用CMOS 工艺制造的双列直插式单片8 位A/D 转换器。(分辨率) 分辨率8 位,精度7 位,带8 个模拟量输入通道,有通道地址译码锁存器,输出带三态数据锁存器。
启动信号为脉冲启动方式,最大可调节误差为±1LSB。(转换精度)
ADC0809 内部没有时钟电路,故CLK 时钟需由外部输入,fclk 允许范围为500kHz~1MHz,典型值为640kHz。每通道的转换需66~73 个时钟脉冲,大约100~110μs。(转换时间)
工作温度范围为-40℃~+85℃。功耗为15mW,输入电压范围为0~5V,单一+5V 电源供电。(量程)
ADC0809的内部结构
ADC0809引脚图
其中:
IN0~IN7:8路模拟量输入端。 D0~D7:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。
ALE:地址锁存允许信号,输入,高电平有效。 START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。
OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。 Vcc:电源,接+5V电源。 GND:地。
地址码与输入通道的对应关系
ADC0809时序图 地址锁存 启动 START/ALE ADDA/B/C EOC 转换结束 读取结果
OE
D0~D7
D A T A
ADC0809的工作流程如图所示:
1.输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。
2.送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
3.当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。
4.当CPU执行一读数据指令,使OE为高电平,则从输出端D0~D1读出数据。 3. ADC0809与MCS-51单片机的接口 (1)硬件接口
下图是一个ADC0809与8051的一个接口电路图。
P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7ALE8051WRP2.7RDINTO分频器++D0IN0D1IN1D2IN2D3IN3D4IN4D5IN5D6IN6D7IN7ADDAADDBADDCVREF+CLKALEVREF-STARTOEEOCADC0809+5VGND
由图可知
0809 ADDA、ADDB、ADDC引脚与单片机P1.O-P1.2引脚相连; 0809 D0~D7引脚与单片机P1引脚相连;
0809 CLK引脚与单片机ALE引脚通过分频期连接;
0809 ALE与START引脚与单片机/WR、P2.7引脚逻辑相连; 0809 OE 引脚与单片机/RD、P2.7引脚逻辑相连; 0809 EOC引脚与单片机INTO引脚逻辑相连;
0809 REF+引脚接+5V电压REF-接地。表示转化范围为(0-5V) (2)软件编程
设接口电路用于一个8路模拟量输入的巡回检测系统,使用中断方式采样数据,把采样转换所得的数字量按序存于片内RAM的30H~37H单元中。采样完一遍后停止采集。 汇编语言编程: ORG 0003H LJMP INT0
ORG 0100H ;主程序
MOV R0,#30H ;设立数据存储区指针 MOV R2,#08H ;设置8路采样计数值
SETB IT0 ;设置外部中断0为边沿触发方式 SETB EA ;CPU开放中断
SETB EX0 ;允许外部中断0中断 MOV DPTR,#0000H ;送入口地址并指向IN0
LOOP: MOVX @DPTR,A ;启动A/D转换,A的值无意义 HERE: SJMP HERE ;等待中断 ORG 0200H ;中断服务程序
INT0: MOVX A,@DPTR ;读取转换后的数字量 MOV @R0,A ;存入片内RAM单元 INC DPTR ;指向下一模拟通道
INC R0 ;指向下一个数据存储单元 DJNZ R2,NEXT ;8路未转换完,则继续
CLR EA ;已转换完,则关中断 CLR EX0 ;禁止外部中断0中断 RETI ;中断返回
NEXT: MOVX @DPTR,A ;再次启动A/D转换 RETI ;中断返回 C语言编程:
#include #include #define IN0 XBYTE[0x0000] //定义IN0为通道0的地址 static uchar data x[8]; //定义8个单元的数组,存放结果 uchar xdata *ad_adr; //定义指向通道的指针 uchar i=0; void main(void) { IT0=1; //初始化 EX0=1; EA=1; i=0; ad_adr=&IN0; //指针指向通道0 *ad_adr=i; //启动通道0转换 for (;;) {;} //等待中断 } void int_adc(void) interrupt 0 //中断函数 { x[0]=*ad_adr; //接收当前通道转换结果 i++; ad_adr++; //指向下一个通道 if (i<8) { *ad_adr=i; //8个通道未转换完,启动下一个通道返回 } else { EA=0;EX0=0; //8个通道转换完,关中断返回 } } (二)实验步骤 1、启动计算机,打开实验Proteus电路,观察电路图。 C122pFU1X112M18XTAL219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C222pFR110k9RSTC3U31612START222324255432128272675%10uFOE9OE293031PSENALEEAVREF(-)VREF(+)ALEADD CADD BADD AIN7IN6IN5IN4IN3IN2IN1IN0ADC0808CLOCKSTARTEOCOEPWM输出AOUT8OUT7OUT6OUT5OUT4OUT3OUT2OUT1EOCSTARTCLOCK1714158181920217610EOC12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51BSTARTCLOCKRV1由图可知 0808 ADDA、ADDB、ADDC引脚引脚接地; 0808 D0~D7与P1口相连; 0808 CLK引脚与单片机P2.4引脚连接; 0808ALE与START引脚与单片机P2.5引脚相连; 0808 OE 引脚与单片机P2.7引脚相连; 0808 EOC引脚与单片机P2.6引脚相连; 0808 REF+引脚接+5V电压REF-接地。表示转化范围为(0-5V); 示波器与单片机P3.0引脚相连. 2、流程图,拟定程序设计思路 3、程序设计,调试. 四、C源程序 /* 名称:用 ADC0808 控制 PWM 输出 说明:使用数模转换芯片 ADC0808,通过调节可变电阻RV1 来调节脉冲宽度, 运行程序时,通过虚拟示波器观察占空比的变*/ #include #define uchar unsigned char #define uint unsigned int sbit CLK=P2^4; //时钟信号 sbit ST=P2^5; //启动信号 sbit EOC=P2^6; //转换结束信号 sbit OE=P2^7;//输出使能 sbit PWM=P3^0;//PWM 输出 //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<40;i++); } //主程序 void main() { uint Val; TMOD=0x02;//T1 工作模式 2 TH0=0x14; TL0=0x00; IE=0x82; TR0=1; while(1) { ST=0;ST=1;ST=0;//启动A/D转换 while(!EOC); //等待转换完成 OE=1; Val=P1;//读转换值 OE=0; if(Val==0)//PWM 输出(占空比为0%) { PWM=0; DelayMS(0xff); continue; } if(Val==0xff)//PWM 输出(占空比为 100%) { PWM=1; DelayMS(0xff); continue; } PWM=1; DelayMS(Val); PWM=0; DelayMS(0xff-Val); } } //T0 定时器中断给 ADC0808 提供时钟信号 void Timer0_INT() interrupt 1 { CLK=~CLK; } 五、思考题 本实验中0808与单片机通信用的是查询方式,请修改电路和程序,使0808与单片机用中断方式通信完成实验要求的任务。 因篇幅问题不能全部显示,请点此查看更多更全内容