单片机 数字电压表(TLC2543)
一、简述
使用并行ADC会限制系统I/O口的功能扩展,采用串行ADC比较适合那些低速采样而控制管脚又比较多的系统。
TLC2543是TI公司的12位串行模数转换器,由于是串行输入结构,能够节省51系列单片机I/O资源;
例子中采用模数转换的芯片TLC2543实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:0.005、1.5、4.995。
文件打包:链接: https://pan.baidu.com/s/187PX2CRvppKcAj3Qwvny2w 密码: 8i9f
二、效果
三、工程结构
1、Keil工程
2、仿真电路图
四、源文件
TLC2453.c文件
#include<reg51.h> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ulong volt;//测量的电压值 uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管显示0-9的对应电平码 uint vtime; // 用来控制测量地址位的改变 uchar addr;//测量地址位,指示测量的是哪一个模拟值 (其实就是TLC2543的控制字) sbit LW1=P2^3;//数码管电压显示值的第1个 比如四个数码管显示4.885值中,对应显示4这个数码管 sbit LW2=P2^2;//数码管电压显示值的第2个 sbit LW3=P2^1;//数码管电压显示值的第3个 sbit LW4=P2^0;//数码管电压显示值的第4个 sbit LW5=P2^4;//定义数码管位选脚 sbit CLK=P1^7;//定义时钟信号口 sbit DIN=P1^6;//定义2543数据写入口 sbit DOUT=P1^5;//定义2543数据读取口 sbit CS=P1^4;//定义2543片选信号口 /**********************************************************/ //函数名:delay(uint x) //功能:延时程序 改变测量地址 //调用函数: //输入参数:x //输出参数: //说明: /**********************************************************/ void delay(uint x) { uchar y,z; for(y=x;y>0;y--) for(z=250;z>0;z--);//该步运行时间约为0.5ms vtime++; if(vtime==1000) { vtime=0; addr++; if(addr==3) addr=0;//以上语句实现测量地址位的改变 } } /**********************************************************/ //函数名:read2543(uchar addr) //功能:2543驱动程序 //调用函数: //输入参数:addr //输出参数: //说明:进行ad转换将结果存于volt变量中 addr为测量位地址 /**********************************************************/ void read2543(uchar addr) { uint ad=0; uchar i; CLK=0; CS=0;//片选段,启动2543 addr<<=4;//对地址位预处理 for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量 { if(DOUT==1) ad=ad|0x01;//单片机读取ad数据 DIN=addr&0x80;//2543读取测量地址位 CLK=1; ;;;//很短的延时 CLK=0;//产生下降沿,产生时钟信号 ;;; addr<<=1; ad<<=1;//将数据移位准备下一位的读写 } CS=1;//关2543 ad>>=1; volt=ad;//取走转换结果 volt=volt*1221;//例子的满量程为5V,转换分辩率为12位 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV } /**********************************************************/ //函数名:display() //功能:5位数码管显示 //调用函数:delay(uint x) //输入参数: //输出参数: //说明:将处理后的电压值与测量位值显示在5位数码管上 /**********************************************************/ void display() { P0=0xff;//消隐,因为不断进行循环显示,以防上次显示有残留电平的影响 LW1=0; //选中第1个数码管进行显示 P0=~led[volt/1000000]&0x7f;//带小数点1伏显示位 delay(2); //延时 P0=0xff; //消隐 LW1=1; //取消选中第1个数码管进行显示 LW2=0; //选中第2个数码管进行显示 P0=~led[(volt/100000)%10];//100毫伏显示位 delay(2); P0=0xff; LW2=1; LW3=0; P0=~led[(volt/10000)%10];//10毫伏显示位 delay(2); P0=0xff; LW3=1; LW4=0; P0=~led[(volt/1000)%10];//1毫伏显示位 delay(2); P0=0xff; LW4=1; LW5=0; P0=~led[addr+1];//显示电压测量位 delay(2); LW5=1; } /**********************************************************/ //主程序 /**********************************************************/ void main() { while(1) { read2543(addr);//调用2543驱动程序测量地址为0 display();//调用显示程序 } }
五、总结
1、TLC2543芯片介绍
TLC2543是12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。
2、引脚
AIN0~AIN10为模拟输入通道。
为片选端,低电平有效。
DATA INPUT为串行数据输入端,
DATA OUT为A/D转换结果的三态串行输出端
EOC为转换结束端,
I/O CLK为I/O时钟端,
REF+为正基准电压端,
REF-为负基准电压端,
VCC为电源端,
GND为地。
3、TLC2543控制字
控制字为从DATA INPUT端串行输入端8位数据,规定了TLC2543要转换的模拟量通道、转换后的输出数据长度以及输出数据端格式。
高4位(D7~D4)决定通道号,对于模拟输入通道0至模拟输入通道10。其值为0000~1010,对应通道为通道0~通道10。
低4位(D3~D0)决定输出数据长度及格式。
其中D3、D2决定输出数据长度,01表示输出数据长度为8位,11表示输出数据长度为16位,其他为12位。
D1决定输出数据是高位先送出,还是低位先送出,为0表示高位先送出。
D0决定输出数据是纯正数还是有负数,若为纯正数,该位为0,否则为1。
4、工作过程