TLC549的AD转换.docx
- 文档编号:9753030
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:20
- 大小:345.17KB
TLC549的AD转换.docx
《TLC549的AD转换.docx》由会员分享,可在线阅读,更多相关《TLC549的AD转换.docx(20页珍藏版)》请在冰点文库上搜索。
TLC549的AD转换
哈尔滨理工大学荣成学院
单片机
课程设计
题目:
基于TLC549的A/D转换
班级:
电信12—1
姓名:
学号:
1.简介
电压表作为电子应用领域必不可少的工具,其性能越来越受到人们的广泛关注。
传统的模拟电压表由于设计较复杂,精度较低,不适合一般应用。
数字电压表是诸多数字化仪表的核心与基础,电压表的数字化是将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,这有别于传统的以指针加刻度盘进行读数的方法,避免了读数的视差和视觉疲劳。
采用单片机设计的数字电压表,以其精度高、抗干扰能力强、可扩展性强、集成方便、价格低廉等优点得到了普遍应用。
其内部核心部件是A/D转换器,转换器的精度很大程度上影响着数字万用表的准确度。
本课程设计采用A/D转换器TLC549对电压测量电路测出的输入模拟信号电压值进行转换,控制核心AT89C52RC再对转换的结果进行运算和处理,最后驱动输出显示装置LCD1602显示数字电压信号。
2.实现方案
系统的硬件采用模块化设计,以单片机主控器为核心,与LCD显示电路、A/D转换电路等组成数字电压表控制系统。
主要包括单片机主控模块、LCD显示模块、A/D模块等。
其中单片机主控模块主要完成外围硬件的控制以及运算功能;LCD显示模块完成字符、数字的显示功能;A/D模块由A/D芯片实现A/D转换,输出电压的数字量通过液晶LCD显示。
系统硬件组成方框图如图1所示。
2.1 主控模块设计
在大部分的工控或测控设备中,8位的MCS-51系列单片机能够满足大部分的控制要求,加之MCS-51系列单片机的价格优势,使MCS-51系列单片机成为单片机应用主流。
AT89C52是目前应用比较广泛的MCS-51系列兼容单片机中的代表产品。
鉴于此,本系统选用AT89C52单片机作为主控制器。
2.2 LCD显示模块设计
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用的有16×1、16×2、20×2和40×2行等模块。
本系统选用1602字符型LCD模块,其控制器为日立公司生产的HD44780,可以用来显示数字、字符等。
2.3 A/D转换模块设计
A/D模块由A/D芯片和电压测量电路组成,通过电压测量电路测得输入电压,并转换为0~5V的标准信号。
本系统选用TI公司生产的一种低价位、高性能的8位A/D芯片TLC549。
2.4TLC549介绍
2.4.1TLC549工作原理
当/CS变为低电平后,TLC549芯片被选中,同时前次转换结果的最高有效位MSB(A7)自DATAOUT端输出,接着要求自I/OCLOCK端输入8个外部时钟信号,前7个I/OCLOCK信号的作用,是配合TLC549输出前次转换结果的A6-A0位,并为本次转换做准备:
在第4个I/OCLOCK信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始,第8个I/OCLOCK信号的下降沿使片内采样/保持电路进入保持状态并启动A/D开始转换。
转换时间为36个系统时钟周期,最大为17us。
直到A/D转换完成前的这段时间内,TLC549的控制逻辑要求:
或者/CS保持高电平,或者I/OCLOCK时钟端保持36个系统时钟周期的低电平。
由此可见,在自TLC549的I/OCLOCK端输入8个外部时钟信号期间需要完成以下工作:
读入前次A/D转换结果;对本次转换的输入模拟信号采样并保持;启动本次A/D转换开始。
2.4.2TLC549特点
TLC549是采用IinCMOSTM技术并以开关电容逐次逼近原理工作的8位串行A/D7芯片,可与通用微处理器、控制器通过I/O CLOCK、CS、DATA OUT三条口线进行串行接口。
TLC549具有4MHz的片内系统时钟和软、硬件控制电路,转换时间最长为17μs,允许的最高转换速率为40000次/s。
总失调误差最大为±0.5LSB,典型功耗值为6 mW。
TLC549采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,由于其VREF-接地时,
(VREF+)-(VREF-)≥1 V,故可用于较小信号的采样,此外,该芯片还单电源3~6v的供电范围。
总之,TLC549具有控制口线少,时序简单,转换速度快,功耗低,价格便宜等特TLC549的极限参数如下:
◇电源电压:
6.5 V:
◇输入电压范围:
0.3V~VCC:
+o.3V:
◇输出电压范围:
0.3V~VCC:
+0.3 V; ◇峰值输入电流(任一输人端):
±10 mA; ◇峰值输人电流(所有输入端):
±30mA
◇工作温度:
TLC549C:
0℃~70~C ◇TLC549I:
-40℃~85℃ ◇TLC549M.-55"C~125℃
其芯片及原理图如图所示
2.5AT89C52工作原理
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
系统硬件电路原理图如图3所示。
2.61602液晶显示屏工作原理
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。
读的时候,先读上面那列,再读左边那行,如:
感叹号!
的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。
以下是1602的16进制ASCII码表:
3.系统软件设计
系统的软件设计使用C51编程,采用模块化设计方法,主要由主函数、定时器T0中断服务函数、A/D转换函数、计算A/D转换值函数、LCD显示函数、LCD显示A/D转换值函数等模块组成,系统软件结构框图如图4所示。
3.1算法设计
根据A/D转换芯片TLC549的工作时序,200ms进行一次A/D采样转换,可以利用定时器T0定时,基本定时时间为50ms,控制软计数器的累计次数为4次,200ms(4×5ms)定时到时,产生定时器T0中断,在定时器T0中断服务函数中调用A/D转换函数进行A/D采样转换,然后调用计算A/D转换值函数把A/D转换值转换为相应的ASCII码,最后通过LCD显示A/D转换值函数把输出电压(0~5V)的转换数字量显示在液晶LCD1602上,数字量显示值范围为0~4.98v。
3.2数据结构设计
数据结构设计如表1所示。
3.3 程序设计
(1)主函数设计
主函数主要完成硬件初始化、数据初始化、函数调用等功能。
①初始化。
首先初始化定时软计数器值为0.00。
调用LCD初始化函数,调用写入显示数据到LCD1602函数设置LCD的DDRAM地址为00H,调用延时函数,调用写入显示数据到LCD1602函数在LCD上显示字符数据第一行为“volt”,第二行为”V”(电压单位)。
②定时初值计算。
定时器T0的定时时间为50ms,系统所用的石英晶体振荡频率为11.0592MHz,因此,1个机器周期=1/石英频率×12,即为12/11.0592ms,定时器的工作方式设置为方式1。
③定时器设置。
设定定时器T0工作方式:
定时器、方式1,即TMOD=01H。
启动定时器T0,即TR0=1。
开放定时器T0中断以及总中断,即设定IE=0x82H。
④等待中断。
定时器T0启动计时后,CPU等待定时中断的到来。
当定时器T0定时50ms后,进入定时器T0中断服务函数。
主函数设计流程图如图所示。
(2)定时器T0中断服务函数设计
当定时器T0定时50ms后,进入定时器T0中断服务函数。
首先重装定时器T0初值,即TH0=0xee,TL0=0x00。
每定时5ms一次,软计数器值减1。
然后判断软计数器值是否为0:
①若值不为0,表明20ms(20ms采样一次)计时未到,这时T0中断函数返回主函数,继续计时。
②若值为0,表明20ms(20ms采样一次)计时已到,重置软计数器初值为4,为下次定时做准备,接着调用A/D转换函数进行A/D采样转换,得到A/D采样转换值adbl,然后调用计算A/D转换值ASCII码函数计算A/D采样转换值adbl相应的ASCII码,再调用LCD显示A/D转换值函数把模拟量输入电压(0~5V)的转换数字量显示在液晶LCD1602上,数字量显示值范围为0~4.5v。
最后T0中断函数返回主函数进行下一次A/D采样转换。
(3)A/D采样转换函数设计
根据A/D转换芯片TLC549的工作时序,当片选信号CS为高电平时,数据输出DATAOUT端处于高阻状态,此时时钟信号I/OCLOCK不起作用,不能进行A/D转换。
将片选信号CS置低电平,内部电路在测得CS下降沿后,再等待两个内部时钟上升沿和一个下降沿后,然后确认这一变化。
首先定义变量i(表示A/D采样转换位数),并将芯片TLC549片选信号AD_CS置低电平,选中该芯片。
初始化A/D采样转换值adbl为0,初始化变量i(A/D采样转换位数)为0。
判断A/D转换位数i是否小于8。
①如果i小于8,则将芯片TLC549时钟信号AD_CK置高电平,并把A/D采样转换值adbl左移一位。
然后判断A/D采样转换串行数据输出信号AD_OUT是否为1:
若AD_OUT为1,则将A/D采样转换值adbladbl自加1。
若AD_OUT为0,则A/D采样转换值adbladbl不变。
再将芯片TLC549时钟信号AD_CK置低电平。
最后将A/D转换位数i自加1,并再次转向上面的判断A/D转换位数i是否小于8。
②如果i不小于8,则把芯片TLC549片选信号AD_CS置高电平,结束A/D采样转换,并退出A/D采样转换函数。
(4)计算A/D转换值ASCII码函数模块设计
要把AD转换值adbl显示在LCD上,需要把它转换为相应的ASCII码。
首先计算A/D转换值百位数ASCII码:
将A/D转换值adbl除以100得到的商与0x30(因为字符数字0~9与其相应的ASCII码相差30H)相与。
然后计算A/D转换值十位数ASCII码:
将A/D转换值adbl除以100得到的余数再除以10,得到的商与0x30(因为字符数字0~9与其相应的ASCII码相差30H)相与。
再计算A/D转换值个位数ASCII码:
将A/D转换值adbl除以10得到的余数与0x30(因为字符数字0~9与其相应的ASCII码相差30H)相与。
最后函数返回。
(5)LCD显示函数设计
LCD显示函数模块包括LCD初始化函数、写入指令数据到LCD函数、写入显示数据到LCD函数、LCD显示A/D转换值函数、延时函数等模块。
4.源程序代码
4.1Main函数模块
#include
#include
#include
#include"1602.h"
sbitTLC549_CS=P1^0;//TLC549片选,低电平有效
sbitTLC549_DO=P1^1;//TLC549数字量输出
sbitTLC549_CLK=P1^2;//TLC549片外独立时钟
sbitled=P0^7;//工作状态灯,闪烁为正常
unsignedcharDO,num;//读土壤湿度返回值、定时器计数变量
floatDO_F,volt,hh;//读取返回值的20次累加值、最终转换系数
bitflag=1;//工作标志位
unsignedcharstr1[]="Volt:
";
unsignedcharstr2[]="0V";
unsignedchartemp[3];
voidInitTimer0();//声明定时器T0初始化函数
voiddelayus(unsignedintt);//声明延时t个机器周期
unsignedcharTLC549_read();//声明TLC549读数字量函数
voidmain()
{
unsignedchari;//for循环变量
InitTimer0();//初始化定时器T0
LCD_init();
delayus(1000);
LCD_clear();
LCD_write_string(1,1,str1);
LCD_write_string(2,1,str2);
while
(1)
{
if(flag)
{
flag=0;//标志位清零
for(i=0;i<20;i++)
{
DO=TLC549_read();//读
DO_F=DO_F+DO;//累加
}
DO_F=DO_F/20.00;//累加值除20求平均
volt=(float)((DO_F*5)/256.00);//TLC549是8位A/D芯片
//2的8次方是256
//即转换所得数值为0-255
//所以乘以基准电压再除以精度
sprintf(temp,"%4.2f",volt);
LCD_write_string(2,7,temp);
if(volt>4.5|volt<0.5)
led=1;
if(volt>0.5&&volt<4.5)
led=0;
}
}
}
4.1.1定时器T0初始化函数模块
voidInitTimer0()
{
TMOD=0x01;//选择定时器T0
TH0=0x4C;//定时50毫秒
TL0=0x00;
EA=1;//开总中断
ET0=1;//开定时器T0中断
TR0=1;//使能定时器T0
}
4.1.2定时器工作模块
voidTimer0Interrupt()interrupt1
{
TH0=0x4C;//重装初值
TL0=0x00;
num++;//计数变量增加1
if(num==10)//每500毫秒读一次数字量
{//定时50毫秒,即每50毫秒进1次中断,num加1
num=0;//进10次中断后num为10,即过了500毫秒
flag=1;//num清零,标志位置1
}
}
4.1.3TLC549读取模块
unsignedcharTLC549_read()
{
unsignedchari,temp;
TLC549_CS=1;//关闭片选
TLC549_CLK=0;//时钟线拉低
TLC549_CS=0;//打开片选
_nop_();//空操作等待两个机器周期待总线稳定
_nop_();
for(i=0;i<8;i++)//循环8次读出8位转换结果
{
temp<<=1;
temp|=TLC549_DO;
TLC549_CLK=1;
_nop_();
TLC549_CLK=0;
}
TLC549_CS=1;
delayus(14);//TLC549转换速度小于14微秒,大致延时14微秒等待转换结束
returntemp;//返回转换值
}
4.1.3延时模块
voiddelayus(unsignedintt)//延时函数,延时t个机器周期
{
while(--t);
}
4.2LCD1602函数模块
#include"1602.h"
4.2.1延时模块
voiddelayus1602(unsignedchart)
{
while(--t);
}
voiddelayms1602(unsignedchart)//大致延时t毫秒
{
while(t--)
{
delayus1602(245);
delayus1602(245);
}
}
voidLCD_check_busy()//判盲
{
RS=0;
RW=1;
EN=1;
while((P0&0x80)==0x80);
delayus1602
(2);
EN=0;
}
4.2.2LCD1602命令模块
voidLCD_write_com(unsignedcharcom){
LCD_check_busy();
RS=0;
RW=0;
EN=1;
P0=com;
delayus1602
(2);
EN=0;
}
4.2.3数据写入模块
voidLCD_write_Data(unsignedcharData){
LCD_check_busy();
RS=1;
RW=0;
EN=1;
P0=Data;
delayus1602
(2);
EN=0;
}
4.2.4清屏指令
voidLCD_clear()
{
LCD_write_com(0x01);
delayms1602(5);
}
//voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharc)//在第x行第y位写字符
//{
//LCD_check_busy();
//if(x==1)
//{
//LCD_write_com(0x80+y-1);
//}
//if(x==2)
//{
//LCD_write_com(0xc0+y-1);
//}
//LCD_write_Data(c);
//}
voidLCD_write_string(unsignedcharx,unsignedchary,unsignedchar*s)//在第x行第y位写字符串
{
LCD_check_busy();
if(x==1)
{
LCD_write_com(0x80+y-1);
}
elseif(x==2)
{
LCD_write_com(0xc0+y-1);
}
while(*s)
{
LCD_write_Data(*s);
s++;
}
}
4.2.4初始化
voidLCD_init()
{
delayms1602(15);
LCD_write_com(0x38);
delayms1602(5);
LCD_write_com(0x38);//8位总线、双行5×7点阵
LCD_write_com(0x08);
LCD_write_com(0x01);
LCD_write_com(0x06);
delayms1602(5);
LCD_write_com(0x0c);
}
//voidLCD_user(unsignedcharx,unsignedchar*user)
//向CGRAM写入自定义字符
//{
//形参x为CGRAM自定义字符的地址序号,序号范围0~7
//unsignedchari;
//形参*user为主函数文件中自定义字符的字模数组名
//for(i=0;i<8;i++)
//{
//LCD_write_com(0x40+x*8+i);
//LCD_write_Data(user[i]);
//}
//}
4.3LCD1602端口和命令定义模块
#ifndef__1602_H__
#define__1602_H__
#include
sbitRS=P2^2;//定义1602各个控制位
sbitRW=P2^1;
sbitEN=P2^0;
voidLCD_check_busy();//判忙
voidLCD_write_com(unsignedcharcom);//写命令
voidLCD_write_Data(unsignedcharData);//写数据
voidLCD_clear();//清屏
//voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharc);//在第y行第x位写字符
voidLCD_write_string(unsignedcharx,unsignedchary,unsignedchar*s);//在第y行第x位写字符串
voidLCD_init();//初始化
//voidLCD_user(unsignedcharx,unsignedchar*user);//向CGRAM写入自定义字符
#endif
5.实验总结
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,只有我们去试着做了,才能真正的掌握,学习的理论有些东西是很难理解的,更谈不上掌握。
Tlc549的AD转换可以实现采集数据和控制,是单片机很重要的一个功能。
成功的将电压值变成数字信号并在LCD1602上显示出来。
用到了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TLC549 AD 转换
![提示](https://static.bingdoc.com/images/bang_tan.gif)