您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 单片机课程设计——基于TLC549的AD转换
哈尔滨理工大学荣成学院单片机课程设计题目:基于TLC549的A/D转换班级:姓名:学号:1题目简介随着电子技术的发展,人们越来越频繁的用到电压表,普通的指针电压表已不能满足人们的需要。数字电压表作为一种高精度的测量仪器,采用数字化测量技术,将连续模拟量转换成不连续,离散的数字形式。传统指针式电压表功能单一,精度低,不能满足人们追求越来越方便,精准的要求。而采用单片机的数字电压表,其精度高,抗干扰能力强,已被广泛的应用在日常生活和电子,工业等领域。数字电压表因为是将连续的模拟量转换成数字形式表现出来,避免了读数的视觉误差和视觉疲劳。数字电压表的核心部件是A/D转换器,转换器的精度很大程度上影响了测量的精度。本次单片机课程设计采用A/D转换器TLC549对电压测量电路测出的输入模拟信号电压值进行转换,利用AT89C52RC再对转换的结果进行运算和处理,最后将数字电压信号显示在LED数码管上2实现方案①STC89C52RCSTC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统的51单片机不具备的功能。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。②AD转换器-----TlC549TLC549是美国德州仪器公司生产的8位串行A/D转换器芯片,可与通用微处理器、控制器通过CLK、CS、DATAOUT三条口线进行串行接口。具有4MHz片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549为40000次/s。总失调误差最大为±0.5LSB,典型功耗值为6mW。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,VREF-接地,VREF+-VREF-≥1V,可用于较小信号的采样。特点:8K字节程序存储空间;512字节数据存储空间;内带4K字节EEPROM存储空间;可直接使用串口下载;TLC549的内部框图和管脚名如图所示。工作原理TLC549均有片内系统时钟,该时钟与I/OCLOCK是独立工作的,无须特殊的速度或相位匹配。其工作时序如图2所示。当CS为高时,数据输出(DATAOUT)端处于高阻状态,此时I/OCLOCK不起作用。这种CS控制作用允许在同时使用多片TLC549时,共用I/OCLOCK,以减少多路(片)A/D并用时的I/O控制端口。一组通常的控制时序为:(1)将CS置低。内部电路在测得CS下降沿后,再等待两个内部时钟上升沿和一个下降沿后,然后确认这一变化,最后自动将前一次转换结果的最高位(D7)位输出到DATAOUT端上。(2)前四个I/OCLOCK周期的下降沿依次移出第2、3、4和第5个位(D6、D5、D4、D3),片上采样保持电路在第4个I/OCLOCK下降沿开始采样模拟输入。(3)接下来的3个I/OCLOCK周期的下降沿移出第6、7、8(D2、D1、D0)个转换位,(4)最后,片上采样保持电路在第8个I/OCLOCK周期的下降沿将移出第6、7、8(D2、D1、D0)个转换位。保持功能将持续4个内部时钟周期,然后开始进行32个内部时钟周期的A/D转换。第8个I/OCLOCK后,CS必须为高,或I/OCLOCK保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换工作的完成。如果CS为低时I/OCLOCK上出现一个有效干扰脉冲,则微处理器/控制器将与器件的I/O时序失去同步;若CS为高时出现一次有效低电平,则将使引脚重新初始化,从而脱离原转换过程。在36个内部系统时钟周期结束之前,实施步骤(1)-(4),可重新启动一次新的A/D转换,与此同时,正在进行的转换终止,此时的输出是前一次的转换结果而不是正在进行的转换结果。若要在特定的时刻采样模拟信号,应使第8个I/OCLOCK时钟的下降沿与该时刻对应,因为芯片虽在第4个I/OCLOCK时钟下降沿开始采样,却在第8个I/OCLOCK的下降沿开始保存。③数码管数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimalpoint),其基本单元是发光二极管。七段数码管分为共阳极及共阴极,共阳极的七段数码管的正极(或阳极)为八个发光二极管的共有正极,其他接点为独立发光二极管的负极(或阴极),使用者只需把正极接电,不同的负极接地就能控制七段数码管显示不同的数字。本次课程设计采用的是共阳极数码管。硬件组成图3电路原理图单片机电源电路时钟电路复位电路数码管显示电路A/D转换电路4软件流程图(程序流程图)5软件设计源程序#includereg52.h#includeintrins.h#defineledP0#defineucharunsignedchar#defineuintunsignedintvoiddebouncer(void);//用于键盘的防抖动函数uintVolt;//电压换算并扩大1000倍uintnum;uintAD_Temp;ucharTemp,TempA;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/**0123456789*/ucharcodetable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};/**0.1.2.3.4.5.6.7.8.9.*//*TLC549和数码管为选声明*/sbitAD_CLK=P1^2;//时钟sbitAD_DAT=P1^0;//数据输出sbitAD_CS=P1^1;//片选sbitw1=P2^0;//位选sbitw2=P2^1;sbitw3=P2^2;sbitw4=P2^3;sbita=P3^0;sbitb=P3^1;sbitc=P3^2;sbitLED5V=P2^5;sbitLED1V=P2^6;sbitLED100mV=P2^7;sbitSW5V=P3^5;sbitSW1V=P3^6;sbitSW100mV=P3^7;charVV=0;voiddelay(uintz)//延时函数,1ms{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voiddebouncer(void)//防抖动函数{intm,n;for(m=0;m40;m++);for(n=0;n125;n++);}TLC1549_ADC()//TLC1549芯片AD转换模块{uinti,m=0;AD_CS=1;AD_CLK=1;AD_DAT=1;AD_CS=0;_nop_();for(i=0;i10;i++){AD_CLK=0;_nop_();m=m1;if(AD_DAT){m+=0x01;}AD_CLK=1;_nop_();}AD_CLK=0;AD_CS=0;for(i=17;i!=0;i--)_nop_();//转换周期最大17usreturn(m);}voiddisplay1()//显示函数{uchari,j,k,l;uintmm;mm=Volt;l=mm%10;mm=mm/10;k=mm%10;mm=mm/10;j=mm%10;mm=mm/10;i=mm%10;mm=mm/10;w1=0;led=table1[i];delay(1);w1=1;w2=0;led=table[j];delay(1);w2=1;w3=0;led=table[k];delay(1);w3=1;w4=0;led=table[l];delay(1);w4=1;}voidrun_system(){if(SW5V==0){debouncer();if(SW5V==0)VV=1;}if(SW1V==0){debouncer();if(SW1V==0)VV=2;}if(SW100mV==0){debouncer();if(SW100mV==0)VV=3;}if(VV==1){c=0;b=0;a=1;AD_Temp=TLC1549_ADC();//Volt=AD_Temp*1.0;//将数字量转化成电压值.0--5vVolt=AD_Temp*4.888;//将数字量转化成电压值.0--5vdisplay1();LED5V=0;LED1V=1;LED100mV=1;}if(VV==2){c=0;b=1;a=0;AD_Temp=TLC1549_ADC();//将数字量转化成电压值.0--1vVolt=AD_Temp*0.978;//将数字量转化成电压值.0--1vdisplay1();LED1V=0;LED5V=1;LED100mV=1;}if(VV==3){c=0;//led灯亮第一个b=1;//另两个灭a=1;AD_Temp=TLC1549_ADC();//Volt=AD_Temp*1.0;//将数字量转化成电压值.0--0.1vVolt=AD_Temp*0.098;//将数字量转化成电压值.0--0.1vdisplay1();LED100mV=0;LED5V=1;LED1V=1;}}voidmain(){intn=0;while(1){if(n++100){n=0;run_system();}}}6总结虽然上学期已经学习了单片机的知识,但是通过这次单片机课程设计,我发现我们所掌握的知识还是不够,单片机课程设计重点就在于对某个实际需求的设计,通过程序和硬件的配合来解决问题。对于程序我们不仅需要将其设计出来,更需要细致的修改,完善。这并不是一个简单的过程。例如,在数码管段码数组中,我们刚开始将板子上的数码管视为共阴极,但显示出来的都是乱码。虽然这只是一个小问题,但让我们认识到,做任何事情都不能理所当然的认为。我们最后的成品能够显示出电压的数值,但数码管动态显示有时候看起来数字不是很清晰不亮的地方有阴影。在学习过程中并没有注意关于数码管消隐的部分,到实际实验中才发现这个问题,通过查询资料,最终才了解到若进行片选切换时没有对上一片显示的内容进行清空,则会导致当前数码管中出现上一片内容的余影,从而使显示模糊,影响了整个显示效果。通过小组配合,最终使数码管上的数值显示清楚。在调试的过程中,电压值的示数与设定的量程有一些误差,通过不断调试Volt=AD_Temp*4.888;Volt=AD_Temp*4.888;Volt=AD_Temp*0.098;最终达到期望值。通过本次课程设计,不仅提升我们的动手能力,还加强对专业理论知识的理解和实际运用,还使我认识到团队的力量,只有通过和团队成员之间的分工合作,大家取长补短才能高效地做成某一件事。7参考文献[1]刘帅,周世杰,郑凡非.基于单片机的数字电压表设计实现[J].数字技术与应用,2019,37(02):166-167.[2]陈磊,琚泽立,何昭帅,蒲路.基于STC89C52单片机的数字电压表设计[J].电子质量,2017(12):38-39+43.[3]李航,李攀攀,韩利凯.基于单片机的简易数字电压表的设计[J].电子世界,2016(12):78.[4]李全利单片机原理及应用(C51编程)高等教育出版社.
本文标题:单片机课程设计——基于TLC549的AD转换
链接地址:https://www.777doc.com/doc-7337714 .html