基于ATC与TCL的双通道采集电压表格模板的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
精心整理
基于AT89C51与TCL2543的双通道采集电压表的设计
姓名:
学号:
专业:测控技术与仪器
2014年3月
摘要ti 关键词1.引言转换理。本文介绍了以AT89C51单片机为核心、以TLC2543为转换芯片采样、以四位一体七段数码管显示的具有一定精度电压测量的数字电压表。
2.硬件设计
该系统主要包括以下几个模块:时钟模块、复位模块、控制模块、A/D 转换模块、以及显示模块,其中时钟模块和复位模块是必不可少的部分呢。
时钟模块选择频率为11.0592mhz的晶振,由于是在proteus仿真,则频率大小通过软件设置来完成。复位模块包括上电复位和手动复位两种方式,按钮s1就是用来实现手动复位操作的。控制模块比较简单,主要是以单片机AT89C51为控制核心,但是它要通过软件编写程序再载入单片机中,才能实现处理和控制功能。
A/D转换模块是本系统中最为关键的部分,它要实现将采集到的连续变化的模拟
3.2.1 控制字的格式
控制字为从DATAINPUT端串行输入的8位数据,它规定了TLC2543要转换的模拟量通道、转换后的输出数据长度、输出数据的格式。
3.2.2 转换过程
上电后,片选CS必须从高到低,才能开始一次工作周期,此时EOC为高,输入
数据寄存器被置为0,输出数据寄存器的内容是随机的。开始时,CS片选为高,I/OCLOCK、DATAINPUT被禁止,DATAOUT呈高阻状,EOC为高。
4.软件设计
系统程序的内容一般包括:延时子程序、显示子程序、数据采集子程序、主程序等等。主程序流程图见下图所示。
5.仿真结果如下图
图1系统硬件电路仿真图(通道0采集的数据)
图2系统硬件电路仿真图(通道1采集的数据)
6数据分析
6.1在上图1当中数码管显示的测量电压值是通道0采集的,数值是2.499V,而虚拟电
压表的值是+2.50v;在上图2当中数码管显示的测量电压值是通道1采集的数值是3.399V,而虚拟电压表的值是+3.40v经过多次测验,可以发现所设计的数字电压表的最大误差是0.001v,二者在同一个数码管上交替出现,满足任务要求。
7.结语
本次对数字电压表的软硬件设计,主要是在proteus中硬件仿真,将keil软件编译生成的0~
5v
[1]
术
[2]
C
sbitSDI=P1^1;
sbitSDO=P1^2;
sbit_cs=P1^3;
sbitEOC=P1^4;
sbitKEY=P3^2;
uchara1,b1,c1,d1; floatsum,sum1; double
sum_final1; double
{
}
{
delay(10);
P2=0xff;
P0=duan[b];
P2=wei[1]; delay(10);
P2=0xff;
P0=duan[c];
P2=wei[2]; delay(10);
P2=0xff;
}
{
CLK=0;
_cs=0;
{
SDI=port&0x80; CLK=1;
CLK=0;
port<<=1;
SDI=0;
for(i=0;i<8;i++) {
CLK=1;
CLK=0;
}
_cs=1;
_cs=0;
{
CLK=1;
CLK=0;
}
{
CLK=1;
al<<=1;
if(SDO)al|=0x01; CLK=0;
_cs=1;
ad=(uint)ah; ad<<=8;
ad|=al;
}
{
CLK=0;
_cs=0;
{
CLK=1;
CLK=0;
port<<=1;
}
SDI=0;
for(i=0;i<8;i++)
CLK=1;
CLK=0;
}
_cs=1;
_cs=0;
{
CLK=1;
CLK=0;
}
{
CLK=1;
if(SDO)bl|=0x01; CLK=0;
}
_cs=1;
ad=(uint)bh;
ad<<=8;
ad|=bl;
return(ad);
}
voidmain()
{
ucharj;
{
{
{
}
sum=sum1/128;
sum1=0;
sum_final1=(sum/4095)*5; sum_final=sum_final1*1000;
a1=(int)sum_final/1000;
b1=(int)sum_final%1000/100;
c1=(int)sum_final%1000%100/10; d1=(int)sum_final%10;
display(a1,b1,c1,d1);
}
else
{
{
}
b1=(int)sum_final%1000/100;
c1=(int)sum_final%1000%100/10; d1=(int)sum_final%10;
display(a1,b1,c1,d1);
}