DA转换实验报告.docx

上传人:b****2 文档编号:1940574 上传时间:2023-05-02 格式:DOCX 页数:15 大小:309.81KB
下载 相关 举报
DA转换实验报告.docx_第1页
第1页 / 共15页
DA转换实验报告.docx_第2页
第2页 / 共15页
DA转换实验报告.docx_第3页
第3页 / 共15页
DA转换实验报告.docx_第4页
第4页 / 共15页
DA转换实验报告.docx_第5页
第5页 / 共15页
DA转换实验报告.docx_第6页
第6页 / 共15页
DA转换实验报告.docx_第7页
第7页 / 共15页
DA转换实验报告.docx_第8页
第8页 / 共15页
DA转换实验报告.docx_第9页
第9页 / 共15页
DA转换实验报告.docx_第10页
第10页 / 共15页
DA转换实验报告.docx_第11页
第11页 / 共15页
DA转换实验报告.docx_第12页
第12页 / 共15页
DA转换实验报告.docx_第13页
第13页 / 共15页
DA转换实验报告.docx_第14页
第14页 / 共15页
DA转换实验报告.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DA转换实验报告.docx

《DA转换实验报告.docx》由会员分享,可在线阅读,更多相关《DA转换实验报告.docx(15页珍藏版)》请在冰点文库上搜索。

DA转换实验报告.docx

DA转换实验报告

D/A转换实验报告

组员:

田亚峰杜亚亚

 

摘要

  此次设计实验是以AT89C51、DAC0832、741为核心,并加以其他辅助电路来实验D/A转换,其中主要是利用单片机来控制从数字量到模拟量的整个转换。

先是从键盘输入数字量到单片机,再从单片机输出到DAC0832,经D/A转换后输出与该数字量大小对应的模拟电压,并用LED数码管显示出来输入的数字量值。

   

 

 

1.方案设计及论证

1.1理论分析

根据本次设计任务的要求,由单片机模块、D/A转换模块、反相比例加法运算电路构成。

系统框图如下:

图1系统框图

1.2单片机选择

方案一:

选用AT89C51

方案二:

选用AT89C52

论证:

1)AT89C52的程序空间为8K比AT89C51的空间大

2)AT89C52多了个T2定时器,所以比89C51多几个寄存器

因此选用AT89C52.

1.3键盘设计

方案一:

采用独立式键盘

方案二:

采用矩阵式键盘

论证:

由于独立式键盘占用较多的I/O线,因此选用4×4矩阵式键盘输入,以保证10个数全部完整输入,节省I/O端口资源。

1.4D/A转换选择

此次设计选用DAC0832,它是由一个八位输入锁存器、一个8位D/A锁存器和一个8位D/A转换器三个部分组成。

D/A转换器将输入的数字量转换为模拟量输出,数字量是由若干数位构成的,就是把每一位上的代码按照权值转换为对应的模拟量,再把各位所对应的模拟量相加,所得到各位模拟量的和便是数字量所对应的模拟量。

2.硬件设计

2.1单片机模块

89C51单片机本身的电源电压是5v,有两种低功耗方式:

待机方式和掉电方式。

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

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

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

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

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

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

图2单片机及外部电路

2.2D/A转换模块

本次设计的D/A转换电路倒T电阻网络,当数字量从单片机输出到转换器后,经过基准电压VREF激励内部的倒T形电阻网络,其输出是模拟电流,为了将电流转换成电压信号,外接运算放大器,反馈电阻为片内电阻。

图3功能框图

一级运放得到单极性输出电压,二级运放构成反相比例加法运算电路。

 

图4T形电阻网络D/A转换器

由上式可见,输出的模拟量与输入的数字量(

)成正比,这就实现了从数字量到模拟量的转换。

 

3.软件设计

开始

系统软件流程图如下图,其中主要包含这三部分,即键盘输入、数码管显示、D\A转换、。

系统初始化

键盘输入

单片机

 

数码管显示

D/A转换

输出

图5流程图

键盘输入:

通过行、列确定一个数。

数码管显示:

通过P0和P2端口分别进行位选和段选。

4.仿真验证及调试

4.1调试方法

步骤:

1)键盘键入数字量;

2)键入不同值,按12键转换以后读出电压表表上的数值。

图6初始值

图7中间显示值

4.2性能测试仪器

直流电源数字万用表

4.3实验数据

表1数据表

1

2

3

4

5

6

7

8

9

10

数码管显示

0.00

0.50

1.00

1.55

2.00

3.00

3.50

4.00

4.50

5.00

实测

0.00

0.49

0.99

1.54

1.98

3.02

3.52

4.02

4.51

0.00

电压表显示

0.00

0.49

1.00

1.54

1.99

2.98

3.49

3.98

4.43

0.00

4.4误差分析

在实际测量测量时有误差存在,误差允许的范围是-0.02V~+0.02V。

造成误差的原因有以下几点:

1)D/A转换器中元器件参数误差;2)基准电压不稳定;3)运算放大器的零点漂移。

5.设计总结及体会

在收到任务时,根据要求从总体到部分来分析,最后到具体的器材使用,而且对每个组员合理分配任务。

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

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

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

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

