当前位置:文档之家› AD转换实验报告

AD转换实验报告

A/D转换实验报告摘要本设计是利用AT89C51、ADC0809、CD4027芯片为核心,加以其他辅助电路实现对信号的A/D转换,其中以单片机AT89C51为核心控制A/D转换器。

先是对信号进行采集,然后用ADC0809对信号实现从模拟量到数字量的转换。

改变采样数据,调整电路,使其达到精确转换。

目录1.方案设计与论证 (1)1.1理论分析 (1)1.2输出、输入方案选择 (1)1.3显示方案 (2)1.4时钟脉冲选择 (2)2.硬件设计 (2)2.1A/D转换器模块 (2)2.2单片机模块 (3)2.3JK触发器模块 (4)3软件设计 (4)4.仿真验证与调试 (5)4.1测试方法 (5)4.2性能测试仪器 (7)4.4误差分析 (7)5.设计总结及体会 (5)附录(一)实物图 (6)附录(二)软件程序 (6)1.方案设计与论证1.1理论分析8位A/D转换由芯片内部的控制逻辑电路、时序产生器、移位寄存器、D/A转换器及电压比较器组成,它具有将模拟量转换成数字量的特性,其原理图如下:AD转换原理图(1)1.2输出、输入方案选择A/D转换器有多路选择器,可选择八路模拟信号IN0~IN7中的一路进入A/D转换。

现在选择IN0通道作为输入,则对应的地址码位ADD C=0、ADD B=0、ADD A=0。

当转换完成后,OE=1,打开三态输出锁存缓冲器,将转换数据从D7~D0口输出到单片机的P0端口。

IN口输入D端口输出A/D转换器图(2)1.3显示方案单片机控制数码管显示有两种动态和静态两种方法,由于静态控制数码管每次只能显示一位,造成资源浪费,所以选择动态扫描,并增加变换频率。

1.4时钟脉冲选择方案一:可以直接用矩形波来控制方案二:ALE通过JK触发器完成二分频,然后 Q端接CLK。

因为晶振的频率是12MHz,ALE的频率为12NHz×1/6=2MHz,经过JK 触发器二分频后就是1MHz.2.硬件设计2.1 A/D转换器模块A/D转换电路图(3)模拟量从IN0端口输入,经电压比较器后输入到控制电路,转换后从D0~D7口输出,地址码位ADD C=0、ADD B=0、ADD A=0。

OE 端输出允许控制信号,EOC转换结束控制信号,EOC=0,转换结束后EOC=1。

START转换启动信号,上升沿将片内寄存器清零,下降沿开始A/D转换。

时钟信号输入端CLOCK接触发器Q端,把1MHz 的信号作为时钟脉冲输入。

2.2单片机模块图(4)如图(4),选用89C51单片机,89C51单片机本身的电源电压是5v,有两种低功耗方式:待机方式和掉电方式。

在掉电状态下,其耗电电流为3mA,在掉电方式下提供约50mA的电流。

80C51单片机是8位单片机,速度较慢,且不能在线编程。

在单片机的外部加一个振荡电路,这个电路有晶振和两个电容组成,晶振两端分别接到两个电容的一端,两个电容的另一端都要接地。

这两个电容串联的容量就是就等于负载电容,这两个电容选用33PF的。

在P0端口接一个上拉电阻,增加高电平驱动能力。

P0口输出七段码,P2.0、P2.1、P2.2口输出位选码。

2.3JK触发器模块图(5)JK 触发器具有置0、置1、保持、翻转的功能。

J=1,K=0时,置1;J=0,K=1时,置0;J=K=0,保持;J=K=1,CLK 下降沿到来时翻转。

3.软件设计系统软件流程图如下图(6),其中主要包含这三部分,即信号采样、A/D 转换、输出显示。

信号采样:先产生启动转换的正脉冲信号,对数据进行采样。

A/D 转换:对输入数据转换,把数据分取个位、十分位、百分位。

