串行AD转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目要求能检测0到1000度的温度,分辨率要不小于1度。可见刻度最小为1000分度。若使用常规的8位AD转换器并不能达到题目要求,由于2^10=1024,所以使用10位的AD转换器正好能符合题目要求。经由网上查询得知,德州仪器出品的开关电容逐次逼近模数转换器TLC1543正好是10位,该器件有三个输入端和一个3态输出端[片选(CS)、输入/输出时钟(I/O CLOCK)、地址输入(ADDRESS)和数据输出(DATA OUT)],其性能参数如下所示:
《自动检测与过程控制》期末作业
姓名熊子良
班级信息082
学号200811513202
日期2011-6-3
一.实验目的
设计一个采用K分度热电偶做传感器的电子温度计电路,测温范围0—1000℃,以数字方式显示温度,显示分辨率不低于1℃。(注:K分度热电偶1000℃时的热电势为41.27毫伏)。
二.题目分析
·10位分辨率A/D转换器
·11个模拟输入通道
·3路内置自测试方式
·固有的采样与保持
·总的不可调整误差±1LSB Max
·片内系统时钟
·转换结束(End-of-Conversion,EOC)输出
·采用CMOS技术
它共有20个引脚,其引脚排列如下图所示:
其引脚说明及使用方法如下:
由上述文档可知,TLC1543是一块10位串行输出的AD转换器,共11个选通通道A0~A10,其选通数据也是以串行的方式输入的,所以该芯片使用比较复杂,不像控制并行AD转换器那么简单明了。考虑到单片机串行通信一次只能传输8位数据,而TLC1543一次AD转换产生10位的数据,所以在读取AD转换芯片的数据时也不能采用单片机已有的串行通信方式;必须使用并口模拟10的串行通信,同时在波特率设置时又要考虑与TLC1543同步的问题,所以程序设计起来还是非常棘手的。
byte[2]=temp/10000.0;
temp=dy%10000;
byte[3]=temp/1000.0;
temp=dy%1000;
byte[4]=temp/100.0;
temp=dy%100;
byte[5]=temp/10.0;
byte[6]=dy%10 ;
byte[7]= 10;
}
void TIMER0() interrupt 1 using 1 //时间中断显示
TL0=0X78;
TH1=0x3C;
TL1=0XB0;//初始化时间中断
EA=1;
ET0=1;//时间中断0
ET1=1;//时间中断1
TR0=1;
TR1=1;
EX0=1;//外部中断0
IT0=1;
while(1);//程序循环执行
}
六.调试方法与仿真结果
该电路用滑动变阻器的分压模拟热电偶产生的热电势(比例放大部分未在其中)。调节滑动变阻器的旋钮可以产生0到5伏特的电压(AD转换器的转换范围),在仿真中可以发现,随着滑动变阻器阻值的变化,数码管的显示也发现了变化,且变化是随滑动变阻器变化而线性变化的,范围为0到1023(对应0~2^10-1)。可见已经实现了AD转换。
{
TH0=0XeC;//每5毫秒显示一次
TL0=0X78;
if(j==8)
j=0;
P2=display[j];//输出位选码
P1=tab[byte[j]];//输出字型码
j++;
}
void TIMER1() interrupt 3 using 3//时间中断转换
{//每50毫秒要求AD转换一次
TH1=0x3C;
uchar byte[8]={1,1,1},j;
uint dy;
void write1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uint data i;
CLOCK=0;//片选允许
_CS=0;
port<<=4;//地址数据左移四位,转换成串行数据
for (i=0;i<4;i++) //把通道号打入1543
}
}
uint read1543()
{
uint data ad;
uint data i;
uchar data al=0,ah=0;
CLOCK=0;
_CS=0; //AD转换结束
for (i=0;i<2;i++) //取D9,D8
{
D_OUT=1;
CLOCK=1;//CLOCK上升沿读取
ah<<=1;//逐位移入数据
if (D_OUT)
ah|=0x01;
CLOCK=0;
}
for (i=0;i<8;i++) //取D7--D0
{
D_OUT=1;
CLOCK=1;//CLOCK上升沿读取
al<<=1;//逐位移入数据
if (D_OUT)
al|=0x01;
CLOCK=0;
}
_CS=1;//片选禁止
ad=(uint)ah;
sbit _CS =P0^2 ;
sbit CLOCK =P0^3 ;
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xc6} //字型码
,display[8]={1,2,4,8,16,32,64,128};//位选码
{
D_IN=(bit)(port&0x80);//
CLOCK=1;//产生CLOCK上升沿,1543读入选通地址
CLOCK=0;
port<<=1;//数据左移,产生串行数据
}
for (i=0;i<7;i++) //填充6个CLOCK,等待转换结束
{
CLOCK=1;//CLOCK上升沿
CLOCK=0;
ad<<=8;//ah作为10数据的头两位
ad|=al;//数据合并
return ad;
}
void bitshow()//求十进制数的每位数
{
uint temp;
bytFra Baidu bibliotek[0]=dy/1000000.0;
temp=dy%1000000;
byte[1]=temp/100000.0;
temp=dy%100000;
三.框图设计
从文档得知,在片选信号( )有效(低电平)时,4位选通信号(ADDRESS端输入,串行数据)在CLOCK端前4个上升沿被移入芯片TLC1543并锁存。
在CLOCK端输入第10个下降沿时,AD转换结束,产生“转换结束”(EOC)信号(EOC变为高电平),通知单片机读取转换后的数字值(读取部分可由单片机外部中断实现)。
仿真中有些问题,初步估计应该是仿真软件的问题,比如说把电路中的示波器取下时将没有输入(显示全为0);以前也遇上类似的问题,可见,仿真并不能代替实验。
该电路连线较多,软件设计也比较复杂,需要注明的是,软件中串行数据操作的部分代码来自网上,经过一些修改就可以用了,感谢前人的努力,在这次实验中我学到了很多知识,感谢万能的网络!以下是仿真现象:
五.程序清单
结合硬件电路,考虑好实现的具体细节,经过不断摸索,终于把程序调试的差不多,以下是单片机的C语言程序代码:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit D_OUT= P0^0;
sbit D_IN =P0^1;
需要注意的是,读取数据时,要考虑同步的问题,在CLOCK端上升沿时移出一位数据,所以在读取10位数据时,要在CLOCK端产生10个上升沿才能把数据读完,由此可由大体的思路,以下为框图设计:
四.硬件设计
综上考虑,我在硬件设计时,用P0口4端产生CLOCK信号,而P0口3端控制片选信号( ),P0口1端输出选通信号,P0口1端读取串行数据。在数码管显示部分采用P2口输出字型码,P1口输出位选信号。以下是电路图:
TL1=0XB0;
TR0=0;
write1543(3);
TR0=1;
}
void wbzd0() interrupt 0 using 0 //外部中断0,读串行数据
{
dy=read1543();
bitshow();//数码管位显示值的求取
}
void main()
{
TMOD=0x11;
TH0=0XeC;
相关文档
最新文档