ADC0804模数转换器的应用实例

实验要求: 应用a/d转换器将滑动电阻输出的模拟电压量转换为数字电压量,将数字电压量输出到四位数码管,并通过电压表给出模拟电压量的读数。下图是实验截图。
实验方案: 应用proteus设计实验用模拟电路,a/d转换器采用adc0804模拟器件,滑动电阻采用proteus支持的pot-hg,四位数码管采用7seg-mpx4ca。
adc0804模数转换器
有20个引脚,分辨率为8位,转换时间为100μs,输入电压范围为0~5v。
分辨率:a/d转换器对输入模拟信号的分辨能力,adc0804分辨率为8位,即输出位数为8个二进制位,可以区分2^8(256)不同等级的输入模拟电压,能区分输入的电压最小值为满量程输入的1/2^8(1/256),若需要区分更小的输入电压。就需要增加输出位数,提高a/d转换器的分辨率。
转换时间:a/d转换器从接收到模拟电压到输出数字电压需要的时间,不同类型的转换器转换时间不同,并行比较的a/d转换器转换时间可达50ns以内,逐次比较的a/d转换器转换时间一般在10~100μs之间,双积分a/d转换器转换时间一般在几十毫秒到几百毫秒之间。
cs引脚:芯片的片选信号,低电平有效。若该引脚为低电平,芯片开始工作,若该引脚为高电平,芯片停止工作。当外接多个adc0804芯片时,该引脚可作为芯片的选择地址,通过不同的地址信号使用不同的adc0804芯片,从而可以实现多个adc通道的分时复用。
wr引脚:采样触发信号,低电平有效。若该引脚由高电平变为低电平时,芯片对模拟信号进行一次采样,并进行ad转换。
rd引脚:转换数据完成信号,低电平有效。若检测到该引脚为低电平,说明一次转换完成,转换完成的数据从db0~db7引脚读取。
vin+和vin-引脚:模拟电压输入端,用以接收单极性、双极性和差模输入信号。双极性输入信号有正负电压、零电压,单极性输入信号仅有正电压。若为单极性输入信号,vin+接模拟电压的输入,vin-接地;若为双极性输入信号,vin+和vin-分别接模拟输入电压的正极和负极。
vref/2引脚:参考电压接入引脚。该引脚可外接电压,也可悬空。
clkin引脚:引入外部时钟脉冲,用于芯片的时钟信号。
clkr引脚:内部时钟发生器外接电阻端,与clkin端配合可由芯片自身产生时钟脉冲,时钟脉冲频率范围一般为100khz~1460khz。
intr引脚:转换结束输出信号,低电平有效,当一次a/d转换完成后,该引脚被设置为0。在实际应用中,该引脚可与外部中断输入引脚相连(如51单片机的int0,int1脚),触发中断请求,中断发生后,还需等待rd=0才能正确读出a/d转换结果。若不使用中断,该引脚可以悬空。
agand和dgand引脚:模拟接地和数字接地,两个引脚可以直接接地。
vcc引脚:接+5v电源。
db0~db7引脚:输出a/d转换后的8位二进制结果。
四位数码管7seg-mpx4ca
实验用显示器件采用四位数码管7seg-mpx4ca,该器件共有12个引脚。其中1、2、3、4引脚为位选信号,用于控制几个数码管亮,a~g引脚为显示数字的段选信号,dp引脚为小数点。
实验电路设计
adc0804中的vcc接入5v电源,ref/2引脚悬空(悬空则相当于与vcc共接5v电源),因此adc转换的参考电压为vcc的值,即5v。db0db7引脚连接单片机的p1.0p1.7,rd和wr引脚连接单片机的p3.6和p3.7,vin+引脚接滑动变阻器的可调节端,vin-引脚接地,在vin+和vin-引脚之间接入电压表,clkin引脚和clkr引脚连接的电容和电阻构成外部时钟脉冲。单片机p0.0~p0.7接四位数码管的段选线。
单片机内运行的完整c程序如下:
#include#include#define uint unsigned int#define uchar unsigned charsbit wr=p3^6;sbit rd=p3^7;uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uint x) { uchar i; while(x--) for(i=0;i< 120;i++); }void display(uchar db){ uchar bw,sw,gw; float value; int voltage; value = (float)db * 5 / 256 * 100; voltage = (int)value; bw=voltage/100; sw=voltage%100/10; gw=voltage%10; p2=0x01; p0=dis[bw]&0x7f; delay(5); p2=0x02; p0=dis[sw]; delay(5); p2=0x04; p0=dis[gw]; delay(5); p2=0x08; p0=dis[0]; delay(5);} void main(){ uchar i; while(1) { wr=0; _nop_(); wr=1; delay(1); p1=0xff; rd=0; _nop_(); for(i=0;i< 10;i++) display(p1); } }位变量wr和rd用于操作p3.6和p3.7,p3.6和p3.7连接到了adc0804的wr和rd引脚,用于控制信号采样和读取采样信号。数组变量dis[]定义了数码管显示的数字编码。
delay(uint x)是延迟函数,参数x为延时的毫秒数。
display(uchar db)是数码管显示函数,参数db为p1口,p1口存储了采集到的电压数字量。adc0804的分辨率为8位,可以区分2^8(256)不同等级的输入模拟电压,且输入电压量程为0 ~ 5v,adc0804输出的数值范围为0~256,转换为电压(单位v)的公式为:
输出的数值*输入最大量程 / 256
下面的代码将输出的数值转换为电压的数字量(单位v),并分别计算出数字量的各个位数。
value = (float)db * 5 / 256 * 100; // 输出数值转换为电压,乘以1000方便计算出数值的各个位数voltage = (int)value; bw=voltage/100; // 计算出百位数sw=voltage%100/10; // 计算出十位数gw=voltage%10; // 计算出个位数语句p2=0x01选择数码管的第1位显示数字,语句p0=dis[bw]&0x7f用于显示数字和小数点,dis[bw]指定的数字的编码,再和0x7f做与操作,显示小数点。
main()函数是主控函数,应用while结构循环采集和转换可变电阻输出的电压,并将采集的电压输出到数码管显示。语句wr=0将adc0804的wr引脚设为低电平,通知adc0804进行采样,语句_nop_()执行_nop_()函数, nop ()函数不是c语言标准库的函数,它是51单片机提供的指令,它执行一个机器周期的空操作,让adc0804完成数据采样和模数转换,其后执行语句wr=1,将adc0804的wr引脚设为高电平。语句p1=0xff将p1各端口都设置为高电平,准备接收采集的数据,语句rd=0将adc0804的rd引脚设为低电平,从db0~db7引脚读取数据到p1口。

