基于TLC1543电子电压表Word下载.docx
《基于TLC1543电子电压表Word下载.docx》由会员分享,可在线阅读,更多相关《基于TLC1543电子电压表Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
5.撰写课程设计报告。
四、进度安排
1.每个同学根据实验题目,查找相应资料,并由组长组织分析任务要求,对任务进行分解,明确每个同学的具体任务;
(半天)
2.确定系统的整体设计方案,画出软件框图,分头进行电路连接,软件编写。
(4天)
3.学会并熟练掌握在伟福和KeilC开发平台上,用汇编和C语言编程和调试,并写入CPU,进行实际调试。
(2天半)
4.编写不少于3000字的课程设计总结报告及提供程序清单(电子版)。
(1天半)
5.总结与答辩。
(半天)
五、完成后应上交的材料
1.课程设计说明书
2.源程序清单(电子版)
六、总评成绩
指导教师签名日期年月日
系主任审核日期年月日
4测量过程及原始测量数据
5.1项目实训的感想13
1,设计的主要内容和任务
设计一个数字式电压表,技术指标要求:
2,实现原理
2.1,硬件电路设计
2.1.1整体电路的实现
硬件电路设计由6个部分组成;
A/D转换电路,AT89S51单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路。
硬件电路设计框图如图2.1所示。
图2-1数字电压表系统硬件设计框图
2.1.2AD转换电路
A/D转换电路种类很多,在选择模/数转换器时,主要考虑以下的一些技术指标:
转换时间和转换频率、量化误差与分辨率、转换精度、接口形式等。
目前,较为流行的AD转换器件有很多都采用了串行接口,这使得这类芯片与单片机的硬件连接非常简单,而软件编程相对要复杂一些。
所以我们这个开发版选择的是TLC1543ADC转换芯片。
图2-2A/D转换流程图
TLC1543是由TI公司开发的开关电容式AD转换器,该芯片具有如下的一些特点:
10位精度、11通道、三种内建的自测模式、提供EOC(转换完成)信号等。
该芯片与单片机的接口采用串行接口方式,引线很少,与单片机连接简单。
图1是TLC1543的引脚示意图,其中A0~A10是11路输入,Vcc和GND分别是电源引脚,REF+和REF-分别是参考电源的正负引脚,使用时一般将REF-接到系统的地,达到一点接地的要求,以减少干扰。
其余的引脚是TLC1543与CPU的接口,其中CS为片选端,如不需选片,可直接接地。
I/OClock是芯片的时钟端,Address是地址选择端,DataOut是数据输出端,这三根引脚分别接到CPU的三个I/O端即可。
EOC用于指示一次AD转换已完成,CPU可以读取数据,该引脚是低电平有效,根据需要,该引脚可接入CPU的中断引脚,一旦数据转换完成,向CPU提出中断请求;
此外,也可将该引脚接入一个普通的I/O引脚,CPU通过查询该引脚的状态来了解当前的状态,甚至该引脚也可以不接,在CPU向TLC1543发出转换命令后,过一段固定的时间去读取数据即可。
图2-3TLC1543实物管脚图和仿真管脚图
TLC1543工作时序如图2示,其工作过程分为两个周期:
访问周期和采样周期。
工作状态由CS使能或禁止,工作时CS必须置低电平。
CS为高电平时,I/OCLOCK、ADDRESS被禁止,同时DATAOUT为高阻状态。
当CPU使CS变低时,TLC1543开始数据转换,I/OCLOCK、ADDRESS使能,DATAOUT脱离高阻状态。
随后,CPU向ADDRESS提供4位通道地址,控制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1路送到采样保持电路。
同时,I/OCLOCK输入时钟时序,CPU从DATAOUT端接收前一次A/D转换结果。
I/OCLOCK从CPU接收10时钟长度的时钟序列。
前4个时钟用4位地址从ADDRESS端装载地址寄存器,选择所需的模拟通道,后6个时钟对模拟输入的采样提供控制时序。
模拟输入的采样起始于第4个I/OCLOCK下降沿,而采样一直持续6个I/OCLOCK周期,并一直保持到第10个I/OCLOCK下降沿。
转换过程中,CS的下降沿使DATAOUT引脚脱离高阻状态并起动一次I/OCLOCK工作过程。
CS上升沿终止这个过程并在规定的延迟时间内使DATAOUT引脚返回到高阻状态,经过两个系统时钟周期后禁止I/OCLOCK和ADDRESS端。
图2-4TLC1543工作时序
2.2.1软硬件设计要点
TLC1543三个控制输入端CS、I/OCLOCK、ADDRESS和一个数据输出端DATAOUT遵循串行外设接口SPI协议,要求微处理器具有SPI口。
但大多数单片机均未内置SPI口(如目前国内广泛采用的MCS51和PIC列单片机),需通过软件模拟SPI协议以便和TLC1543接口。
TLC1543芯片的三个输入端和一个输出端与51系列单片机的I/O口可直接连接,具体连接方式可参见图3。
软件设计中,应注意区分TLC1543的11个模拟输入通道和3个内部测试电压地址(后3个地址只用来测试你写的地址是不是正确的,真正使用时不用后三个地址)。
附表为模拟通道和内部电压测试地址。
程序软件编写应注意TLC1543通道地址必须为写入字节的高四位,而CPU读入的数据是芯片上次A/D转换完成的数据。
在本文后附的程序中对此有详细的说明。
图2-4TLC1543的通道选择
3,单片机系统程序的编制、调试说明
3.1软件部分设计
根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图4-1所示。
图4-1数字式直流电压表主程序框图
3.2A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图4-2所示。
图4-1-1A/D转换流程图
3.3显示子程序
显示子程序采用动态扫描实现八位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。
在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。
由于我们采用的开发板的共阳极有一个晶体管作为总开关,所以P2.6必须置位为0.
图4-2-3数码管显示原理图
4,测量过程及原始测量数据
测量时,电源的正极通过四个串联电阻与开发版的地相接。
IN0接于四个串联电阻的靠近地的第一个电阻,取它电压的四分之一值。
同时开发版的地跟电源负极相接。
当IN0输入电压值为0V时,显示结果如图5-2所示为0V。
测量误差为0V。
当IN0输入电压值为5V时,显示结果如图5-2所示为5.25V。
测量误差为+0.25V。
当IN0输入电压值为10V时,显示结果如图5-2所示为10.35V。
测量误差为+0.35V。
当IN0输入电压值为15V时,显示结果如图5-2所示为15.65V。
测量误差为+0.69V。
当IN0输入电压值为20V时,显示结果如图5-2所示为19.81V。
测量误差为-0.19V。
由于单片机AT89C51为8位处理器,当输入电压为20.00V时,TLC输出数据值为1028(十六位),因此单片机最高的数值分辨率为0.0196V(20/1028)。
这就决定了电压表的最高分辨率只能到0.0196V,理论上测试电压一般以0.01V的幅度变化。
从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大很多远远大于0.01V,这可能跟开发版的信号干扰和电阻的阻值差别跟分压有关。
还有该电压表设计时直接用5V的供电电源作为电压,而实际电压可能有偏低。
当要测量大于5V的电压时,比如20V可在输入口使用四个电阻串联取其中一个来分的四分之一的电压,而程序中只要将计算程序的除数进行调整或者数字再乘以4就可以了。
五,总结和心得体会
5.1,项目实训过程的感想
在设计程序之前根据设计要求,我就制定了:
输入电压模拟量--AD转换为数字量--AT89C51数据处理--数码管显示的设计流程。
理论上来说很容易,就是取数据然后显示,然而事实上的难道还是让我意外了。
首先是AD的转换。
我之前学的用的ADC芯片基本都是0808、0809之类的并行通信的AD转换芯片。
这类芯片转换后的数据传给单片机很容易只需要将输出八个口给一个单片机的P端就可以了。
这次我使用的是吴茂老师自己做的开发板,他的开发板使用的AD转换芯片是TLC1543。
由于这个芯片是我第一次使用之前也没有学过,所以我查阅的大量的这个芯片的中英文资料和阅读别人关于这个芯片的程序。
这个芯片的资料和程序网上不是很多,即使是这样,这个芯片的学习大概花了我这个项目的一半时间(一天半)。
经过一天半的学习我知道了TLC1543的工作时序,知道了TLC1543的DIN端即接单片机P1.2的用于4位通道地址选输入通道,控制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1路送到采样保持电路。
这点让我知道了,通过改变输入寄存器的二进制的地址来选择输入模拟量的端口。
此外,DOU端是程序串行输出端。
串行通信的同时它输出还是一个十六位的数,所以数据必须分别高八位和低八位。
最后我用两个循环语句分别把高八位和低八位的数据取出来赋值实参num中。
总体感觉它比0808芯片难很多。
第二个问题是数据的处理。
由于AD转换芯片的基准电压是5V的,故能输入的电压最大值只有5V。
于是我用四个等值电阻来分压,这样实际取值缩小了4倍。
程序处理的时候必须把它还原。
原以为在原来的程序num1=num1*5/1024*1000;
的mun中乘以4就可以了,而结果是这样可以还原为原来的数值但最大值只能到12.7V再大的数值它就没变化了。
通过反思后,我知道了原来num超过了整型数的最大值已经乱码。
来了我把乘以4另外一步事情就解决了。
由于单片机开发板是吴茂老师自己设计的他除了用共阳极外还用单片机的P2.6端来控制整个数码管的亮灭。
最后的显示结果还是蛮理想的。
第三个问题是误差的处理。
在仿真图上误差还是相当理想的,基本在±
0.1之内。
这个可以解释为因为AD转换的精度和显示的小数位数有关。
这个也基本没问题。
最大的问题是程序在开发板运行的时候误差较大。
最大的时候达到+0.8。
这个是非常大的误差。
于是我通过画实际输入的电压数值曲线跟显示的数值曲线对比,如果把取得的数值减去一个固定的值这个它们的误差会大大减少,这个我认为相当于电压表的调零吧。
这个这问题解决了。
当然这样解决的只是显示的误差问题。
至于为什么实际会比仿真的误差大那么多,这个问题我还是在探索中。
我猜想,这个开发版的单片机的p1.3除了用来做AD的数据输入外还用来做LED等得输出口,这个可能会影响。
此外,还有分压的电阻电阻值不均和产生的压降会影响。
除此之外应该还有其他的原因,具体是什么我还在思索中。
5.2总结
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。
在实际应用工作应能好,测量电压准确,精度高。
系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。
本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次课程设计,加深对所学知识的理解,提高对课外知识的学习能力,增强知识的应用能力,提高解决实际问题的能力,培养自我创新意识。
积累实践经验,为以后的发展打下基础,也为以后我们自己在这方面的发展打下基础,并能够在这方面培养自己的兴趣。
通过这次课程设计,无论从选题到定稿,从理论到实践都使我学到了很多东西,它不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
同时也明白了理论与实践相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
参考文献
[1]潘新民、王燕芳.微型计算计控制技术[第二版].电子工业出版社,2010
[2]皮大能、南光群、刘金华.单片机课程设计指导书.北京理工大学出版社,2010
[3]陈连坤.单片机原理及接口技术.北京交通大学出版社,2010
[4]邹久朋.80C51单片机实用技术.北京航空大学出版社,2008
[5]江志红.51单片机技术与应用系统开发.清华大学出版社.,2008
[6]楼苗然,李光飞.单片机课程设计指导.北京航空航天大学出版社,2007
[7]李广弟.单片机基础.北京航空航天大学出版社,2007年5月
[8]蔡朝洋.单片机控制实习与专题制作.北京航空航天大学出版社,2006
[9]李学海.标准8051单片机基础教程.北京航空航天大学出版,2006
[10]何立民.单片机高级教程.北京航空航天大学出版社,2006
[11]周立功.单片机实验与实践教程.北京航空航天大学出版社,2006
[12]康华光.电子技术基础[第五版]。
高等教育出版社,2006
[13]谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006年
[14]TLC1543中文资料
[15]TLCXX百科
附录1:
仿真原理图
附录2:
程序
/*适合开发板*/
#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
uintnum;
floatnum1;
ucharport,m;
ucharge,shi,bai,qian,wan;
sbitAD_eoc=P3^2;
sbitAD_clk=P1^0;
sbitAD_add=P1^2;
sbitAD_dat=P1^3;
sbitAD_cs=P1^6;
//定义管脚
sbitP2_0OUT=P2^0;
sbitP2_1OUT=P2^1;
sbitP2_2OUT=P2^2;
sbitP2_3OUT=P2^3;
sbitP2_4OUT=P2^4;
sbitP2_6OUT=P2^6;
ucharcodeled7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodeledd7[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
voiddelay(uintz)
{
uintk;
for(z;
z>
0;
z--)
for(k=110;
k>
k--);
}
voiddisplay(num)
{
num1=num;
num1=num1*5/1024*1000;
num=4*num1;
wan=num/10000;
qian=(num/1000)%10;
bai=(num/100)%10;
shi=(num/10)%10;
ge=num%10;
P0=~led7[wan];
P2_0OUT=0;
delay(5);
P2_0OUT=1;
P0=0xff;
P0=~ledd7[qian];
P2_1OUT=0;
P2_1OUT=1;
P0=~led7[bai];
P2_2OUT=0;
P2_2OUT=1;
P0=~led7[shi];
P2_3OUT=0;
P2_3OUT=1;
P0=~led7[ge];
P2_4OUT=0;
P2_4OUT=1;
uintADC(ucharchn1)
{
uchari;
ucharaddr8;
uintADresult;
AD_eoc=1;
AD_cs=0;
_nop_();
addr8=chn1;
addr8<
<
=4;
for(i=0;
i<
4;
i++)//访问周期
{
AD_add=(bit)(addr8&
0x00);
AD_clk=1;
AD_clk=0;
addr8<
=1;
}
6;
i++)//采样周期
AD_cs=1;
while(!
AD_eoc);
//查询到转换结束
ADresult=0;
//开始传数据
10;
i++)
ADresult<
m=AD_dat;
ADresult+=m;
return(ADresult);
voidmain()
while
(1)
port=0x0a;
P2_6OUT=0;
num=ADC(port);
display(num);
附录3;
实验板原理图:
附录4:
实物效果图: