TLC549的AD转换_第1页
TLC549的AD转换_第2页
TLC549的AD转换_第3页
TLC549的AD转换_第4页
TLC549的AD转换_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 哈 尔 滨 理 工 大 学 荣 成 学 院单片机课程设计题目:基于TLC549的A/D转换班级: 电信121 姓名: 学号: 1.简介32.实现方案32.1  主控模块设计 32.2  LCD显示模块设计 42.3  A/D转换模块设计 42.4 TLC549介绍42.4.1 TLC549工作原理42.4.2 TLC549特点42.5 AT89C52工作原理52.6 1602液晶显示屏工作原理63.系统软件设计 63.1算法设计 73.3  程序设计 7(2) 定时器T0中断服务函数设计 8(5) LCD显示函数设计 94. 源程序代码104.1 Ma

2、in函数模块104.1.1定时器T0初始化函数模块114.1.2定时器工作模块124.1.3 TLC549读取模块124.1.3 延时模块134.2 LCD1602函数模块134.2.1 延时模块134.2.2 LCD1602命令模块144.2.3 数据写入模块144.2.4清屏指令144.2.4 初始化154.3 LCD1602端口和命令定义模块165.实验总结176.参考文献181.简介 电压表作为电子应用领域必不可少的工具,其性能越来越受到人们的广泛关注。传统的模拟电压表由于设计较复杂,精度较低,不适合一般应用。数字电压表是诸多数字化仪表的核心与基础,电压表的数字化是将连续的模拟量如直流

3、电压转换成不连续的离散的数字形式并加以显示,这有别于传统的以指针加刻度盘进行读数的方法,避免了读数的视差和视觉疲劳。采用单片机设计的数字电压表,以其精度高、抗干扰能力强、可扩展性强、集成方便、价格低廉等优点得到了普遍应用。其内部核心部件是A/D转换器,转换器的精度很大程度上影响着数字万用表的准确度。 本课程设计采用A/D转换器TLC549对电压测量电路测出的输入模拟信号电压值进行转换,控制核心AT89C52RC再对转换的结果进行运算和处理,最后驱动输出显示装置LCD1602显示数字电压信号。2.实现方案 系统的硬件采用模块化设计,以单片机主控器为核心,与LCD显示电路、A/D转换电路等组成数字

4、电压表控制系统。主要包括单片机主控模块、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&

5、#160; LCD显示模块设计 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用的有16×1、16×2、20×2和40×2行等模块。本系统选用1602字符型LCD模块,其控制器为日立公司生产的HD44780,可以用来显示数字、字符等。2.3  A/D转换模块设计 A/D模块由A/D芯片和电压测量电路组成,通过电压测量电路测得输入电压,并转换为05V的标准信号。本系统选用TI公司生产的一种低价位、高性能的8位A/D芯片TLC549。2.4 TLC549介绍2.4.1 TLC549工作原理 当/CS变为低电平后, TLC

6、549芯片被选中, 同时前次转换结果的最高有效位MSB (A7)自 DATA OUT 端输出,接着要求自 I/O CLOCK端输入8个外部时钟信号,前7个 I/O CLOCK信号的作用,是配合 TLC549 输出前次转换结果的 A6-A0 位,并为本次转换做准备:在第4个 I/O CLOCK 信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始,第8个 I/O CLOCK 信号的下降沿使片内采样/保持电路进入保持状态并启动 A/D开始转换。转换时间为 36 个系统时钟周期,最大为 17us。直到 A/D转换完成前的这段时间内,TLC549 的控制逻辑要求:或者/CS保持高电平,或者

7、I/O CLOCK 时钟端保持36个系统时钟周期的低电平。由此可见,在自 TLC549的 I/O CLOCK 端输入8个外部时钟信号期间需要完成以下工作:读入前次A/D转换结果;对本次转换的输入模拟信号采样并保持;启动本次 A/D转换开始。2.4.2 TLC549特点 TLC549是采用IinCMOSTM技术并以开关电容逐次逼近原理工作的8位串行AD7芯片,可与通用微处理器、控制器通过IO CLOCK、CS、DATA OUT三条口线进行串行接口。TLC549具有4MHz的片内系统时钟和软、硬件控制电路,转换时间最长为17s,允许的最高转换速率为40000次/s。总失调误差最