云计算成为支撑数字经济发展的重要力量
爱立信与诺基亚大战
工信部:正编制新计划,“5G+工业互联网”是推进重点
动力电池补贴被取消,国内企业的挑战来了
华为鸿蒙一智慧人生!
ADC0804模数转换器的应用实例
我国大陆显示产业改变了不掌握大尺寸液晶面板制造技术的现实?
电梯视频对讲机的工作原理和优势|深圳梯云物联科技有限公司
安规电容出现后对电子产品有哪些影响呢?
华为荣耀9什么时候上市最新消息:OPPOR11穷追不舍,小米6先发制人!华为荣耀8升级版荣耀9能生存吗?
Nutanix推出对企业云基础架构进行部署、升级及故障排除的全新解决方案
基于STNRG011数字组合多模PFC控制器的电视电源方案
仅靠ZigBee还不够物联强化智能家居安全
ACREL-3000在苏州医工所变配电系统中的应用
NB-IoT和5G有什么样的关系
深入讲解电源纹波的产生原因及其危害
如何放大光电二极管信号?
释放智能边缘广阔机遇,英特尔携手生态伙伴构建万物互联未来
DesignDrive EVM板的特点及应用介绍
诺基亚贝尔副总裁王玮表示5G是否成功本质上取决于行业应用是否成功