输出显示:位选端P2.0、P2.1、p2.2分别显示个位、十分位、百分位,完成三位显示。

图(6)4.仿真验证与调试4.1测试方法系统对实验进行仿真验证,初始值显示0.00,最大值为5.00。

步骤:1)接入5V 电源;开始系统初始化信号采样A/D 转换完 输出显示 结束否2)改变滑动变阻器的阻值,观察数码管的显示的变化。

初始图(7) 最大值图(8)4.2性能测试仪器直流电源 数字万用表4.3实验数据表1 实验数据表 4.4误差分析造成本实验的误差可能有以下几点原因:1)在接入电源时的导线可能增加阻值;2)滑动变阻器可能引起阻值误差;3)万用表的接触不良也有误差。

5.设计总结及体会在收到任务时,根据要求从总体到部分来仔细分析任务,最后到组别12345678910仿真(V ) 0.00 0.29 0.85 1.45 1.85 2.74 3.74 4.35 4.72 5.00 实测(V ) 0.00 0.29 0.81 1.42 1.87 2.66 3.67 4.31 4.72 4.97 显示(V ) 0.00 0.32 0.88 1.47 1.86 2.76 3.72 4.33 4.73 5.00具体的器材使用,而且对每个组员合理分配任务。

在设计时,对每个模块设计多方案,从中择优选用。

硬件部分要注意所加电压不能过大,否则会烧毁集成块。

实际电路焊接时,线路要尽量短、直,便于以后检查。

对于每一点要焊实,不能出现虚焊,不可短路。

软件设计要模块化,语言要尽量简洁程序应采用模块化结构,程序代码简洁,具有较高执行效率。

对于变量的使用,尽可能多的使用局部变量,编写程序需要不断的修改、整理、优化,以使程序具有较少的代码量,较高工作效率。

这设计让我们学到了很多知识,了解和掌握许多芯片的作用和功能。

通过小组成员的共同努力实验终于出来了,非常有成就感。

也要感谢老师的悉心指导。

附录(一)实物图附录(二)软件程序#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit ST=P2^4;sbit OE=P2^5;sbit EOC=P2^6;sbit w_select1=P2^0;sbit w_select2=P2^1;sbit w_select3=P2^2;sbit w_select4=P2^3;uchar num_1=0,num_2=0,num_3=0;//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};//uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};uchar code table[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; /*************************************************************** 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无***************************************************************/void Delay_1ms(uint x){uint h,k;//uchar k;for(h = x; h >0; h--) for(k = 20; k>0; k--);}void DA_change(uchar k){float D_value;D_value=5*k/255;num_1=D_value/1;//取个位值num_2=(D_value-num_1)*10/1;//取小数点后第一位值num_3=((D_value-num_1)*10-num_2)*10/1;//取小数点后第二位值}/*************************************************************** 名称: Display(uchar k)* 功能:将参数分成十位、个位分别显示* 输入: k (键盘数值)* 输出: P0口输出七段码,P2口输出位选码***************************************************************/void Display(){P0 = table[num_1]+0x80; //需显示小数点w_select3=0; Delay_1ms(1); //显示5ms个位w_select3=1; //消隐P0 = table[num_2];w_select2=0; Delay_1ms(1); //显示5ms小数点后第一位w_select2=1; //消隐P0 = table[num_3];w_select1=0; Delay_1ms(1); //显示5ms小数点后第二位}/************************************************************** * 名称 : Main()* 功能 : 主函数***************************************************************/ void main(void){uchar Key_Value = 16; //两次读出的键值uchar getdata;while(1){P2=P2&0xf0;P0=0xff;P3=0xff;ST=0;//产生启动转换的正脉冲信号ST=1;ST=0;while (EOC==0);OE=1;getdata=P0;OE=0;DA_change(getdata);Display( ); //没有按键按下,也显示电压值num_1=0,num_2=0,num_3=0;}}8。

相关主题