实验要求: 应用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 char
sbit 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口。
全部0条评论
快来发表一下你的评论吧 !