实验六ADC0808PWM实验一、实验目的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转换器的主要技术指标之一。量化间隔由下式计算:其中n为A/D转换器的位数。量化误差有两种表示方法:一种是绝对量化误差;另一种是相对量化误差。绝对量化误差2.典型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电源供电。(量程)12n满量程输入电压22量化间隔121nADC0809的内部结构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时序图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的一个接口电路图。START/ALE地址锁存ADDA/B/CEOCOED0~D7启动转换结束读取结果DATAP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7ALEWRP2.7RDINTO+++5VGNDD0D1D2D3D4D5D6D7ADDAADDBADDCCLKALESTARTOEEOCIN0IN1IN2IN3IN4IN5IN6IN7VREF+VREF-ADC08098051分频器P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7ALEWRP2.7RDINTO+++5VGNDD0D1D2D3D4D5D6D7ADDAADDBADDCCLKALESTARTOEEOCIN0IN1IN2IN3IN4IN5IN6IN7VREF+VREF-ADC08098051分频器由图可知0809ADDA、ADDB、ADDC引脚与单片机P1.O-P1.2引脚相连;0809D0~D7引脚与单片机P1引脚相连;0809CLK引脚与单片机ALE引脚通过分频期连接;0809ALE与START引脚与单片机/WR、P2.7引脚逻辑相连;0809OE引脚与单片机/RD、P2.7引脚逻辑相连;0809EOC引脚与单片机INTO引脚逻辑相连;0809REF+引脚接+5V电压REF-接地。表示转化范围为(0-5V)(2)软件编程设接口电路用于一个8路模拟量输入的巡回检测系统,使用中断方式采样数据,把采样转换所得的数字量按序存于片内RAM的30H~37H单元中。采样完一遍后停止采集。汇编语言编程:ORG0003HLJMPINT0ORG0100H;主程序MOVR0,#30H;设立数据存储区指针MOVR2,#08H;设置8路采样计数值SETBIT0;设置外部中断0为边沿触发方式SETBEA;CPU开放中断SETBEX0;允许外部中断0中断MOVDPTR,#0000H;送入口地址并指向IN0LOOP:MOVX@DPTR,A;启动A/D转换,A的值无意义HERE:SJMPHERE;等待中断ORG0200H;中断服务程序INT0:MOVXA,@DPTR;读取转换后的数字量MOV@R0,A;存入片内RAM单元INCDPTR;指向下一模拟通道INCR0;指向下一个数据存储单元DJNZR2,NEXT;8路未转换完,则继续CLREA;已转换完,则关中断CLREX0;禁止外部中断0中断RETI;中断返回NEXT:MOVX@DPTR,A;再次启动A/D转换RETI;中断返回C语言编程:#includereg51.h#includeabsacc.h//定义绝对地址访问#defineucharunsignedchar#defineIN0XBYTE[0x0000]//定义IN0为通道0的地址staticuchardatax[8];//定义8个单元的数组,存放结果ucharxdata*ad_adr;//定义指向通道的指针uchari=0;voidmain(void){IT0=1;//初始化EX0=1;EA=1;i=0;ad_adr=&IN0;//指针指向通道0*ad_adr=i;//启动通道0转换for(;;){;}//等待中断}voidint_adc(void)interrupt0//中断函数{x[0]=*ad_adr;//接收当前通道转换结果i++;ad_adr++;//指向下一个通道if(i8){*ad_adr=i;//8个通道未转换完,启动下一个通道返回}else{EA=0;EX0=0;//8个通道转换完,关中断返回}}(二)实验步骤1、启动计算机,打开实验Proteus电路,观察电路图。由图可知0808ADDA、ADDB、ADDC引脚引脚接地;0808D0~D7与P1口相连;0808CLK引脚与单片机P2.4引脚连接;0808ALE与START引脚与单片机P2.5引脚相连;0808OE引脚与单片机P2.7引脚相连;0808EOC引脚与单片机P2.6引脚相连;0808REF+引脚接+5V电压REF-接地。表示转化范围为(0-5V);示波器与单片机P3.0引脚相连.2、流程图,拟定程序设计思路PWM输出XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51OUT121ADDB24ADDA25ADDC23VREF(+)12VREF(-)16IN31IN42IN53IN64IN75START6OUT58EOC7OE9CLOCK10OUT220OUT714OUT615OUT817OUT418OUT319IN228IN127IN026ALE22U3ADC080875%RV1ABOEOECLOCKCLOCKEOCEOCSTARTSTARTSTARTC122pFC222pFC310uFX112MR110k3、程序设计,调试.四、C源程序/*名称:用ADC0808控制PWM输出说明:使用数模转换芯片ADC0808,通过调节可变电阻RV1来调节脉冲宽度,运行程序时,通过虚拟示波器观察占空比的变*/#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitCLK=P2^4;//时钟信号sbitST=P2^5;//启动信号sbitEOC=P2^6;//转换结束信号sbitOE=P2^7;//输出使能sbitPWM=P3^0;//PWM输出//延时voidDelayMS(uintms){uchari;while(ms--)for(i=0;i40;i++);}//主程序voidmain(){uintVal;TMOD=0x02;//T1工作模式2TH0=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提供时钟信号voidTimer0_INT()interrupt1{CLK=~CLK;}五、思考题本实验中0808与单片机通信用的是查询方式,请修改电路和程序,使0808与单片机用中断方式通信完成实验要求的任务。