8、大为±05LSB,典型功耗值为6 mW。TLC549采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,由于其VREF-接地时,(VREF+)-(VREF-)1 V,故可用于较小信号的采样,此外,该芯片还单电源36v的供电范围。总之,TLC549具有控制口线少,时序简单,转换速度快,功耗低,价格便宜等特TLC549的极限参数如下:  电源电压:65 V: 输入电压范围:0.3VVCC:+o.3V:  输出电压范围:0.3VVCC:+03 V; 峰值输入电流(任一输人端):

9、77;10 mA;  峰值输人电流(所有输入端):±30mA  工作温度:TLC549C:070C   TLC549I:-4085  TLC549M-55"C125 其芯片及原理图如图所示 2.5 AT89C52工作原理 AT89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红

10、外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(3239 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚

11、定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。 系统硬件电路原理图如图3所示。2.6 1602液晶显示屏工作原理1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变

12、量赋值,如'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(

13、4×5ms)定时到时,产生定时器T0中断,在定时器T0中断服务函数中调用A/D转换函数进行A/D采样转换,然后调用计算A/D转换值函数把A/D转换值转换为相应的ASCII码,最后通过LCD显示A/D转换值函数把输出电压(05V)的转换数字量显示在液晶LCD1602 上,数字量显示值范围为04.98v。3.2数据结构设计数据结构设计如表1所示。3.3  程序设计(1) 主函数设计 主函数主要完成硬件初始化、数据初始化、函数调用等功能。 初始化。首先初始化定时软计数器值为 0.00。调用LCD初始化函数,调用写入显示数据到LCD1602函数设置LCD的DDRAM地址为00H,调

14、用延时函数,调用写入显示数据到LCD1602函数在LCD上显示字符数据第一行为“volt”,第二行为”V”(电压单位)。 定时初值计算。定时器T0的定时时间为50ms,系统所用的石英晶体振荡频率为 11.0592 MHz,因此,1 个机器周期1/石英频率×12,即为 12/11.059 2 ms,定时器的工作方式设置为方式 1。 定时器设置。设定定时器T0工作方式:定时器、方式1,即TMOD01H。启动定时器T0,即TR01。开放定时器T0中断以及总中断,即设定IE0x82H。 等待中断。 定时器T0启动计时后,CPU等待定时中断的到来。当定时器T0定时50ms后,进入定时器T0中断

15、服务函数。 主函数设计流程图如图所示。 开始 设置计数器初值为0.00设置T0的初值:0XEE;TL0:0x4c;设置T0的工作方式:;TMOD=0x01(工作方式1) 调用LCD初始化函数调用写入指令数据到LCD函数,在LCD上显示字符第一行为“volt”,第二行为“V” 设置LCD的DDRAM为00H,调用写入指令到LCD函数 调用主函数main 启动定时器T0:TR0=1;允许T0中断:IE=0X82;等待T0计时器中断(2) 定时器T0中断服务函数设计 当定时器T0定时50ms后,进入定时器T0中断服务函数。首先重装定时器T0初值,即TH00xee,TL00x00。每定时5ms一次,软

16、计数器值减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转换值函数把模拟量输入电压(05 V)的转换数字量显示在液晶 LCD1602上,数字量显示值范围为04.5v。最后T0中断函数返回主函数进行下一次A/D采样转换。(3) A/D采样转换函

17、数设计 根据A/D转换芯片TLC549的工作时序,当片选信号CS为高电平时,数据输出DATA OUT端处于高阻状态,此时时钟信号I/O CLOCK不起作用,不能进行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左移一位。

18、然后判断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转换值a

19、dbl除以100得到的商与0x30(因为字符数字09与其相应的ASCII 码相差30H)相与。然后计算A/D转换值十位数ASCII码:将A/D转换值adbl除以100得到的余数再除以10,得到的商与0x30(因为字符数字09与其相应的ASCII 码相差30H)相与。再计算A/D转换值个位数ASCII码:将A/D转换值adbl除以10得到的余数与0x30(因为字符数字09与其相应的ASCII 码相差30H)相与。最后函数返回。(5) LCD显示函数设计 LCD显示函数模块包括LCD初始化函数、写入指令数据到LCD函数、写入显示数据到LCD函数、LCD显示A/D转换值函数、延时函数等模块。4. 源

