TLC549模数转换器的控制实验
实验5 模数变换TLC549 串行ADC例程
有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺)
CS = 1; return d;
} /* 函数:AdcInit() 功能:初始化ADC接口 */ void AdcInit() {
CS = 1; CLK = 0; DAT = 1; ReadAdc(); }
/* 函数:Delay() 功能:延时(t*10)ms */ void Delay(unsigned char t) {
do {
TH0 = 0xC5; TL0 = 0x68; TR0 = 1; while ( !TF0 ); TR0 = 0; TF0 = 0; } while ( --t != 0 ); }
/* 函数:DispClear() 功能:清除数码管的所有显示 */
void DispClear()
{
unsigned char i;
/* 函数:SysInit() 功能:系统初始化 */ void SysInit() {
TMOD &= 0xF0; TMOD |= 0x01; DispInit(); AdcInit(); Delay(10); }
/* 函数:DispChar() 功能:在数码管上显示字符 参数:x:数码管的坐标位置(0~7) c:要显示的字符(仅限16进制数字和减号) dp:是否显示小数点,0-不显示,1-显示 */
#include "VolTab.h"
//定义TLC549操作接口 sbit CS = P2^2; sbit DAT = P2^3; sbit CLK = P2^4;
//定义显示缓冲区(由定时中断程序自动扫描) unsigned char DispBuf[8];
/* 函数:ReadAdc() 功能:读取A/D转换结果 返回:8位ADC代码 */
基于tlc549和tlc5615模数数模转换讲解
任务书1、查阅资料,熟悉硬件和软件;(所使用硬件芯片型号,所使用软件编辑环境)2、掌握TLC549芯片和TLC5615芯片的特性,引脚功能。
3、确定详细软件设计方案,画程序流程图4、根据TLC549的时序图,使用汇编语言/C语言编写单片机STC89C52与TLC549的软件通信程序代码。
实现模/数转换功能。
5、根据TLC5615的时序图,使用汇编语言/C语言编写单片机STC89C52与TLC5615的软件通信程序代码。
实现数/模转换功能。
6、整合模数、数模转换代码,实现信号发生器在MAX1247输入端输入正弦波(频率不限),示波器在TLC5615输出端测量到同样的正弦波,记录输出波形。
7 .撰写课程设计报告。
目录1、绪论 (XX)2、方案论证(规划、选定) (XX)3、方案说明(设计)XX (XX)4、硬件方案设计 (XX)5、软件方案设计 (XX)6、调试 (XX)6、技术小结(结束语) (XX)8、参考文献 (XX)9、附录(源程序代码、电路图等) (XX)1.绪论本实验主要是基于单片机微型控制器的控制,实现将模拟信号转换成数字信号的一个简单实验。
通过这个实验,可以为广大研究人员提供一个比较系统的模数数模转换基础资料,以便于将模拟信号转换为数字信号或将数字信号转换成模拟信号。
2.方案论证2.1.试验原理本实验主要是通过单片机stc89c52芯片控制模数转换芯片tlc549将所给模拟信号转换成数字信号,然后将数字信号读进数模转换芯片tlc5615,从输出端口将转换后的信号输出来。
可用图1简洁明了地表现出来:2.2模/数转换器(1)模/数转换器的作用TLC549是一种高性能的8位A/D转换器,它以8位开关电容逐次逼近的方法实现A/D转换,本实验通过用该芯片采集模拟量,然后将采集到的模拟量转换为数字量后送至单片机。
(2)芯片特性;TLC549芯片, 可与通用微处理器、控制器通过I/ O CLOCK、CS、DATA OU T 三条口线进行串行接口。
8串行模数转换实验报告
串行A/D转换一、实验目的学习使用串行模数转换芯片TLC549进行电压采集和数据处理。
二、protel电原理图三、程序流程图四、汇编程序1、CS BIT P1.2DAT BIT P1.1CLK BIT P1.0AD_DATA DATA 30HORG 8000HAJMP MAINORG 8100HMAIN:MOV SP,#60H ;堆栈指针初始化ACALL TLC549_ADC ;调用TLC549_ADC函数MOV R7,#0DJNZ R7,$ACALL TLC549_ADCMOV AD_DA TA,ASJMP $TLC549_ADC:CL RACLR CLKCLR CS ;选中TLC549MOV R6,#8TLCAD_L1:SETB CLKNOPNOPMOV C,DA TRLC ACLR CLK ;DA=0,为读出下一位数据做准备NOPDJNZ R6,TLCAD_L1SETB CS ;禁止TLC549,再次启动A/D转换SETB CLKRET;END2、CS BIT P1.2DAT BIT P1.1CLK BIT P1.0AD_DATA DATA 30HORG 8000HAJMP MAINORG 800BHLJMP INTT0ORG 8100HMAIN:MOV SP,#60HMOV TMOD,#02HMOV TL0,#48HMOV TH0,#48HSETB ET0SETB EASETB TR0MOV R0,#AD_DA TAACALL TLC549_ADCSJMP $INTT0:ACALL TLC549_ADCMOV @R0,AINC R0CJNE R0,#80H,RETTICLR TR0CLR EACLR ET0RETTI:RETITLC549_ADC:CLR ACLR CLKCLR CSMOV R6,#8TLCAD_L1:SETB CLKNOPNOPMOV C,DAT ; 读入数据到标志位RLC A ; 用循环移位吧标志位移入ACLR CLKNOPDJNZ R6,TLCAD_L1SETB CSSETB CLK ; 禁止TLC549,再次启动A/D转换。
智能仪器最终版
实验一模拟量的输入\输出指导教师李业德实验目的:熟悉模数转换的工作原理,学习使用串行模/数转换芯片TLC549进行电压信号的采集和数据处理。
实验设备及器件:PC机,DP-51PROC单片机综合仿真实验仪。
实验内容:编写程序,通过单片机的P1口控制串行A/D转换芯片TLC549实现模拟电压信号的采集,通过LED数码管显示转换结果。
实验步骤:1、电路连接1)安装B8区JP17的短路帽,然后将Vcc(+5V电源)与B8区的REF+连接,将B8区的CLK、DAT、CS对应连接到A2区的P10、P11、P12针上。
2)使用导线将D2区的10K 电位器连接为电压调节模式,使用导线将其电压调整端连接到B8区的ANIN连接柱,作为TLC549的模拟电压信号输入。
2、编写程序编写程序,驱动TLC549,将转换结果显示在数码管上。
3、下载调试打开调试软件,下载运行编写好的程序,完成一次A/D转换,然后调节电位器改变输入模拟电压,多次测量保存测量数据。
实验参考程序:#include <REG51.h>#include <intrins.h>#include <absacc.h>#include "VIiC_C51.H" //包含VI2C软件包#include "zlg7290.h"#define uchar unsigned charsbit CLK=P1^3;sbit DAT=P1^1;sbit CS=P1^2;sbit RST=P1^0;uchar bdata ADCdata;sbit ADbit=ADCdata^0;unsigned char DelayNS(unsigned char no) {unsigned char i,j;//延时参数for(; no>0; no--){for(i=0; i<100; i++)for(j=0; j<10; j++);}return 0;}/**************************************** *************函数名称: TLC549ADC()**函数功能: 读取上一次A/D转换的数据,启动下一次A/D转换***************************************** ***********/uchar TLC549ADC(void){uchar i;CLK=0;DAT=1;CS=0;for(i=0;i<8;i++){CLK=1;_nop_();_nop_();ADCdata<<=1;ADbit=DAT;CLK=0;_nop_();}return (ADCdata);}void main(){uchar i;uchar AD_DATA; //定义A/D转换数据变量RST=0;DelayNS(1);RST=1;DelayNS(10);TLC549ADC(); //启动一次A/D转换for(i=0xff;i>0;i--) //延时{_nop_();}while(1){AD_DATA=TLC549ADC();ZLG7290_SendCmd(0x60+0,AD_DATA);}}实验二智能机器人机接口指导教师李业德实验目的:掌握智能仪器的人机对话接口。
基于tlc549和tlc5615模数数模转换
任务书1、查阅资料,熟悉硬件和软件;(所使用硬件芯片型号,所使用软件编辑环境)2、掌握TLC549芯片和TLC5615芯片的特性,引脚功能。
3、确定详细软件设计方案,画程序流程图4、根据TLC549的时序图,使用汇编语言/C语言编写单片机STC89C52与TLC549的软件通信程序代码。
实现模/数转换功能。
5、根据TLC5615的时序图,使用汇编语言/C语言编写单片机STC89C52与TLC5615的软件通信程序代码。
实现数/模转换功能。
6、整合模数、数模转换代码,实现信号发生器在MAX1247输入端输入正弦波(频率不限),示波器在TLC5615输出端测量到同样的正弦波,记录输出波形。
7 .撰写课程设计报告。
目录1、绪论 (XX)2、方案论证(规划、选定) (XX)3、方案说明(设计)XX (XX)4、硬件方案设计 (XX)5、软件方案设计 (XX)6、调试 (XX)6、技术小结(结束语) (XX)8、参考文献 (XX)9、附录(源程序代码、电路图等) (XX)1.绪论本实验主要是基于单片机微型控制器的控制,实现将模拟信号转换成数字信号的一个简单实验。
通过这个实验,可以为广大研究人员提供一个比较系统的模数数模转换基础资料,以便于将模拟信号转换为数字信号或将数字信号转换成模拟信号。
2.方案论证2.1.试验原理本实验主要是通过单片机stc89c52芯片控制模数转换芯片tlc549将所给模拟信号转换成数字信号,然后将数字信号读进数模转换芯片tlc5615,从输出端口将转换后的信号输出来。
可用图1简洁明了地表现出来:2.2模/数转换器(1)模/数转换器的作用TLC549是一种高性能的8位A/D转换器,它以8位开关电容逐次逼近的方法实现A/D转换,本实验通过用该芯片采集模拟量,然后将采集到的模拟量转换为数字量后送至单片机。
(2)芯片特性;TLC549芯片, 可与通用微处理器、控制器通过I/ O CLOCK、CS、DATA OU T 三条口线进行串行接口。
芯片TLC549介绍
芯片TLC549介绍TLC549是德州仪器(Texas Instruments)公司生产的一款12位ADC (模数转换器)芯片。
它是一种单路、非差分型的ADC,具有高性能和低功耗的特点。
TLC549的内部结构包括一个伪双电源样本保持电路、一个12位A/D转换器和一个5位数字接口控制电路。
TLC549具有的一项重要特性是其高精度转换能力。
它能够提供12位的分辨率,即可以将模拟输入信号转换为2^12个不同的数字量级。
这使得TLC549非常适用于各种需要高精度测量的应用领域,比如仪器、医疗设备和工控系统等。
为了确保高质量的模拟输入信号,TLC549的伪双电源样本保持电路能够在采样过程中快速并稳定地获取模拟输入信号。
这种电路设计减少了信号失真和噪声的影响,提高了转换精度和稳定性。
TLC549还具有低功耗的特点。
它采用了低功耗的CMOS工艺技术,使得其工作电流非常小,通常在1.4mA左右。
这对于需要长时间工作的应用而言,可以降低功耗和热量产生,延长设备的使用寿命。
另外,TLC549还支持多种工作模式和转换速率选择。
通过SPI(串行外围接口)总线和主控器连接,可以通过控制字节对TLC549进行配置。
用户可以根据具体应用的需求选择不同的工作模式和转换速率,从而满足不同的采样要求。
以下是一个使用TLC549芯片进行模拟信号转换的简单示例程序:#include <msp430g2553.h>#define CLK BIT7#define CS BIT4#define DIN BIT5#define DOUT BIT6void spi_initUSICTL0,=USIPE7,USIPE6,USIPE5,USIMST,USIOE; USICTL1,=USICKPH;USICKCTL,=USISSEL_2,USICKPL;USICTL0&=~USISWRST;unsigned int read_adcP1OUT&=~CS;USISRL=0x00;USICNT=8;while(!(USICTL1 & USIIFG));P1OUT,=CS;return (USISRH << 8) , USISRL;void main(void)WDTCTL=WDTPW,WDTHOLD;P1DIR,=CS;P1DIR,=CLK;P1DIR&=~DOUT;P1OUT,=CS;P1OUT,=CLK;spi_init(;while(1)unsigned int data = read_adc(;//进行相应的处理或输出}这个示例程序是在MSP430G2553微控制器上运行的。
串行模数数模转换实验报告
串行模数/数模转换实验报告一.实验目的:1、掌握 TLC549同步串行接口的ADC模块的特性、编程原理,了解TLC5620的4种时序图以及产生波形幅度的计算方法。
2、能实现TLC549、TLC5620与MCS-51单片机的连接,分别进行数据采集和波形观测。
3、能采用Proteus ISIS软件进行串行模数转换的电路设计。
4、能运用MCS-51单片机汇编语言进行串行模数/数模转换实验的软件设计。
二.实验要求:1、将TLC549 与MCS-51单片机进行连接,利用汇编语言编写出数据采集程序,将转换的模拟电压以二进制的形式通过单片机的P0口输出显示。
1)将单片机的P0口与LED1~LED8连接起来,作为输出显示。
由于LED采用灌电流方式驱动,所以要将数据取反后再输出显示,以获得“正逻辑”效果2)利用P1口与TLC549的控制信号进行连接,TLC549的基准电压REF+端与基准电压+5V相连,将电位器的上端连接VCC、下端连接GND,抽头与TLC549的模拟输入ANIN连接。
在运行程序时,不断地调节电位器,使其抽头电压连续变化,通过LED1~LED8的状态观察ADC转换的结果。
3)运用Proteus ISIS软件完成串行模数转换实验的硬件电路设计。
4)实现KeilC与Proteus软件的联调。
2、设计软件程序,用单片机的I/O口控制TLC5620实现D/A转换,使其通道1产生一个三角波,而通道2产生一个和通道1周期、幅度均相同的方波。
1)短接B7区的电源供给跳线JP16,调节B7区的电位器W3,使其输出接线柱Verf的电压为2.6V。
2)将A2区P16、P17、T0、T1分别连接到B9区的CLK、DAT、LDAC、LOAD,将B7区Verf连接到B9区REF接线柱,短接B9区电源跳线JP13。
3)运行光盘中的相应程序,用双踪示波器的两个探头观察DACA、DACB输出的波形。
三.流水灯硬件电路图四.软件程序1. 串行模数实验程序流程图2.程序清单 1) 串行模数:SDO BIT P1.0 ;数据输出CS BIT P1.1 ;片选SCLK BIT P1.2 ;时钟ORG 8000HAJMP MAINORG 8100HMAIN: MOV SP,#60HLOOP: ACALL TLC549_ADCCPL A ;累加器A取反MOV P0,A ;数据给P0口ACALL DELAYSJMP MAINTLC549_ADC: PUSH 07HCLR A ;清零CLR SCLKMOV R6,#08H ;计数器赋初值CLR CS ;选中TLC549LOOP1:SETB SCLK ;SCLK置位,数据输出NOPNOPMOV C,SDORLC A ;累加器A循环左移CLR SCLK ;SDO=0,为读出下一位数据作准备 NOPDJNZ R6,LOOP1 ;R6-1→R6,判断R6=0SETB CS ;禁止TLC549,再次启动AD转换 SETB SCLKPOP 07HRETDELAY: PUSH 00HMOV R0,#00HDJNZ R0,$POP 00HRETEND2)串行数模:SCLA BIT P1.6SDAA BIT P1.7LOAD BIT P3.5LDAC BIT P3.4VOUTA DATA 30HVOUTB DATA 31HORG 8000HAJMP MAINORG 8100HMAIN:MOV SP,#60HNOPCLR SCLACLR SDAASETB LOADSETB LDACMOV R3,#0A2HMOV R4,#00HMOV VOUTA,#00HMOV R5,#0A2HMOV R6,#00HMOV VOUTB,#00HDACHANG:MOV R1,#01HMOV R2,VOUTALCALL DAC5620DJNZ R3,CONTINUEAMOV R3,#0A2HMOV A,R4CPL AMOV R4,ACONTINUEA:CJNE R4,#OFFH,CONTINUEB DEC R2SJMP CONTINUEC CONTINUEB:INC R2CONTINUEC:MOV VOUTA,R2MOV R1,#03HMOV R2,VOUTBLCALL DAC5620DJNC R5,CONTINUEDMOV R5,#042HMOV A,R6CPL AMOV R6,A CONTINUED:CJNE R6,#0FFH,CONTINUEE MOV R2,#OA2HSJMP CONTINUEF CONTINUEE:MOV R2,#00H CONTINUEF:MOV VOUTB,R2LJMP DACHANG DAC5620:MOV A,R1CLR SCLAMOV R7,#08HLCALL SENDBYTEMOV A,R2CLR SCLAMOV R7,#08HLCALL SENDBYTECLR LOADSETB LOADCLR LDACSETB LDACRETSENDBYTE:SETB SCLARLC AMOV SDAA,CCLR SCLADJNZ R7,SENDBYTE RETEND五.实验结果观察实验结果,可知道通过调节电位器,数字量在对应的发生改变。
TLC549模数转换器的控制实验
A/D芯片TLC549的转换与数据采集实验1、实验目的(1) 掌握A/D转换与单片机的接口方法;(2)掌握A/D芯片TLC549的编程方法;(3)掌握数据采集程序的设计方法;2、实验内容利用实验开发装置上的TLC549做A/D转换器,对电位器提供的模拟电压信号进行定时采样,结果在数码管上进行显示。
3、I/O地址A/D转换芯片 TLC549CLK P1.5 时钟位DAT P1.7 数据位CS P1.6 选片位4、实验线路将TLC549的CLK接P1.5、DAT接P1.7、CS接P1.6,将模拟电压输入端连到电位器的电压输出端,并接万用表进行输入电压测量。
5、实验步骤在PC机输入源程序并汇编,然后下载到单片机上,进行调试。
调节电位器,电压从0V到5V变化,记录数码管的显示数值。
记录到表中。
6、实验报告(1) 整理好实验程序和实验记录,进行数据处理分析并做图。
(2) 数据采集中,如何实现精确的定时数据采集?(3) 数码管动态扫描显示程序设计中,显示刷新的时间如何确定?TLC549实验程序#include "reg52.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned int/***************************************************TLC549 A/D转换****************************************************/sbit CLK=P1^5;sbit DAT=P1^7;sbit CS =P1^6;uchar TLC549ADC(void){uchar i,x;CLK=0; DAT=1; CS=0;for(i=0;i<8;i++){CLK=1;x<<=1;if(DAT==1) x++;CLK=0;}CS=1;return (x);}uint y;uchar x;void main(){while(1){y=TLC549ADC();y=y*250/128;P3=y/100;P2=y%10+((y/10)%10)*16;}}。
模数转换-TCL549 ADC
实验六、模数转换-TCL549 ADC实验目的:在这一课里,我们来学习模数转换器TLC549,通过FPGA/CPLD来驱动TLC549,采集模拟电压信号。
实验原理:(1)TLC549 AD简介TLC549是美国德州仪器公司生产的8位串行A/D转换器芯片,可与通用微处理器、控制器通过CLK、CS、DATA OUT 三条口线进行串行接口。
具有4MHz片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549允许的最高转换速率为45500次/s,TLC549为40000次/s。
总失调误差最大为±0.5LSB,典型功耗值为6mW。
采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,VREF-接地,VREF+-VREF-≥1V,可用于较小信号的采样。
TLC549的内部框图和引脚名称如下图所示。
TLC548/549的极限参数如下:●电源电压:6.5V;●输入电压范围:0.3V~VCC+0.3V;●输出电压范围:0.3V~VCC+0.3V;●峰值输入电流(任一输入端):±10mA;●总峰值输入电流(所有输入端):±30mA;●工作温度:TLC548C、TLC549C:0℃~70℃TLC548I、TLC549I:-40℃~85℃TLC548M、TLC549M:-55℃~125℃(2)TLC549 硬件接口TLC549可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,也可与FPGA/CPLD连接使用。
与FPGA/CPLD 的接口如图所示。
其中VREF为2.5V基准源,采用TL431按如下连接方式实现,输入5V电压经过LC滤波后送给TL431,TL431送出标准2.5V 后经过滤波后送给TLC549,保证基准电压的精度。
当CS为高时,数据输出(DATA OUT)端处于高阻状态,此时I/O CLOCK不起作用。
这种CS控制作用允许在同时使用多片TLC549时,共用I/O CLOCK,以减少多路(片)A/D并用时的I/O控制端口。
实验四---用状态机实现ADC的采样电路设计
实验四用状态机实现ADC的采样电路设计一、实验目的1、用状态机实现ADC的采样控制电路2、熟悉QuartusⅡ软件应用环境,了解实验流程。
3、编写简单的Verilog代码,在QuartusⅡ中进行调试和验证,并在magic sopc 中下载代码和验证。
二、实验器材QutersII软件、magic sopc实验箱、电脑三、实验原理TLC549是一个8位的串行模数转换器,AD转换时间最大17微秒,I/O时钟可达1.1MHz。
如图21.1所示为TLC549的访问时序,从图中可以看由当CS/拉低时,ADC前一次的转换数据(A)的最高位A7立即出现在数据线DATA OUT上,之后的数据在时钟I/O CLOCK的下降沿改变,可在I/O CLOCK的上升沿读取数据。
读完8位数据后,ADC 开始转换这一次采样的信号(B),以便下一次读取。
转换时片选信号CS/要置高电平。
设计操作时序是要注意Tsu(CS)、Tconv及I/O CLOCK的频率几个参数。
Tsu(CS)为CS/拉低到I/O CLOCK 第一个时钟到来时间,至少要1.4 秒;Tconv 为ADC的转换时钟,不超过17微秒;由于ADC是8位的,所以采样的电压值为: V=(D/256)*Vref 其中V 为采样的电压值,D为ADC 转换后读取的8 位二进制数,Vref 为参考电压值,这里是2.5V。
四、实验步骤步骤1.新建一个文件夹打开vhdl文件步骤2:编写源程序并保存module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat <= d[31:28]; //第一个数码管3'd1:disp_dat <= d[27:24]; //第二个数码管3'd2:disp_dat <= d[23:20]; //第三个数码管3'd3:disp_dat <= d[19:16]; //第四个数码管3'd4:disp_dat <= d[15:12]; //第五个数码管3'd5:disp_dat <= d[11:8]; //第六个数码管3'd6:disp_dat <= d[7:4]; //第七个数码管3'd7:disp_dat <= d[3:0]; //第八个数码管default:disp_dat <= 0;endcasecase(count) //选择数码管显示位3'd0:dig_r <= 8'b11111111; //no选择第一个数码管显示3'd1:dig_r <= 8'b11111111; //no选择第二个数码管显示3'd2:dig_r <= 8'b11111111; //no选择第三个数码管显示3'd3:dig_r <= 8'b11111111; //no选择第四个数码管显示3'd4:dig_r <= 8'b11111111; //no选择第五个数码管显示3'd5:dig_r <= 8'b11111111; //no选择第六个数码管显示3'd6:dig_r <= 8'b11111101; //选择第七个数码管显示3'd7:dig_r <= 8'b11111110; //选择第八个数码管显示default:dig_r <= 8'b11111111;endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fdefault:seg_r = 8'hff;endcaseendendmodulemoduleadc(clock,reset,enable,sdat_in,adc_clk,cs_n,data_ready,data_out);//I/O口声明input clock; //系统时钟sys_clk_50MHz PIN=B13 , ON CORE BOARDinput reset; //复位,高电平有效input enable; //转换使能input sdat_in; //TLC549串行数据输入output adc_clk; //TLC549 I/O时钟output cs_n; //TLC549 片选控制output data_ready; //指示有新的数据输出output[7:0] data_out; //AD转换数据输出//I/O寄存器reg adc_clk_r;reg cs_n_r;reg data_ready_r;reg[7:0] data_out_r; //AD转换数据输出reg sdat_in_r; //数据输出锁存//内部寄存器reg[7:0]q; //移位寄存器,用于接收或发送数据reg[2:0]adc_state; //状态机ADCreg[2:0]adc_next_state;reg[5:0]bit_count; //移位计数器reg bit_count_rst; //ADC时钟计数器全能控制reg div_clk;reg[CLK_DIV_BITS-1:0] clk_count;//时钟分频计数器reg buf1,buf2;//内部信号wire ready_done; //cs_n拉低(大于1.4us)后的标志wire rec_done; //数据读取完毕的标志wire conv_done; //数据转换完毕的标志//计时器参数//以下参数值按50MHz时钟计算parameter CLK_DIV_VALUE = 31; //ADC时钟计数器(大于404nS)计数值parameter CLK_DIV_BITS = 5; //ADC时钟计数器位宽//状态机M1状态参数表parameter idle = 3'b000,adc_ready = 3'b001,adc_receive = 3'b011,adc_conversion = 3'b010,adc_data_load = 3'b110;//I/O寄存器输出assign adc_clk = adc_clk_r;assign cs_n = cs_n_r;assign data_out = data_out_r;assign data_ready = data_ready_r;//同步输入数据信号always @(posedge clock)beginsdat_in_r <= sdat_in;end //时钟分频计数器always @(posedge clock)beginif (reset == 1'b1)clk_count <= 5'd0;elsebeginif (clk_count < CLK_DIV_VALUE) beginclk_count <= clk_count + 1'b1;div_clk <= 1'b0;endelsebeginclk_count <= 5'd0;div_clk <= 1'b1;endendend //状态机ADCalways @(posedge clock)beginif (reset == 1'b1)adc_state <= idle;elseadc_state <= adc_next_state;end//ADC状态机转换逻辑always @(adc_state or ready_done or rec_done or conv_done or enable) begin//cs_n_r = 1'b0;bit_count_rst = 1'b0;data_ready_r = 1'b0;case (adc_state)idle: //初始状态begincs_n_r= 1'b0;bit_count_rst= 1'b1; //复位移位计数器 if (enable == 1'b1)adc_next_state = adc_ready;elseadc_next_state= idle;endadc_ready: //准备接收beginif(ready_done == 1'b1)adc_next_state = adc_receive;elseadc_next_state = adc_ready;endadc_receive: //接收数据beginif(rec_done == 1'b1)adc_next_state = adc_conversion;elseadc_next_state = adc_receive;endadc_conversion: //转换前的采样的数据begincs_n_r = 1'b1;if(conv_done == 1'b1)adc_next_state = adc_data_load;elseadc_next_state = adc_conversion;endadc_data_load:begindata_ready_r = 1'b1; //数据输出标志adc_next_state = idle;enddefault : adc_next_state = idle;endcaseend//位移位计数器always @(posedge clock)beginif (reset == 1'b1)bit_count <= 6'd0;else if (bit_count_rst == 1'b1)bit_count <= 6'd0;else if (div_clk == 1'b1)bit_count <= bit_count + 1'b1;endassign ready_done = (bit_count == 6'd4); //准备读取数据assign rec_done = (bit_count == 6'd19); //接收数据完毕assign conv_done = (bit_count == 6'd63); //ADC转换完毕//在接收位计数器4-20间8个adc clkalways @(bit_count)beginif ((bit_count < 6'd20) && (bit_count >= 6'd4))adc_clk_r <= ~bit_count[0];elseadc_clk_r <= 1'b0;endalways @(posedge clock)beginbuf1 <= adc_clk_r;buf2 <= buf1;end//读取数据always @(posedge clock)beginif(buf1 && ~buf2) //ADC时钟上升沿q <= {q[6:0],sdat_in_r};else if(data_ready_r == 1'b1) //输出读取的数据data_out_r <= q;endendmodule3.新建一个工程及进行工程设置4.打开并建立新工程管理窗口。
实验四 串行AD转换实验
南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□√设计□创新实验日期:实验成绩:实验四串行A/D 转换实验一、实验目的1.熟悉八位串行AD转换器TLC549的性能及转换过程。
2.掌握单片机和TLC549硬件联接及软件编程。
二、实验内容使用TLC549 实现单片机模数转换。
模拟信号为0~5V 电位器分压输出,单片机读取模拟信号,并在数码管上用十六进制形式显示出来。
三、实验要求根据实验内容编写一个程序,并在实验仪上调试和验证。
四、实验说明和电路原理图TLC549是一种采用8位逐次逼近式工作的A/D转换器。
内部包含系统时钟、采样和保持、8 位A/D转换器、数据寄存器以及控制逻辑电路。
TLC549每25uS重复一次“输入——转换——输出”。
器件有两个控制输入:I/O CLOCK和片选(CS)。
内部系统时钟和I/O CLOCK可独立使用。
应用电路的设计只需利用I/O时钟启动转换或读出转换结果。
当CS为高电平时,DA TA OUT处于高阻态且I/O时钟被禁止。
当CS变为低电平时,前次转换结果的᳔高有效位(MSB)开始出现在DA TA OUT端。
在接下来的7个I/O CLOCK周期的下降沿输出前次转换结果的后7位,至此8位数据已经输出。
然后再将第8 个时钟周期加至I/O CLOCK,此时钟周期的下跳沿变使芯片进行下一轮的AD 转换。
在第8个I/O CLOCK周期之后,CS必须变为高电平,并且保持高电平直至转换结束为止(>17uS),否则CS的有效高电平至低电平的转换将引起复位(其它详细资料看芯片说明)。
本实验需要用到CPU 模块(F3 区)、电位器模块(E2 区)、串行模数转换模块(D5 区)、串行静态数码显示模块(B4 区)。
TLC549 串行模数转换电路原理参见下图。
串行模数转换电路图四、实验步骤1)系统各跳线器处在初始设置状态。
用导线对应连接串行模数转换模块的CS_549、DATA、CLK 到CPU 模块的P12、P10、P11;电位器模块的输出端接串行模数转换模块的AIN;CPU 模块的P16、P17 接串行静态数码显示模块DIN、CLK。
串行模数转换TLC549实验C程序
// 实验三十七串行模数转换TLC549实验// CS40接YS0,P1.4接CLK,P1.5接DOUT,P1.6接CS18,AIN接Yout1#include <reg52.h> // 引用标准库的头文件#include <intrins.h>#define uchar unsigned char#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(5);Pos >>= 1; // 显示下一位}OUTBIT = 0; // 关所有八段管}uchar DataResult; // 存放转换后数据sbit IOCLK = P1^4; // 输入输出时钟I/O CLKsbit DATAOUT = P1^5; // 数据输出DATA OUT sbit CS = P1^6; // 片选信号void readad(void){uchar count,tmp,i;tmp = 0;CS = 1; // /CS置高,片选无效IOCLK = 0; // I/O CLK置低CS = 0; // 片选有效_nop_(); // 执行一步空指令起到延时至少1.4us的作用for (count=0;count<8;count++){IOCLK = 1; // I/O CLOCK置高if (DATAOUT)tmp++;tmp = tmp<<1; // 左移一位IOCLK = 0; // I/O CLOCK置低}CS = 1; // /CS置高,片选无效DataResult = tmp;for(i=0;i<3;i++) // 适当延时超过17us_nop_();}void main(){unsigned char j;while(1) {LEDBuf[0] = 0X00;LEDBuf[1] = 0X6d;LEDBuf[2] = 0X66;LEDBuf[3] = 0X6F;LEDBuf[4] = 0X00;LEDBuf[5] = 0X00;readad();LEDBuf[5] = LEDMAP[DataResult & 0x0f] ;LEDBuf[4] = LEDMAP[DataResult>>4 & 0x0f] ;for(j=0; j<5; j++)DisplayLED(); // 延时}}。
串行AD转换器TLC549的应用设计
课程设计任务书题目串行AD转换器TLC549的应用设计系(部) 信息科学与电气工程学院专业电子信息工程班级电信091班学生姓名王凤娟学号09081924512 月26 日至12 月30 日共 1 周指导教师(签字)系主任(签字)2011年12 月30 日摘要本次课程设计的主要目的,就是通过应用8位串行模数转换器TLC549采集电压信号,并进行AD转换,转换成数字信号传送给51单片机,在单片机内部通过编写程序进行数据处理,最后通过单片机的I/O口控制芯片74LS164显示出所采集的电压大小,另外利用键盘控制电压大小的上下限,也即量程,如果超出上下限,则指示灯发光。
关键字:TLC549 AD转换74LS164 量程AbstractIn this class, the design of the main purpose, is through the application of eight serial adc voltage signal collection of eight bits, and AD transform, converted into digital signals to 51 single-chip microcomputer, the microcontroller internal by writing program data processing, the last through the single-chip microcomputer of I/O mouth control chip 74 LS164 shows which collection of voltage size, in addition to use the keyboard control voltage size the upper and lower limits that range, if exceeded the upper and lower limits of the indicator light to shine.Key words:TLC549eight bits AD transform 74 LS164 range目录摘要............................................................................................................... 错误!未定义书签。
微机原理与接口实验—TLC549 8位串行AD
数字地与模拟地
正确的接地 AGND DGND
小电流 Z
大电流 Z
数字地对模拟地产生干扰
AGND DGND
小电流
大电流
Z
Z
工作时序
先读出前一次转换结果后,再进行本次转换
控制时序
1动. 将将本C次S置转低换。结内果部的电最路高在位测(D得7)C位S输下出降到沿D后A,TA等O待UteTn端后上自。 2. 前四个IO_CLOCK 周期的下降沿依次移出第2、3、4 和第5 个位(D6、D5、D4、D3),片上采样保持电路在第4 个IO_CLOCK 下降沿开始采样模拟输入。 3. 接下来的3个IO_CLOCK 周期的下降沿移出第6、7、 8(D2、D1、D0)个转换位。 4. 最后,片上采样保持电路在第8个I/O CLOCK 周期的下 降沿后,开始A/D转换。第8个IO_CLOCK后,CS 必须为 高等待,保或持IO和_C转LO换C工K作保的持完低成电。平,这种状态需要维持tconv以
实验箱原理图
PAD_AD_CLK1 PAD_AD_REF 3 2
I/O CLK REF+ REFANLG IN
VCC DO
8 6
4 GND
CS 5
TLC549CP
VCC
J16 C17 104
GND R49 1K
PAD_AD_DO1 PAD_AD_~CS1
实验目的
学习使用串行模数转换芯片TLC549进 行电压采集和数据处理。
实验内容
1. REF+连基准源的+5V(通过可调电阻调整),CLK、 DAT和-CS分别连P10、P11和P12。D2区电位器的输出 连ANIN。通过单片机P1口控制串行AD转换芯片TLC549 实现模拟电压信号的采集,并存入内部数据存储器。记录 10组不同的电压转换值,并分析误差。
实验四
实验四
实验4,编程简单电压表
1,实验目的
1,熟悉模数转换原理和模数转换芯片TLC549的使用;2.进一步熟悉SPI接口芯片的编程;
3,掌握简易测量仪器程序的总体结构和程序设计
2台,实验设备
1台,计算机;
2,KEILC51集成开发环境和STC _ ISP _ V2.5下载软件;
3.STC89C52RC实验板
3,实验内容和步骤
根据实验板的硬件实现测量电压的功能,即简单电压表(注:见实验板A/D子系统教案3.5节)。
要求:测量的电压范围为0~3.0V,电压值用数码管显示,小数点后一位用伏特(v)表示
4,预览报告要求
1,绘制程序流程图,说明工作原理2,给出程序代码
5,实验报告要求
1,实验目的2,实验设备
3,实验内容和步骤。
在编写C51语言源文件时,需要画出程序的流程图,解释原理并给出源程序实验结果需要在程序执行后给出。
(4)实验总结并讨论了以下问题
a)模数转换原理;(b)使用tlc549
c)简易测量仪器程序的一般结构
6,评分标准
评分依据:预习报告、实验能力(动手能力、实验态度等)),实验报告。
FPGA AD_TLC549实验
/******************************************** *程序名称:AD_TLC549实验*主要功能:将测量的电压值显示在LCD1602上*说明:*作者:JZHG*时间:2012-05-12*版本:JZHG-V2.3********************************************/module Top_Module (clk,rst_n,AD_DO,AD_CS,AD_CLK,RS,EN,DO);//----------------------------------------// Define PORTinput clk; // Clockinput rst_n; // Resetinput AD_DO;output AD_CS;output AD_CLK;output RS;output EN;output[ 7:0 ] DO;//----------------------------------------// TLC549 Modulewire[ 7:0 ] AD_data;TLC549_Module U1(.clk( clk ),.rst_n( rst_n ),.AD_DO( AD_DO ),.AD_CS( AD_CS ),.AD_CLK( AD_CLK ),.AD_data( AD_data ));//----------------------------------------// Data Dispose Modulewire[ 23:0 ] data_out;Data_Dispose_Module U2( .clk( clk ),.rst_n( rst_n ),.data_in( AD_data ),.data_out( data_out ));//----------------------------------------// LCD1602 ModuleLCD1602_Module U3(.clk( clk ),.rst_n( rst_n ),.LCD_data( data_out),.RS( RS ),.EN( EN ),.DO( DO ));//------------------------------------------endmodule/************************************************************ TLC549 Module ********************************************************/module TLC549_Module (clk,rst_n,AD_DO,AD_CS,AD_CLK,AD_data);//----------------------------------------// Define PORTinput clk; // Clockinput rst_n; // Resetinput AD_DO;output AD_CS;output AD_CLK;output[ 7:0 ] AD_data;//----------------------------------------// SET AD CLockreg[ 5:0 ] cnt;reg clk_1;always @ ( posedge clk or negedge rst_n )if ( !rst_n ) begincnt <= 6'd0;clk_1 <= 1'b0;endelse if ( cnt <= 6'd50 ) cnt <= cnt + 1'b1; // T = 2us else begincnt <= 6'd0;clk_1 <= ~ clk_1;end//--------------------------------------------// Delayreg[ 4:0 ] T;always @ ( negedge clk_1 or negedge rst_n )if ( !rst_n ) T <= 5'd0;else T <= T + 1'b1;//---------------------------------------------// Read Datareg CS_r;reg CLK_r;reg[ 7:0 ] data_r;reg[ 7:0 ] BUF;always @ ( posedge clk_1 or negedge rst_n )if ( !rst_n ) beginCS_r <= 1'b1;CLK_r <= 1'b0;data_r <= 8'd0;BUF <= 8'd0;endelsecase ( T )0, 1:begin CS_r <= 1'b0; CLK_r <= 1'b0; end2, 3, 4, 5, 6, 7, 8, 9:begin CLK_r <= 1'b1; data_r[0] <= AD_DO; data_r[ 7:1 ] <= data_r[ 6:0 ]; enddefault: begin CS_r <= 1'b1; CLK_r <= 1'b0; BUF <= data_r; end endcase//-----------------------------------------assign AD_CS = CS_r;assign AD_CLK = CLK_r ? clk_1 : 1'b0;assign AD_data = BUF;//-----------------------------------------Endmodule/******************************************** ************* Data dispose Module ******************************************************/module Data_Dispose_Module ( clk,rst_n,data_in,data_out);//----------------------------------------//Define PORTinput clk;input rst_n;input[ 7:0 ] data_in;output[ 23:0 ] data_out;//---------------------------------------// Data * 100reg[ 31:0 ] temp;always @ ( posedge clk or negedge rst_n )if ( !rst_n ) temp <= 8'd0;else temp <= data_in * 100/( 95 );//---------------------------------------// Data Disposereg[ 31:0 ] bai;reg[ 31:0 ] shi;reg[ 31:0 ] ge;always @ ( posedge clk or negedge rst_n )if ( !rst_n ) beginbai <= 32'd0;shi <= 32'd0;ge <= 32'd0;endelse beginbai <= temp / 100 + "0";shi <= temp % 100 /10 + "0";ge <= temp % 10 + "0";end//-----------------------------------------assign data_out = { bai[ 7:0 ], shi[ 7:0 ], ge[ 7:0 ]};//-----------------------------------------endmodule/******************************************** *************** LCD1602 Module ************* ********************************************/module LCD1602_Module (clk,rst_n,LCD_data,RS,EN,DO);//-------------------------------------------// Define PORTinput clk; // Clockinput rst_n; // Resetinput[ 23:0 ] LCD_data;output RS;output EN;output[ 7:0 ] DO;//-------------------------------------------// Set LCD1602 Clockreg[ 15:0 ] cnt;reg LCD_clk;always @ ( posedge clk or negedge rst_n )if ( !rst_n ) begin cnt <= 16'd0; LCD_clk <= 1'b0; endelse if ( cnt <= 16'd50_000 ) cnt <= cnt + 1'b1; // T = 2mselse begincnt <= 16'd0;LCD_clk <= ~LCD_clk;end//-------------------------------------------reg[ 3:0 ] i;reg RS_r;reg EN_r;reg[ 7:0 ] DO_r;always @ ( posedge LCD_clk or negedge rst_n )if ( !rst_n ) begini <= 4'd0;RS_r <= 1'b0;EN_r <= 1'b0;DO_r <= 8'd0;endelsecase ( i )//=====================// Init LCD0:begin EN_r <= 1'b1; RS_r <= 1'b0; DO_r <= 8'h38; i <= i + 1'b1; end1:begin RS_r <= 1'b0; DO_r <= 8'h08; i <= i + 1'b1; end2:begin RS_r <= 1'b0; DO_r <= 8'h01; i <= i + 1'b1; end3:begin RS_r <= 1'b0; DO_r <= 8'h06; i <= i + 1'b1; end4:begin RS_r <= 1'b0; DO_r <= 8'h0C; i <= i + 1'b1; end//========================// Write DA TA5:begin RS_r <= 1'b0; DO_r <= 8'h80; i <= i + 1'b1; end // write addr6:begin RS_r <= 1'b1; DO_r <= LCD_data[ 23:16 ]; i <= i + 1'b1; end // write data7:begin RS_r <= 1'b0; DO_r <= 8'h81; i <= i + 1'b1; end // write addr8:begin RS_r <= 1'b1; DO_r <= "."; i <= i + 1'b1; end // write data9:begin RS_r <= 1'b0; DO_r <= 8'h82; i <= i + 1'b1; end // write addr10:begin RS_r <= 1'b1; DO_r <= LCD_data[ 15:8 ]; i <= i + 1'b1; end // write data11:begin RS_r <= 1'b0; DO_r <= 8'h83; i <= i + 1'b1; end // write addr12:begin RS_r <= 1'b1; DO_r <= LCD_data[ 7:0 ]; i <= i + 1'b1; end // write data13:begin RS_r <= 1'b0; DO_r <= 8'h84; i <= i + 1'b1; end // write addr14:begin RS_r <= 1'b1; DO_r <= "v"; i <= 4'd5; end // write data//==========================endcase//-------------------------------------------assign RS = RS_r;assign EN = EN_r ? LCD_clk : 1'b0;assign DO = DO_r;//------------------------------------------- endmodule。
TLC549实验报告
六
本实验流程图
MCU
液晶 TLC549 模拟量
七
本实验程序代码
/************************************ *文件名:tlc549驱动程序 *功 能:tlc549采集模拟电压并于液晶上显示大小 *作 者:刘烈报 *单 位:湖南理工物电系创新基地 * All rights reseverd *开始时间:2009.08.6 *结束时间:2009.08.6 *版本信息: * *注 备: **************************************/ #include <intrins.h> #include <reg52.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar getdata,PSB; uchar code table0[]="TLC549"; uchar code table[]="输入电压:"; /************************* TLC549配制 **************************/ sbit tlc_clk = P3^6; sbit tlc_data = P3^5; sbit tlc_cs = P3^4; /*********************************************** 液晶的配置 ************************************************/ #define DATABUS P0 sbit RS_LCD = P2^0; sbit RW_LCD = P2^1; sbit E_LCD = P2^2; /***********************************************
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A/D芯片TLC549的转换与数据采集实验
1、实验目的
(1) 掌握A/D转换与单片机的接口方法;
(2)掌握A/D芯片TLC549的编程方法;
(3)掌握数据采集程序的设计方法;
2、实验内容
利用实验开发装置上的TLC549做A/D转换器,对电位器提供的模拟电压信号进行定时采样,结果在数码管上进行显示。
3、I/O地址
A/D转换芯片 TLC549
CLK P1.5 时钟位
DAT P1.7 数据位
CS P1.6 选片位
4、实验线路
将TLC549的CLK接P1.5、DAT接P1.7、CS接P1.6,将模拟电压输入端连到电位器的电压输出端,并接万用表进行输入电压测量。
5、实验步骤
在PC机输入源程序并汇编,然后下载到单片机上,进行调试。
调节电位器,电压从0V到5V变化,记录数码管的显示数值。
记录到表中。
6、实验报告
(1) 整理好实验程序和实验记录,进行数据处理分析并做图。
(2) 数据采集中,如何实现精确的定时数据采集?
(3) 数码管动态扫描显示程序设计中,显示刷新的时间如何确定?
TLC549实验程序
#include "reg52.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***************************************************
TLC549 A/D转换
****************************************************/
sbit CLK=P1^5;
sbit DAT=P1^7;
sbit CS =P1^6;
uchar TLC549ADC(void)
{
uchar i,x;
CLK=0; DAT=1; CS=0;
for(i=0;i<8;i++)
{
CLK=1;
x<<=1;
if(DAT==1) x++;
CLK=0;
}
CS=1;
return (x);
}
uint y;
uchar x;
void main()
{
while(1)
{
y=TLC549ADC();
y=y*250/128;
P3=y/100;
P2=y%10+((y/10)%10)*16;
}
}。