1、实验十实验十 ADC0832 数模转换的显示数模转换的显示 实验报告十 实验名称:ADC0832 数模转换的显示 目的:ADC0832 是 8脚双列直插式双通道 A/D转换器,能分别对两路模拟信号实现模数转换,可以用在单端输入方式和差分方式下工作。ADC0832 采用串行通信方式,通过 DI 数据输入端进行通道选择、数据采集及数据传送。8位的分辨率(最高分辨可达 256级),可以适应一般的模拟量转换要求。其部电源输入与参考电压的复用,使得芯片的模拟电压输入在 05V之间。具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方
2、便。ADC0832 的工作原理:正常情况下 ADC0832 与单片机的接口应为 4条数据线,分别是 CS、CLK、DO、DI。但由于 DO 端与 DI端在通信时并未同时使用并与单片机的接口是双向的,所以在 I/O口资源紧时可以将 DO和 DI并联在一根数据线上使用。当 ADC0832 未工作时其 CS 输入端应为高电平,此时芯片禁用,CLK 和 DO/DI 的电平可任意。当要进行A/D转换时,须先将 CS 使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则使用 DI端输入通道功能选择的数据信号。在第一个时钟脉
3、冲的下沉之前 DI端必须是高电平,表示启始信号。在第二、三个脉冲下沉之前 DI端应输入两位数据用于选择通道功能。通道地址 通道 工作方式说明 SGL/DIF ODD/SIGN 0 1 0 0+-差分方式 0 1-+1 0+单端输入方式 1 1 +表 1:通道地址设置表 如表 1所示,当此两位数据为“1”、“0”时,只对 CH0 进行单通道转换。当 2位数据为“1”、“1”时,只对 CH1进行单通道转换。当两位数据为“0”、“0”时,将 CH0作为正输入端 IN+,CH1 作为负输入端 IN-进行输入。当两位数据为“0”、“1”时,将 CH0作为负输入端 IN-,CH1 作为正输入端 IN+进行
4、输入。到第三个脉冲的下降之后 DI端的输入电平就失去输入作用,此后 DO/DI端则开始利用数据输出 DO 进行转换数据的读取。从第 4个脉冲下降沿开始由 DO端输出转换数据最高位 Data7,随后每一个脉冲的下降沿 DO端输出下一位数据。直到第 11 个脉冲时发出最低位数据 Data0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第 11 个字节的下降沿输出 Data0。随后输出 8 位数据,到第 19 个脉冲时数据输出完成,也标志着一次 A/D转换的结束。最后将 CS 置高电平禁用芯片,直接将转换后的数据进行处理就可以了。时序说明请参照图 4。作为单通道模拟信号输入
5、时 ADC0832 的输入电压是 05V且 8位分辨率时的电压精度为 19.53mV,即(5/256)V。如果作为由 IN+与 IN-输入的输入时,可是将电压值设定在某一个较大围之,从而提高转换的宽度。但值得注意的是,在进行 IN+与 IN-的输入时,如果 IN-的电压大于 IN+的电压则转换后的数据结果始终为 00H。硬件原理图:仿真图:程序如下所示:/*包含头文件*/#include#include /*端口定义*/sbit CS=P35;sbit Clk=P33;sbit DATI=P34;sbit DATO=P34;sbit P20=P20;/*定义全局变量*/unsigned cha
6、r dat=0 x00;/AD 值 unsigned char count=0 x00;/定时器计数 unsigned char CH;/通道变量 unsigned char dis=0 x00,0 x00,0 x00;/显示数值/*共阳 LED 段码表*/unsigned char code tab=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;char code tablewe=0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xfe;/*函数功能:AD转换子程序 入口参数:CH 出口参数:dat*/u
7、nsigned char adc0832(unsigned char CH)unsigned char i,test,adval;adval=0 x00;test=0 x00;Clk=0;/初始化 DATI=1;_nop_();CS=0;_nop_();Clk=1;_nop_();if(CH=0 x00)/通道选择 Clk=0;DATI=1;/通道 0 的第一位 _nop_();Clk=1;_nop_();Clk=0;DATI=0;/通道 0 的第二位 _nop_();Clk=1;_nop_();else Clk=0;DATI=1;/通道 1 的第一位 _nop_();Clk=1;_nop_(
8、);Clk=0;DATI=1;/通道 1 的第二位 _nop_();Clk=1;_nop_();Clk=0;DATI=1;for(i=0;i 8;i+)/读取前 8位的值 _nop_();adval=1;Clk=1;_nop_();Clk=0;if(DATO)adval|=0 x01;else adval|=0 x00;for(i=0;i=1;if(DATO)test|=0 x80;else test|=0 x00;_nop_();Clk=1;_nop_();Clk=0;if(adval=test)/比较前 8位与后 8 位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat=tes
9、t;_nop_();CS=1;/释放 ADC0832 DATO=1;Clk=1;return dat;/*函数功能:延时子程序 入口参数:出口参数:*/void delay(void)int k;for(k=10;k500;k+);/*函数功能:将 0-255 级换算成 0.00-5.00的电压数值 入口参数:i 出口参数:*/void convdata(unsigned char i)dis0=i/51;/个位 dis1=(i%51)*10/51*2;/小数点后第一位 dis2=(i%51)*10%51)*10/51*2;/小数点后第二位 /*函数功能:数码管显示子程序 入口参数:出口参数:
10、*/void display(void)P2=0 xff;P0=tabdis0&0 x7f;/显示个位和小数点 delay();P2=0 xfd;P2=0 xff;P0=tabdis1;/显示小数点后第一位 delay();P2=0 xfb;P2=0 xff;P0=tabdis2;/显示小数点后第二位 delay();P2=0 xf7;P2=0 xff;P0=0 xff;/显示小数点后第二位 delay();P2=0 xfe;/*函数功能:主程序 入口参数:出口参数:*/void main(void)P2=0 xff;/端口初始化 P0=0 xff;delay();CH=0 x00;/在这里选
11、择通道 0 x00 或 0 x01 TMOD=0 x01;/设置中断 TH0=(65536-50000)/256;/定时器 1初值定时 50ms TL0=(65536-50000)%256;IE=0 x82;TR0=1;while(1)/主循环 dat=adc0832(CH);convdata(dat);/数据转换 display();/显示数值 /*函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定 入口参数:出口参数:*/void timer0(void)interrupt 1 TMOD=0 x01;TH0=(65536-50000)/256;/定时器 1初值定时 50ms TL0=(65536-50000)%256;IE=0 x82;TR0=1;count+;if(count=0 x01)count=0 x00;dat=adc0832(CH);程序流程图:现象:调节 AD1,使 AD1顺时针转动,LED1 上的电压不断减小;调节 AD0,使 ADO 顺时针转动,LED2 上的电压不断减小。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1