AD转换TLC2543的C小程序
单片机AD转换程序
![单片机AD转换程序](https://img.taocdn.com/s3/m/27d1261f591b6bd97f192279168884868762b803.png)
《MAIN》;====变量及常数定义段====#include "VARDFN.ASM";添加变量等定义模块;===============ORG 0000HLJMP MAINORG 0003HLJMP INTERUPT_0 ;转外部中断0服务子程序ORG 0030HMAIN:#include "INITIAL.ASM";添加初始化模块MOV IE,#81HSETB TCON.0 ;设置下降沿触发外部中断0 CLR RESET;延时:(((2*R6+3)*R7+3)*R5);约为R5*2.5ms DELAY: ;延时((2*R7+3)*R6+5)*R5≈0.5SMOV R5,#200DL00: MOV R6,#05DL01: MOV R7,#250DL02:DJNZ R7,DL02DJNZ R6,DL01DJNZ R5,DL00SETB RESETMOV STA,#21H ;选择时钟寄存器,通道2LCALL WRITE7705MOV STA,#09H ;25Hz的转换频率LCALL WRITE7705MOV STA,#11H ;选择设置寄存器LCALL WRITE7705MOV STA,#6EH ;自校准模式,增益为32 LCALL WRITE7705; JB P3.2,$ ;等DRDY变低MLOOP:JNB TF0,$ ;4mS到?CLR TF0 ;清定时标志MOV TH0,#0F0H ;4mS定时重设MOV TL0,#60HLCALL RDKEY ;调用读键状态及去抖处理JNB EK14,CF0MOV MSTA,#01HCF0:MOV A,MSTA ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#MTABJMP @A+DPTRMTAB: AJMP WORK0 ;转移到显示重量模块AJMP WORK1 ;转移到单价赋值模块AJMP WORK2 ;转移到查询模块AJMP WORK0 ;冗余;====显示重量模块====WORK0:;LCALL INIT7705;MOV STA,#38H;LCALL WRITE7705;LCALL READ7705;MOV R7,AD_GAO;MOV R6,AD_DI;MOV R5,#0C3H;MOV R4,#50H;MOV R0,#ZHUANH0;LCALL MUL1MOV R7,ZHUANH3MOV R6,ZHUANH3MOV R5,#00HMOV R4,XISHUMOV R0,#YALILCALL MUL1;=====压力转重量转电压待处理YALI ===AJMP MLOOP;====单价赋值模块====WORK1:MOV A,XIAOSHU ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#WWK11JMP @A+DPTRWWK11: AJMP WRK0 ;AJMP WRK1 ;AJMP WRK2 ;AJMP WRK3WRK0:MOV COM,#93HLCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK1:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK2:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK3:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#20HLCALL WCODEAJMP XIAO_ZXIAO_Z:JNB EK13,LPP0MOV A,XIAOSHUINC AANL A,#03HMOV XIAOSHU,A; MOV A,XIAOSHUCLR AMOV DSB0,AMOV DSB1,AMOV DSB2,AMOV DSB3,ALPP0:CLR A ;查询"0"键JB EK0,WK12INC A ;查询"1"键JB EK1,WK12INC AJB EK2,WK12INC AJB EK3,WK12INC AJB EK4,WK12INC AJB EK5,WK12INC AJB EK6,WK12INC AJB EK7,WK12INC AJB EK8,WK12INC A ;查询"9"键JNB EK9,WOOKWK12:MOV DSB,AMOV A,ANJ_ZHI ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#WWKJMP @A+DPTRWWK: AJMP WOK0 ;AJMP WOK1 ;AJMP WOK2 ;AJMP WOK3WOK0:MOV A,DSBMOV DSB0,AAJMP WOOKWOK1:MOV A,DSBMOV DSB1,AAJMP WOOKWOK2:MOV A,DSBMOV DSB2,AAJMP WOOKWOK3:MOV A,DSBMOV DSB3,AAJMP WOOKWOOK:JNB EK11,KKL0 ;是否有11按键,有的话,切换位MOV A,ANJ_ZHIINC AANL A,#03HMOV ANJ_ZHI,AKKL0:JNB EK12,KKL1 ;判断是否有12按键,有的话跳到模块02HMOV MSTA,#02HKKL1:AJMP MLOOP;====查询模块====WORK2:AJMP MLOOP;====外部中断0服务子程序====INTERUPT_0:PUSH ACCPUSH PSWCLR IE0MOV STA,#39HLCALL WRITE7705LCALL READ7705NOPNOPNOPNOPNOPMOV STA,#11HLCALL WRITE7705MOV STA,#6EHLCALL WRITE7705POP PSWPOP ACCRETI;====通用子程序段====#include "RDKEY.ASM";添加读键状态及去抖处理子程序#include "YJINITIAL.ASM" ;添加液晶12864动态扫描显示子程序#include "AD7705.ASM"#include "SUANFA.ASM"END;AD7705子程序清单:;------------Iint7705-------------;初始化AD7705;------------WRITE7705-------------;输出一个字节到7705WRITE7705:MOV R0,#08HCLR CSSETB RESETW7705:CLR SCLKMOV A,STARLC AMOV DIN,CSETB SCLKDJNZ R0,W7705SETB CSRET;------------READ7705-------------;读7705的转换结果READ7705:; JB P3.2,$ ;等DRDY变低CLR CSMOV R0,#08HR751:CLR SCLKSETB SCLKMOV C,DOUTRLC ADJNZ R0,R751MOV AD_GAO,A ;保存高位字节R752:SETB SCLKMOV C,DOUTRLC ADJNZ R0,R752MOV AD_DI,A ;保存低位字节SETB CSRET====变量定义段====;AD7705变量SCLK BIT P3.0CS BIT P3.1RESET BIT P3.3DIN BIT P3.4DOUT BIT P3.5DRTY BIT P3.2;LCD变量SCLK0 BIT P2.5 ;液晶(E)位选--串行口时钟信号CS0 BIT P2.3 ;液晶(RS)位选--串行口片选信号SID BIT P2.4 ;液晶(R/W)位选--串行口数据信号ROW0 BIT P1.4 ;K0~3键列选择ROW1 BIT P1.5 ;K4~7键列选择ROW2 BIT P1.6 ;K8~11键列选择ROW3 BIT P1.7 ;K12~15键列选择KEY1 EQU 21H ;键状态字KEY2 EQU 22HK0 BIT KEY1.0 ;K0键K1 BIT KEY1.1 ;K1键K2 BIT KEY1.2 ;K2键K3 BIT KEY1.3 ;K3键K4 BIT KEY1.4 ;K4键K5 BIT KEY1.5 ;K5键K6 BIT KEY1.6 ;K6键K7 BIT KEY1.7 ;K7键K8 BIT KEY2.0 ;K8键K9 BIT KEY2.1 ;K9键K10 BIT KEY2.2 ;K10键K11 BIT KEY2.3 ;K11键K12 BIT KEY2.4 ;K12键K13 BIT KEY2.5 ;K13键K14 BIT KEY2.6 ;K14键K15 BIT KEY2.7 ;K15键EKEY1 EQU 23H ;键前沿字EKEY2 EQU 24HEK0 BIT EKEY1.0 ;K0键前沿EK1 BIT EKEY1.1 ;K1键前沿EK2 BIT EKEY1.2 ;K2键前沿EK3 BIT EKEY1.3 ;K3键前沿EK4 BIT EKEY1.4 ;K4键前沿EK5 BIT EKEY1.5 ;K5键前沿EK6 BIT EKEY1.6 ;K6键前沿EK7 BIT EKEY1.7 ;K7键前沿EK8 BIT EKEY2.0 ;K8键前沿EK9 BIT EKEY2.1 ;K9键前沿EK10 BIT EKEY2.2 ;K10键前沿EK11 BIT EKEY2.3 ;K11键前沿EK12 BIT EKEY2.4 ;K12键前沿EK13 BIT EKEY2.5 ;K13键前沿EK14 BIT EKEY2.6 ;K14键前沿EK15 BIT EKEY2.7 ;K15键前沿COM EQU 30H ;控制字暂存单元--液晶DAT1 EQU 31H ;显示数据暂存单元1--液晶DAT2 EQU 32H ;显示数据暂存单元2--液晶CODER EQU 33H ;字符代码暂存单元--液晶ADDR EQU 34H ;地址暂存单元---液晶KTMR EQU 35H ;键去抖延时器STA EQU 36H ;模块状态值AD_GAO EQU 37HAD_DI EQU 38HFNUM0 EQU 39H ;数据1(双字节压缩BCD码) FNUM1 EQU 3AHSNUM0 E QU 3BH ;数据2(双字节压缩BCD码) SNUM1 E QU 3CHMSTA EQU 3DHZHUANH0 EQU 40HZHUANH1 EQU 41HZHUANH2 EQU 42HZHUANH3 EQU 43HYALI EQU 44HXISHU EQU 45HXIAOSHU EQU 50HDSB EQU 51HDSB0 EQU 52HDSB1 EQU 53HDSB2 EQU 54HDSB3 EQU 55HANJ_ZHI EQU 56H;====常数定义段====;==================。
11通道tlv2543ad转换通过外部按键中断选择通道
![11通道tlv2543ad转换通过外部按键中断选择通道](https://img.taocdn.com/s3/m/d58f9f2e4b35eefdc8d3336c.png)
#include<reg52.h>#include<intrins.h>#include<math.h>#define uchar unsigned char#define uint unsigned int/****************端口定义******************/sbit clock=P1^0; //sbit d_in=P1^1; //sbit d_out=P1^2; //sbit _cs=P1^3; //sbit lcd_rs=P0^5; //sbit lcd_rw=P0^6; //sbit lcd_e=P0^7; //sbit k2=P3^3;//按键切换ad信号通道//sbit led4=P0^0;//通道2信号灯//sbit led5=P0^1;//通道3信号灯///*****************************************/uchar qian,bai,shi,ge;uchar ss=2,ain=2;//模拟信号通道float sum,sum1;double sum_final1,sum_final;uchar code dis2[]={"0123456789.vf="}; //转换后显示十进制数void delay(uint x) //50us{uint i,j;for(i=x;i>0;i--)for(j=22;j>0;j--);}/******************************ad转换程序*******************************/uint read(uchar port) //{//uchar i,al=0,ah=0; // unsigned long ad; // clock=0; // _cs=0; // port<<=4;//for(i=0;i<4;i++) //将模拟通道地址打入2543 //{//d_in=port&0x80; // clock=1; // clock=0; // port<<=1; // } // d_in=0; //for(i=0;i<8;i++)//8个空周期// { // clock=1; // clock=0; // }//_cs=1;//delay(5); // _cs=0;//for(i=0;i<4;i++)//先读高四位//{//clock=1;//ah<<=1;//if(d_out) ah|=0x01; //clock=0;//}//for(i=0;i<8;i++)//后低8位//{//clock=1; // al<<=1; // if(d_out) al|=0x01; //clock=0;//}//_cs=1;//ad=(uint)ah; // ad<<=8;//ad|=al;//return(ad); // }///************************************************************************//********************lcd程序***************************************************************/uchar busy_date(void) //lcd忙碌检查//{//uchar t=0;//P2=0xff;//lcd_rs=0;//lcd_rw=1;//lcd_e=1;//t=P2;//delay(1);//lcd_e=0;//if((t&0x80)==0x80)//t=1;//else//t=0;//return(t);//}////void write_commond(uchar dat) //向lcd写指令//{//while(busy_date()==1);//P2=dat;//lcd_rs=0;//lcd_rw=0;//lcd_e=1;//lcd_e=0;//delay(1);//}////void lcd_init(void) //lcd初始化//{//write_commond(0x38);//write_commond(0x01);//write_commond(0x0c);//write_commond(0x06);//delay(1);//}////void write_date(uchar dat) //lcd写数据//{//while(busy_date()==1);//P2=dat;//lcd_rs=1;//lcd_rw=0;//lcd_e=1;//lcd_e=0;//delay(1);//}////void dis_date(uchar dat) //lcd显示字符定位//{//write_commond(0x80+dat);//}////void lcd_display(uchar a,uchar b,uchar c,uchar d) //lcd显示转换结果//{//lcd_init();//delay(30);//write_commond(0x06); //lcd命令字//dis_date(0); //第一行第一位显示定位write_date(dis2[11]);delay(100);write_date(dis2[13]);delay(100); // write_date(dis2[a]);//delay(100);//write_date(dis2[10]);//delay(100);//write_date(dis2[b]);//delay(100);//write_date(dis2[c]);//delay(100);//write_date(dis2[d]);//delay(100);write_date(dis2[11]);delay(500);//}///********************************************************************************* *********/void key2_scan() interrupt 2 //使用了外部中断1的键盘扫描子函数{uchar j;if(k2==0) //有键按下吗?(k2=0 ?){delay(20); //延时消抖if(k2==0) //确实是有键按下,则:{ss++;if(ss==5)ss=2;while(!k2); //等待按键放开}}switch(ss)//通过ss计算ain,选择通道{case 2:led4=0;led5=1;ain=2;break;case 3:led4=1;led5=0;ain=3;break;case 4:led4=1;led5=1;ain=4;break;}}void outside_init() //外部中断初始化{EA=1; //开总中断EX1=1; //打开外部中断0IT1=1; //设置为下降沿触发,低电平触发}void main(){uchar j;P1=0xff;led4=0;//初始化通道2sum=0;sum1=0;sum_final1=0;sum_final=0;outside_init();while(1){for(j=0;j<128;j++){sum1+=read(ain);}sum=sum1/128;sum1=0;sum_final1=(sum/4095)*5;//转换成电压值sum_final=sum_final1*1000;//定义精度,小数点后三位qian=(int)sum_final/1000;bai=(int)sum_final%1000/100;shi=(int)sum_final%1000%100/10;ge=(int)sum_final%10;lcd_display(qian,bai,shi,ge);delay(10000);} }。
51单片机ad转换程序解析
![51单片机ad转换程序解析](https://img.taocdn.com/s3/m/662f0832f56527d3240c844769eae009591ba25b.png)
51单片机ad转换程序解析1.引言1.1 概述概述部分旨在介绍本篇文章的主题——51单片机AD转换程序,并对文章的结构和目的进行简要说明。
51单片机是指Intel公司推出的一种单片机芯片,它广泛应用于嵌入式系统中。
而AD转换则是模拟信号转换为数字信号的过程,是嵌入式系统中的重要功能之一。
本文将详细解析51单片机中的AD转换程序。
文章结构分为引言、正文和结论三个部分。
引言部分将给读者介绍本篇文章的内容和结构安排,正文部分将详细讲解51单片机AD转换程序的相关要点,而结论部分将总结正文中各个要点的内容,以便读者能够更好地理解和掌握51单片机AD转换程序的实现原理。
本文的目的在于向读者提供一份对51单片机AD转换程序的详细解析,使读者能够了解51单片机的AD转换功能以及如何在程序中进行相应的设置和操作。
通过本文的学习,读者将掌握如何使用51单片机进行模拟信号的采集和处理,为后续的嵌入式系统设计和开发提供基础。
在下一节中,我们将开始介绍文章的第一个要点,详细讲解51单片机AD转换程序中的相关知识和技巧。
敬请期待!1.2 文章结构文章结构部分主要是对整篇文章的框架和内容进行介绍和归纳,以帮助读者更好地理解文章的组织和内容安排。
本文以"51单片机AD转换程序解析"为主题,结构分为引言、正文和结论三个部分。
引言部分主要包括概述、文章结构和目的三个方面。
首先,通过对单片机AD转换程序的解析,来讲解其实现原理和功能。
其次,介绍文章的结构,帮助读者明确整篇文章的主要内容和组织方式。
再次,阐明文章的目的,即为读者提供关于51单片机AD转换程序的详尽解析和指导,帮助读者深入了解该技术并进行实际应用。
正文部分则分为两个要点,即第一个要点和第二个要点。
第一个要点可以从AD转换的基本概念入手,介绍51单片机AD转换的原理和流程。
包括输入电压的采样、AD转换器的工作原理、ADC的配置和控制等方面的内容。
在此基础上,深入解析51单片机AD转换程序的编写和调用方法,包括编程语言、寄存器的配置、数据的获取和处理等。
TLC2543串行AD转换器内部原理
![TLC2543串行AD转换器内部原理](https://img.taocdn.com/s3/m/7f5892ec4afe04a1b071de10.png)
TLC2543串行A/D转换器模块采用TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源,且价格适中。
其特点有:(1)12位分辨率A/D转换器;(2)在工作温度范围内10μs转换时间;(3)11个模拟输入通道;(4)3路内置自测试方式;(5)采样率为66kbps;(6)线性误差+1LSB(max)(7)有转换结束(EOC)输出;(8)具有单、双极性输出;(9)可编程的MSB或LSB前导;(10)可编程的输出数据长度。
TLC2543的引脚排列如图1所示。
图1中AIN0~AIN10为模拟输入端;为片选端;DIN 为串行数据输入端;DOUT为A/D转换结果的三态串行输出端;EOC为转换结束端;CLK为I/O时钟;REF+为正基准电压端;REF-为负基准电压端;V CC为电源;GND为地TLC2543的使用方法2.1 控制字的格式控制字为从DATAINPUT端串行输入的8位数据,它规定了TLC2543要转换的模拟量通道、转换后的输出数据长度、输出数据的格式。
其中高4位(D7~D4)决定通道号,对于0通道至10通道,该4位分别为0000~1010H,当为1011~1101时,用于对TLC2543的自检,分别测试(V REF++V REF-)/2、V REF-、V REF+的值,当为1110时,TLC2543进入休眠状态。
低4位决定输出数据长度及格式,其中D3、D2决定输出数据长度,01表示输出数据长度为8位,11表示输出数据长度为16位,其他为12位。
D1决定输出数据是高位先送出,还是低位先送出,为0表示高位先送出。
D0决定输出数据是单极性(二进制)还是双极性(2的补码),若为单极性,该位为0,反之为1。
2.2 转换过程上电后,片选CS必须从高到低,才能开始一次工作周期,此时EOC为高,输入数据寄存器被置为0,输出数据寄存器的内容是随机的。
C语言编写的AD转换程序
![C语言编写的AD转换程序](https://img.taocdn.com/s3/m/1e202c7fa88271fe910ef12d2af90242a895ab13.png)
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dat = P2^0; //164数据输入端sbit clk = P2^1; //164 时钟控制端sbit EOC = P2^6; //1543 eocsbit CS = P2^2; //片选sbit CLOCK= P2^5; //1543时钟sbit ADDRESS=P2^4; //1543地址输入端sbit DA TAOUT=P2^3; //1543数据输出端sbit buzz = P2^7; // 报警输出口uchar publicwaring=0; //全局变量,记录报警类型,高、低、缺相。
初值必是0uint idata Edataout[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//全局数组。
记录经滤波、标度变换后的测量通道测量值。
void writeaddress (uchar waddress) //向1543写入地址子程序段{unsigned char i,j;CS=0; CLOCK =0; //关闭时钟,片选waddress=waddress<<4; //移除1543地址数据,应1543是4位故前4位不是有效数据位for (i=0;i<4;i++){ //4次移位循环,写地址到1543ADDRESS=(bit)(waddress&0x80);CLOCK=1;for(j=0;j<10;j++);CLOCK=0;waddress<<=1;}for (i=1;i<7;i++) //因为1543是10个高后开始再次工作。
而地址只有4位{for(j=0;j<10;j++); //所以相1543中填入6个空的高脉冲CLOCK=1;for(j=0;j<10;j++);CLOCK=0;}CS=1;CS=1; EOC=0;}uint readdataout (uint outdata) //1543数据读出子程序{uchar i,j,ap[15];bit outbit7;CS=0; CLOCK =0;outdata=0; //此数据初始必须为0 ,以便其后分离并合并数据for (i=0;i<12;i++){ap[i]=0x00;}for(j=0;j<10;j++){CLOCK=1;for(i=0;i<10;i++);outbit7=(bit)(DA TAOUT);if (outbit7==0){ap[j]= ap[j]&0x00;} //分离读出的数据位,并存入制定地址中if (outbit7==1){ap[j]= ap[j]|0x01;}CLOCK=0;for(i=0;i<10;i++);}CS=1; EOC=0;CS=1; i=7;for(j=2;j<10;j++) //数据的有效移位,得出AD值的低8位的个位的正确位置{ap[j]=ap[j]<<i;outdata=outdata|ap[j]; //合并数据个位得出AD的低8位数据--i;}outdata+=ap[0]*512+ap[1]*256 ; //处理AD高2位,并与低8位合成16位数据return (outdata);}//------------------------------------------------------------------------------------------// 显示程序//---------------------------------------------------------------------------------------------uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc7,0x89,0xc1};//0-9,-,全灭,L,Hvoid sendbyte(uchar byte,uchar m)//0000 0000 --- dp g f e d c b a 段码序列{uchar num,c,i;uchar k=4; //控制小数点位置,1:个位2:十位------------num=tab[byte];if (k==m){num&=0x7f;}for(c=0;c<8;c++){dat=num&0x80;num=num<<1;clk=0;for (i=0;i<20;i++) ;clk=1;for (i=0;i<30;i++) ;}}void display(uint i){ uchar j,k,n,p,x,y,m; //提取报警通道号和报警类型。
C51环境下TLC2543的软件设计
![C51环境下TLC2543的软件设计](https://img.taocdn.com/s3/m/5a4f1142be1e650e52ea994a.png)
图 1 TLC2543与 51系列单片机的连接
输出口 SP I_D ataOu;t P1. 4模拟 SP I数据输入口 SP I_DataIn; P1. 2模拟 SP I时钟端。
TLC2543输入寄存器包括一个 4位模拟通道地址 ( D7~ D4) 、一个 2位数据长度选择 ( D3~ D2)、一个选
D JN Z R 4, Sub _ADCPro_01
MOV R 7, A
; 所读低 8 位数据存于 R 7。
MOV A, R 2
; 判断是否是首次读数据。
JZ Sub _A DCPro_03
SETB TLC2543 _CS
CLR SPI_C lock MOV R 4, # 4
; 将数据整理为 ( R 6 - 0000, XXX X B R 7- XX XX, XXXX B) 格式。
MOV R 4, # 08H
; 读取 8 位数据。
101
图 2 TLC2543 读写流程图
10 2
山东科 学
201 0 年
Sub_AD CPro_01: MOV C, SPI_D ataIn
R LC A
MOV SPI_D ataO ut, C
SETB SPI_C lock
CLR SPI_C lock
1 系统设计
1. 1 硬件设计
TLC2543与 51 系 列单 片机 的连 接 如图 1 所 示。
AT 89C52为 A tm el公司生产的 51系列单片机, 通过 P1
口的引 脚与 TLC2543连接, 软件通过模 拟 SP I接 口与
TLC2543 进 行 通 讯。 基 准 电 压 源 芯 片 LM 336 为
单片机模拟的 SPI数据输入口。
单片机实验(AD转换)
![单片机实验(AD转换)](https://img.taocdn.com/s3/m/1d7a9694960590c69ec37685.png)
实验三 A/D、D/A转换实验一、实验目的1.熟悉DAC0832并行接口数模转换器和TLC2543串行接口模数转换器的基本原理和编程方法。
2.进一步熟悉单片机应用系统开发步骤和方法。
二、实验电路实验所用元件清单如下表所示:1. 串行A/D转换器TLC25432.并行D/A转换器DA0832三、相关知识(一)串行A/D转换器TLC25431. TLC2543的特性与引脚TLC2543是TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省80C51系列单片机的I/O资源,而且价格适中。
主要特点如下:●12位分辨率A/D转换器。
●在工作温度范围内10 s转换时间。
●11个模拟输入通道。
●3路内置自测试方式。
●采样率为66kbps。
●线性误差+1LSB(max)。
●有转换结束(EOC)输出。
●具有单、双极性输出。
●可编程的MSB或LSB前导。
●可编程的输出数据长度。
2. TLC2543的工作过程TLC2543的工作过程分为两个周期:I/O 周期和实际转换周期。
1)I/O周期I/O周期由外部提供的I/O CLOCK定义,延续8、12或16个时钟周期,决定于选定的输出数据长度。
器件进入I/O周期后同时进行两种操作。
(1)在I/O CLOCK的前8个脉冲的上升沿,以MSB前导方式从DA TA INPUT端输入8位数据流到输入寄存器。
其中前4位为模拟通道地址,控制14通道模拟多路器从11个模拟输入和3个内部自测电压中,选通一路送到采样保持电路,该电路从第4个I/O CLOCK脉冲的下降沿开始,对所选信号进行采样,直到最后一个I/O CLOCK脉冲的下降沿。
I/O周期的时钟脉冲个数与输出数据长度(位数)有关,输出数据长度由输入数据的D3、D2选择为8、12或16位。
当工作于12或16位时,在前8个时钟脉冲之后,DATA INPUT无效。
(2)在DATA OUT端串行输出8、12或16位数据。
TLC2543TLC1543
![TLC2543TLC1543](https://img.taocdn.com/s3/m/67385ac5250c844769eae009581b6bd97f19bc25.png)
TLC2543TLC1543 12位10位AD数据转换时序图:下降沿输出数据,上升沿输⼊地址CS⽚选拉低,⼀次转换开始,同时输出上次转换的数据时序使⽤⽅法:1、CS⽚选拉⾼,EOC拉⾼,CLK时钟拉低2、CS⽚选拉低,开始读出第⼀位数据3、在第⼀个时钟上升沿,输⼊⼀个地址数据4、之后在每个时钟的下降沿输出AD转换数据,在上升沿输⼊地址数据5、TLC1543是10位AD,因此有10个时钟,TLC2543是位AD,因此有12个时钟6、⼀个操作过程结束后,⽚选CS拉⾼,EOC会在最后第10个时钟的下降沿触发拉低,开始AD转换,此时,输出被禁⽌,等到转换结束后EOC置位1,代表转换结束。
等到CS⽚选再次拉低,开始第⼆次操作。
TLC1543与单⽚机的连接TLC15433的引脚图A0~A10为11个模拟输⼊通道REF-通常接地REF+接+5v则输⼊可测电压为0~5vcs位⽚选段,低电平有效,不⽤时置1,⽤时保持为0DATAOUT为AD转换数据输出端(10位)ADDRESS为地址输⼊端,可输⼊相关的命令,前四位⽤于选择不同的输⼊通道,如:0000位选择0通道,0001位选择1通道,及数据输出的格式(⾼位先出还是低位先出)。
TLC1543⼦函数uint read1543(void){uchar i=0;uint ad_value=0;TCL2543_CLK=0; //⼀次转换开始前,CS⽚选置1,EOC置1,时钟置0TCL2543_CS=1;EOC=1;delay_1ms(); //保持⼀段时间,拉低CS⽚选TCL2543_CS=0;delay_1ms(); //保持⼀段时间,等数据稳定后再读取第⼀位数据A9(最⾼位)for(i=0;i<10;i++){if(TCL2543_DOUT) ad_value|=0x0001; //读取第⼀位数据TCL2543_DIN=0; //将通道选择数据准备好,上升沿锁存进TLC1543TCL2543_CLK=1; //上升沿delay_1ms(); //保持⼀段时间TCL2543_CLK=0; //下降沿保持⼀段时间,在读取数据delay_1ms();ad_value=ad_value<<1; //移位,将最低位空出,以装⼊第2位数据(A8)}TCL2543_CS=1; //⼀次转换结束后将CS⽚选拉⾼ad_value=ad_value>>1; //由于多左移了1位,所以return ad_value;}。
AD转换程序
![AD转换程序](https://img.taocdn.com/s3/m/9fb2bfb3c77da26925c5b087.png)
基于51单片机德AD转换程序:#include<reg51.H>#define uint unsigned int#define uchar unsigned charsfr ADC_CONTR =0XBC;sfr ADC_RES =0XBD;sfr ADC_LOW2 =0XBE;sfr ADC_LOW2 =0XBE;sfr P1ASF =0X9D;#define ADC_POWER 0X80#define ADC_FLAG 0x10#define ADC_START 0X08#define ADC_SPEEDLL 0X00#define ADC_SPEEDL 0X20#define ADC_SPEEDH 0X40#define ADC_SPEEDHH 0X60sbit CS=P2^0; //LCD12864串行通信片选sbit SID=P2^1; //LCD12864串行通信数据口sbit SCLK=P2^2; //LCD12864串行通信同步时钟信号sbit PSB=P2^5; //LCD12864并/串选择:H并行L串行unsigned int temp1,sh1,ge1,n1,m1;unsigned char ad_result_data[10]; //AD转换高八位unsigned char ad_result_low2[10]; //AD转换低八位unsigned char ad_result_total[10]; //AD转换总十位unsigned char ad_average_result; //AD转换十次的平均值unsigned char Ain,Vin;unsigned char b,t,R;char tp=0;unsigned char code ma1[6]={0xb5,0xe7,0xd1,0xb9,0xa1,0xc3}; //电压: unsigned char code ma2[]={"."};uchar code disp1[]={"提示: 按1 键进入"};uchar code disp2[]={"功能选择界面. "};unsigned char code num0[]={0xa3,0xb0};unsigned char code num1[]={0xa3,0xb1};unsigned char code num2[]={0xa3,0xb2};unsigned char code num3[]={0xa3,0xb3};unsigned char code num4[]={0xa3,0xb4};unsigned char code num5[]={0xa3,0xb5};unsigned char code num6[]={0xa3,0xb6};unsigned char code num7[]={0xa3,0xb7};unsigned char code num8[]={0xa3,0xb8};unsigned char code num9[]={0xa3,0xb9};//-------模块延时程序---------------------------- 1msvoid delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms{uint i,j;for(;delay1ms>0;delay1ms--)for(i=0;i<7;i++)for(j=0;j<210;j++);}void delay(uint delay) //STC11F60XE,22.1184M,延时170us{uint i,j;for(;delay>0;delay--)for(i=0;i<124;i++);for(j=0;j<124;j++);}/*******************************************************AD转换程序*******************************************************/void AD_initiate() //初始化函数{ES=0;TMOD=0x21; //定时计数器方式控制寄存器,"自动重装,16位计数器".SCON=0x50; //串行控制寄存器,方便在串口助手那观察TH1=0xfa;TL1=0xfa;TR1=1;}void ADC_Power_On() //AD转换电{ADC_CONTR|=0x80;delay(5); //必要的延时}void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据{uint i,q=0;for(i=0;i<10;i++){tp=0;ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同ADC_RESL=0; //低两位清零ADC_CONTR|=0x08; //启动AD转换while(!tp) //判断AD转换是否完成{tp=0x10;tp&=ADC_CONTR;}ADC_CONTR&=0xe7;ad_average_result=ADC_RES;q=q+ad_average_result;}ad_average_result=q/10;//ad_average_result=ad_average_result*4*5000/1024;}/************************AD转换结束***********************/void send_ad_result() //取AD结果函数发送到串口,方便调试{SBUF=n1;while(TI==0) ;TI=0;delay1ms(100);//SBUF=R>>4;}//---------------------电压采样程序-------------------------void caiyangP10() //测电压{P1M0|=0x01; //设P1_0为开漏模式如:P1_0= #00000000BP1M1|=0x01;ADC_CONTR=0xe0; //设置P1.0为输入AD转换口delay(2);get_ad_result(); //取转换数据Vin=ad_average_result;R=V in;}/*-----------写控制字到LCD12864------------*/void write_cmd(uchar cmd){uchar i;uchar i_data;i_data=0xf8; //命令控制字:11111000写指令11111010写数据11111100读状态11111110读数据CS=1; //片选置高,才能进行读写操作SCLK=0;/*----------写命令控制字-----------------*/for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令高四位-----------------*/i_data=cmd;i_data=i_data&0xf0; //把低四位置0for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令低四位-----------------*/i_data=cmd;i_data=i_data<<4; //左移四位,把低四位的数据移到高四位,再把低四位置0 for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*-----------------------------------------*/CS=0; //把片选置低delay1ms(5); //延时是因为没有进行忙检测,适当的延时可以不进行忙检测}/*-----------------------------------------*//*------------写数据到LCD12864-------------*/void write_dat(uchar dat){uchar i;uchar i_data;i_data=0xfa;CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data&0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data<<4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;delay1ms(5);}/*-----------------------------------------*//*--------------显示坐标-------------------*/void lcd_pos(uchar x,uchar y) //汉字显示坐标,x为哪一行,y为哪一列{uchar pos;if(x==0)x=0x80; //第一行else if(x==1)x=0x90; //第二行else if(x==2)x=0x88; //第三行else if(x==3)x=0x98; //第四行pos=x+y; //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)write_cmd(pos);}/*-----------------------------------------*//*--------------显示8个汉字-------------------*/void disp_hanzi(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<16;i++) //16列*8个汉字=128(刚好) write_dat(chn[i]);}/*-----------------------------------------*//*--------------显示数字-------------------*/void disp_num(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<2;i++) //1个数字write_dat(chn[i]);}void disp_number(uchar num){switch(num){case 0: disp_num(num0);break;case 1: disp_num(num1);break;case 2: disp_num(num2);break;case 3: disp_num(num3);break;case 4: disp_num(num4);break;case 5: disp_num(num5);break;case 6: disp_num(num6);break;case 7: disp_num(num7);break;case 8: disp_num(num8);break;case 9: disp_num(num9);break;default: break;}}/*----------- --LCD初始化------------------*/void lcd_init(){PSB=0;write_cmd(0x30); //基本指令write_cmd(0x02); //地址归位write_cmd(0x06); //游标右移write_cmd(0x0c); //整体显示write_cmd(0x01); //清屏}/*-----------------------------------------*/void displayP10(){float ad1;//unsigned int temp1,sh1,ge1,n1,m1;//uchar code dis2[]={0x01,0x02,0x00};//ad1=x*7.8125; //电压修正uchar i;ad1=Vin*3.9608; //具体线性参数由输入电压值调整,该值的测量范围为0-10.00V,5V左右的测量比较准确,//两端的最大误差为70mv,其他一般在40mv以内temp1=(int)ad1;sh1=temp1/1000; //十位ge1=(temp1%1000)/100; //个位n1=((temp1%1000)%100)/10; //小数点后一位m1=((temp1%1000)%100)%10; //小数点后二位//write_cmd(0x01);write_cmd(0x30); //基本指令操作方式lcd_pos(0,0);for(i=0;i<6;i++) write_dat(ma1[i]);lcd_pos(0,3);disp_number(sh1);lcd_pos(0,4);disp_number(ge1);lcd_pos(0,5);for(i=0;i<2;i++) write_dat(ma2[i]);lcd_pos(0,6);disp_number(n1);lcd_pos(0,7);disp_number(m1);/*lcd_pos(2,0);disp_hanzi(disp1);lcd_pos(3,0);disp_hanzi(disp2);*/}void main(){EA=1;AD_initiate(); //初始化ADC_Power_On(); //开AD电源//init();lcd_init();delay(10);while(1){caiyangP10(); //测电压send_ad_result();//V in=Vin*4007;displayP10();delay(10);}}。
可用于proteus仿真的用89C52单片机和TLC2543实现三路AD转换的电路图和51C程序
![可用于proteus仿真的用89C52单片机和TLC2543实现三路AD转换的电路图和51C程序](https://img.taocdn.com/s3/m/0026ab18c281e53a5802ff78.png)
见网上有人问到TLC2543多路转换时出现通道之间串位的问题,我也遇到了,例如:输入的是通道0,读的数却是通道1,等等。
我分析了一下,出现问题的原因如下:书上和网上的相关程序很多,但是有一个问题大家可能会遇到,就是读出的数不是想要的通道的数值,我就谈谈这个的问题。
书上印的、网上传的关于TLC2543转换输出12位的子函数的形参大多是uchar型的,如调取子函数:read(uchar port)。
调取子函数时以十六进制表示输入的通道数,如通道0为0x00,通道1为ox10等等,可是子函数里有一条是port<<=4;这让只有八位的uchar port向左移四位之后,原来的包含通道信息的高四位被舍弃,变为原来的低四位,通道数肯定不是你想要的那个通道了。
以uchar为形参,用十六进制表示通道数时去掉port<<=4;才是正确的。
如果你非要加上port<<=4;也可以,此时形参设定为uchar,那你就输入十进制的通道数,如通道0为0,通道1为1,如通道1,写为二进制是0001,那么port就是0000 0001,左移4位正好变为0001 0000,也是对的。
而偏偏有人输入的是十进制的通道数,再加上1条左移,那读出的数肯定就不对了。
如果设定通道变量为uint port,这时port为16位整型,port的高8位都是0,左移4位之后剩下的高4位仍然是0,此时余下的12位加上左移补上的4个0,12位输出的同时正好把前12位同步输入。
这个时候,左移4位这条指令也是必不可少的。
以下给出TLC2543转换三路电压模拟信号,输出12位数字信号的C程序和proteus仿真电路图,希望对需要的人有帮助。
图是由我自己支掉好多程序之后剩下的部分,所以电路图还可以再简单点,如不用或者少用74LS373锁存器,我没简化,直接附上了。
西北农林科技大学李强2012.2.15 #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit ADout=P1^0;sbit ADin=P1^1;sbit CS=P1^2;sbit CLK=P1^3;sbit EOC=P1^4;sbit LE1=P1^6;sbit LE2=P1^7;uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x7c};uchar D=0,wei[]={0xfe,0xfd,0xfb,0xf7,0xdf,0xef};float k,z;uint n;//////////延时子函数void delay(uint us){uchar i;for(i=0;i<us;i++) _nop_();}////////数码管显示子函数void display(uint AD){uchar q,b,s,g; //////千位、百位、十位、个位q=AD/1000;b=AD/100%10;s=AD/10%10;g=AD%10;P0=0xff;LE1=1;P0=wei[0];LE1=0;LE2=1;P0=duan[q];LE2=0;delay(10);P0=0xff;LE1=1;P0=wei[1];LE1=0;LE2=1;P0=duan[b];LE2=0;delay(10);P0=0xff;LE1=1;P0=wei[2];LE1=0;LE2=1;P0=duan[s];LE2=0;delay(10);P0=0xff;LE1=1;P0=wei[3];LE1=0;LE2=1;P0=duan[g];LE2=0;delay(10);}///////TLC2543转换和读取子函数,只转换了三路模拟电压信号。
51单片机AD转换和串口收发子程序代码
![51单片机AD转换和串口收发子程序代码](https://img.taocdn.com/s3/m/828082ed998fcc22bcd10dac.png)
}
单片机控制串口无线收发的子程序代码
/**************************************
SCON^7——SM0,与SM1一起构成串口通信方式选择;
SCON^6——SM1;
SCON^4——REN,允许接收位,1为允许接收;
D_IN=(bit)(port&0x80); //送控制字
CLOCK=1; //上升沿
delay(1);
Ct;<=1; //控制字左移一位(下一循环送控制字下一位)
SCON^1——TI,发送中断标志位,发送结束后由硬件自动置1,复位需软件;
SCON^0——RI,接收中断标志位,接收结束后由硬件自动置1,复位需软件;
PCON^7——SMOD,波特率增倍位,1为增倍,0为不增倍;
IE^7——EA,中断允许总控制位,1为CPU开放中断,0为屏蔽所有中断请求;
TR1=1; //启动定时器1
ES=0; //禁止串行中断
}
/**************************************
名称:send
功能:发送一个字节
输入参数:待发送的字节
输出参数:无
*************************************/
单片机控制A/D转换子程序代码
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
第章SPI与模拟量转换
![第章SPI与模拟量转换](https://img.taocdn.com/s3/m/03220d04998fcc22bcd10deb.png)
第10章SPI与模拟量转换SPI(串行外设接口)是Freescale公司推出的一种同步串行通信接口,用于MCU 和外围扩展芯片之间的串行连接,现已发展成为一种工业标准。
目前,各半导体公司推出了大量的带有SPI接口的芯片,如RAM、EEPROM、Flash ROM、A/D、D/A转换、LED/LCD驱动、I/O接口、实时时钟等。
本章首先讨论SPI及编程方法。
计算机只能处理数字量,对于温度、压力、速度和流量等模拟量必须经过A/D转换才能为计算机所处理。
计算机要干预对外部需要模拟量进行控制的装置,需要通过D/A转换.GP32内部有8路8位A/D转换,没有D/A转换。
本章给出GP32内部A/D 转换的编程方法。
本章随后给出利用MCU的SPI进行12位A/D转换芯片TLC2543及10位D/A芯片的扩充,并给出具体实例。
所给出A/D实例,包含的基本的滤波方法,可以直接应用于实际工程。
对常见传感器的简介,有助于初学者对A/D转换的理解与实践.作为知识积累,还对常用传感器进行了介绍.10.1 SPI的基本工作原理10.1.1 SPI概述串行外设接口(SPI,Serial Peripheral Interfac)是Freescale公司推出的一种同步串行通信接口,用于微处理器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准。
目前,各半导体公司推出了大量的带有SPI接口的具有各种各样功能的芯片,如RAM、EEPROM、Flash ROM、A/D转换器、D/A 转换器、LED/LCD显示驱动器、I/O接口芯片、实时时钟、UART收发器等,为用户的外围扩展提供了极其灵活而价廉的选择.Freescale 08系列MCU中含有串行外设接口模块,它是MCU与外界联系的重要方式之一。
SPI特性描述如下:①全双工。
②主、从工作方式。
③发送和接收的数据寄存器相互独立从而实现双缓存操作。
④主机可以设定4种工作频率(最大可达总线频率的二分之一)。
蓝桥杯单片机的ad转换代码
![蓝桥杯单片机的ad转换代码](https://img.taocdn.com/s3/m/a1d8f45ba31614791711cc7931b765ce04087a61.png)
蓝桥杯单片机的ad转换代码全文共四篇示例,供读者参考第一篇示例:蓝桥杯是全国性的计算机大赛,是中国最具影响力和参与度最高的信息学竞赛之一。
单片机比赛一直是蓝桥杯的重点项目之一。
而在单片机的项目中,AD转换是一个常见的需求,因为在很多实际应用中,我们需要将模拟信号转换为数字信号进行处理。
AD转换(Analog to Digital Conversion)是单片机中一个非常重要的功能模块,它可以将模拟信号转换为数字信号,以便单片机可以对信号进行处理和分析。
在单片机中实现AD转换是一项很有挑战性的任务,需要熟练掌握相关知识和技术。
下面我们来看一段关于蓝桥杯单片机的AD转换代码,以帮助大家更好地理解和掌握这个技术。
```c#include <reg52.h>sbit ADC_CS = P1^0;sbit ADC_CLK = P1^1;sbit ADC_DATA = P1^2;unsigned int ADC_Value; void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();}ADC_CLK = 1;ADC_Value = 0;for(i = 0; i < 10; i++){ADC_CLK = 0;Delay5us();ADC_Value <<= 1;if(ADC_DATA)ADC_Value++;ADC_CLK = 1;}ADC_Value = ADC_Value >> 1;}// 在这里添加对ADC_Value的处理和应用逻辑}}```AD转换在单片机应用中有着广泛的用途,比如温度采集、光强检测、电压测量等等。
掌握好AD转换的原理和代码实现,可以帮助我们更好地设计和开发单片机应用,并在蓝桥杯的比赛中取得更好的成绩。
希望以上内容对大家有所帮助,也希朼大家能够多多实践,不断提升自己在单片机领域的技术水平。
12位TLC2543模数转换总结
![12位TLC2543模数转换总结](https://img.taocdn.com/s3/m/abd0cc731711cc7931b716d5.png)
Lcd_wcd(1,0x2e);
Lcd_wcd(1,0x30+shi);
Lcd_wcd(1,0x30+ge);
Lcd_wcd(1,0x30+xiao);
/*for(i=0;i<SUM;i++)
{
temp1+=redad(0x01);//选择通道1,并读取AD转换的数
GND
地。GND是内部电路的地回路端。除另有说明外,所有电压测量都相对GND而言
18
I/O CLOCK
I
输入/输出时钟端。I/OCLOCK接收串行输入信号并完成以下四个功能:(1)在I/O CLOCK的前8个上升沿,8位输入数据存入输入数据寄存器。(2)在I/OCLOCK的第4个下降沿,被选通的模拟输入电压开始向电容器充电,直到I/OCLOCK的最后一个下降沿为止。(3)将前一次转换数据的其余11位输出到DATA OUT端,在I/OCLOCK的下降沿时数据开始变化。(4)I/OCLOCK的最后一个下降沿,将转换的控制信号传送到内部状态控制位
//uchar code dis1[]={"采集电压:000 v"};
/*************延时**************/
void delay(uint z)
{//一毫秒
uint y;
for(;z>0;z--)
for(y=110;y>0;y--) ;
}
void delay_us(uchar n)//微秒
shi=x/1000%10;
ge=x/100%10;
xiao=x/10%10;
}
/****************主函数****************/
TLC2543中文资料
![TLC2543中文资料](https://img.taocdn.com/s3/m/db8ffd727fd5360cba1adb37.png)
串行A D转换器T L C2543中文资料T L C2543是T I公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源;且价格适中,分辨率较高,因此在仪器仪表中有较为广泛的应用。
2T L C2543的特点(1)12位分辩率A/D转换器;(2)在工作温度范围内10μs转换时间;(3)11个模拟输入通道;(4)3路内置自测试方式;(5)采样率为66k b p s;(6)线性误差±1L S B m a x;(7)有转换结束输出E O C;(8)具有单、双极性输出;(9)可编程的M S B或L S B前导;(10)可编程输出数据长度。
3T L C2543的引脚排列及说明T L C2543有两种封装形式:D B、D W或N封装以及F N封装,这两种封装的引脚排列如图1,引脚说明见表1。
图1T L C2543的封装4接口时序可以用四种传输方法使T L C2543得到全12位分辩率,每次转换和数据传递可以使用12或16个时钟周期。
一个片选()脉冲要插到每次转换的开始处,或是在转换时序的开始处变化一次后保持为低,直到时序结束。
图2显示每次转换和数据传递使用16个时钟周期和在每次传递周期之间插入的时序,图3显示每次转换和数据传递使用16个时钟周期,仅在每次转换序列开始处插入一次时序。
引脚号名称I/O说明1~9,11,12AIN0~AIN10I模拟量输入端。
11路输入信号由内部多路器选通。
对于4.1MHz的I/OCLOCK,驱动源阻抗必须小于或等于50Ω,而且用60pF电容来限制模拟输入电压的斜率15I片选端。
在端由高变低时,内部计数器复位。
由低变高时,在设定时间内禁止DATAINPUT和I/O CLOCK17DATAINPUT I串行数据输入端。
由4位的串行地址输入来选择模拟量输入通道16DATA OUT O A/D转换结果的三态串行输出端。
SPI串行接口AD转换器TLC2543
![SPI串行接口AD转换器TLC2543](https://img.taocdn.com/s3/m/3951b33243323968011c92af.png)
SPI串行接口AD转换器TLC2543的应用作者: 来源:mcuzb//-----------------------函数声明,变量定义--------------------------------------------------------#include <reg51.h>#include <intrins.h>//-------------------------------------------------------------------------------------------------- // 2543控制引脚宏定义//-------------------------------------------------------------------------------------------------- sbit SS1=P1^0; // 将p1.0口模拟片选sbit SCK=P1^1; // 将p1.1口模拟时钟输出sbit MOSI=P1^2; // 将p1.2口模拟主机输出sbit MISO=P1^3; // 将p1.3口模拟主机输入//-----------------------预定义控制字--------------------------------------------------------#define CONTROL_WORD 0x00 //选择通道0,输出数据长度12bit,MSB,单极性二进制数//-------------------------------------------------------------------------------------------------- // 函数名称:delay// 入口参数:N// 函数功能:延时子程序,实现(16*N+24)us的延时// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动//-------------------------------------------------------------------------------------------------- void delay(unsigned int N){int i;for(i=0;i<N;i++);}//-------------------------------------------------------------------------------------------------- // 名称:read2543// 功能:TLC2543驱动模块// 输入参数:CON_WORD控制字// 输出参数:ad转换值//-------------------------------------------------------------------------------------------------- unsigned int read2543(unsigned char CON_WORD){unsigned int ad=0,i;SCK=0;SS1=0;for(i=0;i<12;i++){if(MISO) ad|=0x01;MOSI=(bit)(CON_WORD&0x80);SCK=1;delay(3);SCK=0;delay(3);CON_WORD<<=1;ad<<=1;}SS1=1;ad>>=1;return(ad);}//-------------------------------------------------------------------------------------------------- // 名称:main// 功能:主函数// 输入参数:无// 输出参数:无//--------------------------------------------------------------------------------------------------void main(){unsigned int ad;while(1){ad=read2543(CONTROL_WORD); }}。