D/A转换实验报告
组员: 杜亚亚
田亚峰
摘要
此次设计实验是以ATC51、DAC0832、741为核心,并加以其他辅助电路来实验D/A转换,其中主要是利用单片机来控制从数字量到模拟量的整个转换。先是从键盘输入数字量到单片机,再从单片机输出到DAC0832,经D/A转换后输出与该数字量大小对应的模拟电压,并用LED数码管显示出来输入的数字量值。
目录
1.方案设计及论证 .................................................................................................................................. 2
1.1理论分析 ................................................................................................................................... 2 1.2单片机选择 ............................................................................................................................... 2 1.3键盘设计 ................................................................................................................................... 2 1.4 D/A转换选择 ........................................................................................................................... 3 2.硬件设计.............................................................................................................................................. 3
2.1单片机模块 ............................................................................................................................... 3 2.2 D/A转换模块 ........................................................................................................................... 4 3.软件设计.............................................................................................................................................. 6 4.仿真验证及调试 .................................................................................................................................. 6
4.1调试方法 ................................................................................................................................... 6 4.2性能测试仪器 ........................................................................................................................... 7 4.3实验数据 ................................................................................................................................... 7 4.4误差分析 ................................................................................................................................... 8 5.设计总结及体会 .................................................................................................................................. 8 附录(一):实物图 ............................................................................................................................. 9 附录(二)软件程序 ............................................................................................................................. 9
1.方案设计及论证 1.1理论分析
根据本次设计任务的要求,由单片机模块、D/A转换模块、反相比例加法运算电路构成。系统框图如下:
图1 系统框图
1.2单片机选择
方案一:选用ATC51 方案二:选用ATC52
论证:1)ATC52的程序空间为8K 比ATC51的空间大 2)ATC52多了个T2定时器,所以比C51多几个寄存器 因此选用ATC52.
1.3键盘设计
方案一:采用式键盘 方案二:采用矩阵式键盘
论证:由于式键盘占用较多的I/O线,因此选用4×4矩阵式键盘输入,以保证10个数全部完整输入,节省I/O端口资源。
1.4 D/A转换选择
此次设计选用DAC0832,它是由一个八位输入锁存器、一个8位D/A锁存器和一个8位D/A转换器三个部分组成。D/A转换器将输入的数字量转换为模拟量输出,数字量是由若干数位构成的,就是把每一位上的代码按照权值转换为对应的模拟量,再把各位所对应的模拟量相加,所得到各位模拟量的和便是数字量所对应的模拟量。
2.硬件设计
2.1单片机模块
C51单片机本身的电源电压是5v,有两种低功耗方式:待机方式和掉电方式。在掉电状态下,其耗电电流为3mA,在掉电方式下提供约50mA的电流。80C51单片机是8位单片机,速度较慢,且不能在线编程。在单片机的外部加一个振荡电路,这个电路有晶振和两个电容组成,晶振两端分别接到两个电容的一端,两个电容的另一端都要接地。这两个电容串联的容量就是就等于负载电容,这两个电容选用33PF的。在P0端口接一个上拉电阻,增加高电平驱动能力。P0口输出七段码,P2.0、P2.1、P2.2、P2.3口输出位选码。
图2 单片机及外部电路
2.2 D/A转换模块
本次设计的D/A转换电路倒T电阻网络,当数字量从单片机输出到转换器后,经过基准电压VREF激励内部的倒T形电阻网络,其输出是模拟电流,为了将电流转换成电压信号,外接运算放大器,反馈电阻为片内电阻 。
图3 功能框图
一级运放得到单极性输出电压,二级运放构成反相比例加法运算电路。
图4 T形电阻网络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 数码 管显0.00 0.50 1.00 1.55 2.00 3.00 示 7 3.50 8 9 10 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 #define uint unsigned int #define uchar unsigned char sbit w_select1=P2^0; sbit w_select2=P2^1; sbit w_select3=P2^2; sbit w_select4=P2^3; sbit cs_1=P2^7; //unsigned long int a=0; 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 i; uchar j; for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); } /************************************************************** * 名称: Keyscan() * 功能: P1外接4×4按键, 按照扫描法读出键值 * 输出: 按键值0~15/如无键按下, 返回16 ***************************************************************/ uchar Keyscan(void) { uchar i, 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; //判断的位,左移一位 } } return 16; } //呵呵,实质性的语句不过8行,就是这么简练! void Display1(long a)//显示输入键值对应的十进制数 { 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(uchar k) * 功能: 将参数分成十位、个位分别显示 * 输入: k (键盘数值) * 输出: P0口输出七段码,P2口输出位选码 ***************************************************************/ void Display2(uchar h) { 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() * 功能 : 主函数 ***************************************************************/ void Main(void) { uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值 long Temp6,Temp7,Temp8,Temp9,Temp4=0,Temp5; int k,j=0, i=0,count; uchar A[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++; 12 count=i; if(i==4)i=0; } switch(count) //把连续按键值转换成对应的十进制数 {case 1:{Temp5=A[0];Display1(Temp5); Delay_1ms(5);} break; case 2:{Temp5=A[0]*10+A[1];Display1(Temp5);Delay_1ms(5); } break; case 3 :{Temp5=A[0]*100+A[1]*10+A[2];Display1(Temp5);Delay_1ms(5);} break; case 4:{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) {case 0:Temp8=Temp5;break; case 1:Temp8=Temp7;break; case 2:Temp8=Temp9;break;} Temp8=Temp8-20; Temp9=Temp8; Display1(Temp9); Delay_1ms(5); k=j=2; } if(Key_Value==12) //DA转换控制键 { switch(k) {case 0:Temp4=Temp5*0.0512;break; case 1:Temp4=Temp7*0.0512;Temp5=Temp7;break; case 2:Temp4=Temp9*0.0512;Temp5=Temp9;break; } k=0; cs_1=0; P3=Temp4; } } } if(Key_Value==13) Display1(Temp7); 13 else if(Key_Value==14) Display1(Temp9); else Display1(Temp5); } } 14
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务