20、程序代码4.1 Main函数模块#include <reg52.h> /包含头文件#include <intrins.h> /空操作函数_nop_()必须的头文件#include <stdio.h>#include "1602.h"sbit TLC549_CS = P10;/TLC549片选,低电平有效sbit TLC549_DO = P11;/TLC549数字量输出sbit TLC549_CLK = P12;/TLC549片外独立时钟sbit led = P07; /工作状态灯,闪烁为正常unsigned char DO, num; /

21、读土壤湿度返回值、定时器计数变量float DO_F, volt,hh; /读取返回值的20次累加值、最终转换系数bit flag = 1; /工作标志位unsigned char str1 = "Volt:"unsigned char str2 = " 0V"unsigned char temp3;void InitTimer0();/声明 定时器T0初始化 函数void delayus(unsigned int t);/声明 延时t个机器 周期unsigned char TLC549_read();/声明 TLC549读数字量 函数void main

22、()unsigned char i; /for循环变量InitTimer0();/初始化定时器T0LCD_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 *

23、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初始化函数模块void InitTimer0() TMOD = 0x01; /选择定时器T0 TH0 = 0x4C; /定时50毫秒 TL0 =

24、 0x00; EA = 1; /开总中断 ET0 = 1; /开定时器T0中断 TR0 = 1; /使能定时器T04.1.2定时器工作模块void Timer0Interrupt() interrupt 1 TH0 = 0x4C;/重装初值 TL0 = 0x00;num+;/计数变量增加1if(num=10)/每500毫秒读一次数字量/定时50毫秒,即每50毫秒进1次中断,num加1num = 0;/进10次中断后num为10,即过了500毫秒flag = 1;/num清零,标志位置14.1.3 TLC549读取模块unsigned char TLC549_read() unsigned ch

25、ar i , 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微秒等待转换结束return temp;/返回转换值4.

26、1.3 延时模块void delayus(unsigned int t) /延时函数,延时t个机器周期while(-t);4.2 LCD1602函数模块#include "1602.h"4.2.1 延时模块void delayus1602(unsigned char t) while(-t);void delayms1602(unsigned char t) /大致延时t毫秒 while(t-) delayus1602(245); delayus1602(245); void LCD_check_busy() /判盲RS = 0;RW = 1;EN = 1;while(P0

27、 & 0x80)=0x80);delayus1602(2);EN = 0;4.2.2 LCD1602命令模块void LCD_write_com(unsigned char com)LCD_check_busy();RS = 0;RW = 0;EN = 1;P0 = com;delayus1602(2);EN = 0;4.2.3 数据写入模块void LCD_write_Data(unsigned char Data) LCD_check_busy();RS = 1;RW = 0;EN = 1;P0 = Data;delayus1602(2);EN = 0;4.2.4清屏指令void

28、LCD_clear() LCD_write_com(0x01);delayms1602(5);/void LCD_write_char(unsigned char x , unsigned char y , unsigned char c) /在第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);/void LCD_write_string(unsigned char x , unsigned

29、 char y , unsigned char *s) /在第x行第y位写字符串LCD_check_busy();if( x = 1 )LCD_write_com(0x80 + y - 1);else if( x = 2 )LCD_write_com(0xc0 + y - 1);while(*s)LCD_write_Data(*s);s+;4.2.4 初始化void LCD_init() delayms1602(15);LCD_write_com(0x38);delayms1602(5);LCD_write_com(0x38);/8位总线、双行5×7点阵LCD_write_com(0

30、x08);LCD_write_com(0x01);LCD_write_com(0x06);delayms1602(5);LCD_write_com(0x0c);/void LCD_user(unsigned char x , unsigned char *user)/向CGRAM写入自定义字符/形参x为CGRAM自定义字符的地址序号,序号范围07/unsigned char i;/形参*user为主函数文件中自定义字符的字模数组名/for(i=0;i<8;i+)/LCD_write_com(0x40+x*8+i);/LCD_write_Data(useri);/  4.3 LCD1602端口和命令定义模块#ifndef _1602_H_#define _1602_H_#include <reg52.h>sbit RS = P22; /定义1602各个控制位sbit RW = P21;sbit EN = P20;void LCD_check_busy(); /判忙void LCD_write_com(unsigned char com); /写命令void LCD_write_Data(unsigned char Data); /写数据vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论