软件设计要模块化,语言要尽量简洁程序应采用模块化结构,程序代码简洁,编写程序需要不断的修改、整理、优化,以使程序具有较少的代码量,较高工作效率。

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

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

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

附录

(一):

实物图

 

图1

图2

附录

(二)软件程序

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitw_select1=P2^0;

sbitw_select2=P2^1;

sbitw_select3=P2^2;

sbitw_select4=P2^3;

sbitcs_1=P2^7;

//unsignedlonginta=0;

ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/**************************************************************

*名称:

Delay_1ms()

*功能:

延时子程序,延时时间为1ms*x

*输入:

x(延时一毫秒的个数)

*输出:

***************************************************************/

voidDelay_1ms(uintx)

{

uinti;

ucharj;

for(i=0;i

}

/**************************************************************

*名称:

Keyscan()

*功能:

P1外接4×4按键,按照扫描法读出键值

*输出:

按键值0~15/如无键按下,返回16

***************************************************************/

ucharKeyscan(void)

{

uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};

for(j=0;j<4;j++){//循环四次

P1=Buffer[j];//在P1高四位分别输出一个低电平

temp=0x01;//计划先判断P1.0位

for(i=0;i<4;i++){//循环四次

if(!

(P1&temp))//从P1低四位,截取1位

return(i+j*4);//返回取得的按键值

temp<<=1;//判断的位,左移一位

}

}

return16;

}//呵呵,实质性的语句不过8行,就是这么简练!

voidDisplay1(longa)//显示输入键值对应的十进制数

{

w_select1=0;

w_select2=0;

w_select3=0;

w_select4=0;

cs_1=1;

P0=table[a/1000]&0x7f;

w_select4=1;

Delay_1ms(10);

w_select4=0;

P0=table[(a/100)%10];

w_select3=1;

Delay_1ms(10);

w_select3=0;

P0=table[(a/10)%10];

w_select2=1;

Delay_1ms(10);

w_select2=0;

P0=table[a%10];

w_select1=1;

Delay_1ms(10);

/**************************************************************

*名称:

Display(uchark)

*功能:

将参数分成十位、个位分别显示

*输入:

k(键盘数值)

*输出:

P0口输出七段码,P2口输出位选码

***************************************************************/

voidDisplay2(ucharh)

{

P2=0;//?

?

P0=table[h/10];

P2=0x02;Delay_1ms(5);//?

?

5ms?

?

P2=0;//?

?

P0=table[h%10];

P2=0x01;Delay_1ms(5);//?

?

5ms?

?

}

/**************************************************************

*名称:

Main()

*功能:

主函数

***************************************************************/

voidMain(void)

{

ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值

longTemp6,Temp7,Temp8,Temp9,Temp4=0,Temp5;

intk,j=0,i=0,count;

ucharA[4];

cs_1=1;

P3=0x00;

Temp4=P3;

P0=0xff;

while

(1){

//---------以下读入按键、消抖、等待按键释放

P1=0xff;

Key_Temp1=Keyscan();//先读入按键

if(Key_Temp1!

=16)

{//如果有键按下

Delay_1ms(5);//延时一下

//Display(Key_Value);//可用显示代替延时

Key_Temp2=Keyscan();//再读一次按键

if(Key_Temp1==Key_Temp2)

{//必须是两次相等

Key_Value=Key_Temp1;//才保存下来,这就是消除抖动

while(Keyscan()<16)

Display2(Key_Value);

if((Key_Value<10)&&(i<5))//对按键次数进行计数

{A[i]=Key_Value;

i++;

count=i;

if(i==4)i=0;

}

switch(count)//把连续按键值转换成对应的十进制数

{case1:

{Temp5=A[0];Display1(Temp5);Delay_1ms(5);}break;

case2:

{Temp5=A[0]*10+A[1];Display1(Temp5);Delay_1ms(5);}break;

case3:

{Temp5=A[0]*100+A[1]*10+A[2];Display1(Temp5);Delay_1ms(5);}break;

case4:

{Temp5=A[0]*1000+A[1]*100+A[2]*10+A[3];Display1(Temp5);Delay_1ms(5);

if(Temp5>=5001)Temp5=0;}break;

}

if(Key_Value==13)//键值步进加20

{if(j==1)

{Temp6=Temp7;}

else

Temp6=Temp5;

Temp6=Temp6+20;

Temp7=Temp6;

Display1(Temp7);

Delay_1ms(5);

k=j=1;

}

if(Key_Value==14)//键值步进减20

{switch(j)

{case0:

Temp8=Temp5;break;

case1:

Temp8=Temp7;break;

case2:

Temp8=Temp9;break;}

Temp8=Temp8-20;

Temp9=Temp8;

Display1(Temp9);

Delay_1ms(5);

k=j=2;

}

if(Key_Value==12)//DA转换控制键

{

switch(k)

{case0:

Temp4=Temp5*0.0512;break;

case1:

Temp4=Temp7*0.0512;Temp5=Temp7;break;

case2:

Temp4=Temp9*0.0512;Temp5=Temp9;break;

}

k=0;

cs_1=0;

P3=Temp4;

}

}

}

if(Key_Value==13)Display1(Temp7);

elseif(Key_Value==14)Display1(Temp9);

elseDisplay1(Temp5);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2