当前位置:文档之家› 数据采集器的设计实验报告

数据采集器的设计实验报告

单片机项目实践报告数据采集器的设计班级:计应102姓名:潘琴学号:1008143233一、项目名称:数据采集器的设计二、项目目的:了解A/D转换的基本概念、并行A/D转换芯片ADC0809的内部结构、与单片机的接口方式,在此基础上完成数据采集器的设计与调试。

以及SPI总线的串行A/D转换芯片TLC549、串行D/A转换器件TLC5615,完成数字电压表、信号发生器的设计。

最后是用单片机的定时器/计数器实现频率与周期的测量,将被测信号的周期或频率在液晶屏上显示出来。

三、项目过程:1、数据采集器的设计Vref(+)Vref(-)OE图1、ADC0808/0809内部逻辑结构1、2、数据采集器的设计过程在Proteus环境下,用ADC0808设计一个数据采集器,通过串行口与上位机相连,如果串行口收到了上位机的采集命令(0x41),就将8路模拟量转换为数字量,通过串行口以ASCII码的形式发送给上位机。

1、2、1、硬件电路如图所示,ADC0808的时钟信号CLK 由Proteus 的虚拟信号源提供,时钟频率的设置为600 kHz ;8路模拟量中IN0接Vcc ,IN7接地,其他6路通过电位器分压获得;单片机串行口的数据收发线与虚拟终端连接。

需要说明的是Proteus 中ADC0808的数据线,OUT1表示最高位,OUT8表示最低位。

1、2、2、程序设计程序的流程如图所示,主程序首先完成对串行口和外部中断的初始化,并等待上位机的采集命令,一旦收到采集命令,就启动对IN0的转换。

转换完成,ADC0808通过EOC 向单片机发出中断请求,单片机响应中断,读取转换结果,并将其保存到数组adbuf 中。

然后启动下一通道的转换,当8路模拟量全部采集完成时,主程序再将存放在数组adbuf 中的8路数字量转换为ASCII 码,通过串行口发送出去,为了能在虚拟终端上得到清楚的显示格式,相邻两路数字量之间输出空格码,每行显示8个数字量后,输出回车、换行码。

数据采集器的程序: #include <reg51.h> #include <absacc.h>#define uint unsigned int#define uchar unsigned charuchar idata adbuf[8]; //存放A/D转换结果uint addr; //IN0~IN7的通道地址uchar n; //通道计数void init_serial(void){ SCON=0x50; //0101,0000 8位数据位,无奇偶校验TMOD=0x20; //定时器T1工作于方式2PCON=PCON&0x7f; //SMOD=0TH1=-3; //装入时间常数,波特率为9600TL1=-3;TR1=1;} /启动定时器T1void send(uchar dat){ SBUF=dat;while(TI==0);TI=0;}void int0(void) interrupt 0{ adbuf[n]=XBYTE[addr]; //读取并保存当前转换结果addr++; //指向下一通道的地址n++; //计数器加工厂if(n<8)XBYTE[addr]=0; //启动对一一通道的转换elseEX0=0;}void getadc(void){n=0;addr=0x7ff8; //指向IN0通道的地址XBYTE[addr]=0; //启动对当前通道的转换EX0=1; //允许外部中断0中断while(n<8);} //等待8路模拟量转换完成void main(){uchar i;init_serial(); //初始化串行口IT0=1; //外部中断0下降沿触发EA=1; //开中断while(1){ while(RI==0); //等待接收完一个字符RI=0; //清除接收标志i=SBUF; //读取收到的字符if(i==0x41){ getadc(); //依次完成对8个通道模拟量的转换for(i=0;i<8;i++){ send(adbuf[i]/100+0x30); //发送百位的ASCLL码adbuf[i]=adbuf[i]%100;send(adbuf[i]/10+0x30); //发送十位的ASCLL 码 send(adbuf[i]%10+0x30); //发送个位的ASCLL 码 send(0x20); //发送空格码 send(0x20); } send(0x0d); //发送回车、换行 send(0x0a);} } }1、2、3、调试方法与步骤在Keil 下建立项目,输入源程序,编译后进入调试方式全速运行,在虚拟终端的窗口中输入大写字母“A ”,此时8路模拟量转换结果会在一行中显示出来,依次为IN0、IN1、…、IN7,由于IN0接+5V ,IN7接地,因此对应的显示值为255和000,而IN1~IN6的值由电位器RV1中心抽头的位置确定,调节RV1,然后在虚拟终端的窗口中输入大写字母“A ”,IN1~IN6的值将随之变化。

如果在虚拟终端的窗口无任何显示,首先应检查串行口的初始化是否正确、虚拟终端的波特率是否与串行口一致、串行口能否收到采集命令“A ”。

如果串行口能收到采集命令,应检查外部中断的初始化是否正确、启动信号START 、转换结束信号EOC 、输出允许信号OE 的连接是否正确,ADC0808的时钟CLOCK 设置不正确,也将无法完成A/D 转换。

如果程序能够将IN0~IN7的转换结果存入数组adbuf ,应重点检查串行口数据发送函数send ()。

2、数字电压表的设计2、1、8位串行A/D 转换器TLC5492、2、数字电压表的设计过程利用TCL549转换器设计一个简易数字电压表,用4位LED 显示器将被测电压显示出来,测量范围为0.000~5.000V (电路连接:将ACS 、ACLK 、ADO 分别与P10~P12相连)。

2、2、1、硬件电路REF+ REF- AINCS CL KTLC549内部结构REF-直接接到Vcc、GND,模拟输入AIN接电位器的中心抽头,调节电位器即或改变被测输入电压值。

2、2、2程序设计程序首先读取A/D转换结果存入adin,其值在0~255之间,对应的电压值u=adin/255*5000(mV),然后将u转换为4位BCD码送显示缓存,并调用显示程序将显示出来,小数点固定在最高位。

数字电压表的设计程序:#include <reg51.h>#define uchar unsigned char#define ulong unshgned longuchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xff};uchar dbuf[4]={0,0,0,0};sbit AD_CS=P1^0;sbit AD_CLK=P1^1;sbit AD_DAT=P1^2;bdata uchar adin;sbit adin0=adin^0;void delay(void){uchar i;for(i=0;i<20;i++);}uchar getad(void) //A/D转换程序{uchar i;AD_CS=0; //令CS为低选中TLC549delay(); //延时for(i=0;i<8;i++) //循环读取8位A/D转换结果{AD_CLK=0; //令CLK引脚为低adin=adin<<1; //先读取高位,后读取低位adin=AD_DAT; //读取数据线的一位数据AD_CLK=1; } //令CLK恢复为高位AD_CS=1;return adin;}void disp(void){ uchar i,n,bsel;bsel=0xfe; //首先点亮最低位for(n=0;n<4;n++){P2=bsel; //位选口P0=segtab[dbuf[n]]; //将显示缓存的数据转换为字段码显示if(n==3) P0=P0&0x7f; //点亮最高位的小数点bsel=(bsel<<1)+1; //准备显示下一位for(i=1;i<200;i++); //延时P0=0xff;} //熄灭所有字段}void main(){ulong u;uchar i;while(1){u=(ulong)getad()*5000/255; //将转换结果换成电压值for(i=0;i<3;i++) //转换为4位BCD码送显示缓存{dbuf[i]=u%10;u=u/10;}dbuf[3]=u;disp(); } //显示电压值}2、2、3、调试方法在Keil下建立项目,输入源程序,编译后进入高度方式全速运行,数码管将以“X.XXX”的格式显示当前测量的电压值,调节电位器,数码管上的电压值将随之而变化。

如果数码管没有显示,应首先检查显示及显示函数。

注意,将电压值u转换成BCD码送显示缓存如果出问题,也会影响显示结果。

如果数码管能正常显示,但显示的电压值与实际值不同,一般A/D转换程序有问题,可重点检查getad()函数,如果电位器W的中心抽头从最低调到最高,该函数返回的A/D转换结果也相应地由0x00变化到0xFF,说明A/D转换是对的,应检查语句“u=(ulong)getad()*5000/255;”以及随后的BCD码转换程序。

3、信号发生器的设计3、1、串行D/A转换器TLC5615TLC5615内部结构3、2、用TLC5615设计信号发生器的过程3、2、1、在Proteus环境下,用TLC5615设计一个锯齿波发生器。

(1)、硬件电路如图所示,将TLC5615的SCLK、CS、DOUT分别与单片机的P1.0、P1.1、P1.2相连,基准电压接+5V。

(2)、程序设计为了产生锯齿波,可定义一个用于计数的字符变量n,其值由0开始加1,每次加1后就将其输出,由TLC5615转换为相应的电压值,当n为255时,再加1又回到0,这样就实现了一个周期的转换。

程序如下:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit SCLK=P1^0; //时钟输入sbit CS=P1^1; //片选信号sbit DIN=P1^2; //串行数据输入void datout(uint dat) //向TL5615输出16位数据{uchar i;CS=1; //初始化片选信号为高SCLK=0; //初始化时钟为低CS=0; //选中TL5615for(i=0;i<16;i++){dat=dat<<1; //将最高位移入进位位CYDIN=CY; //将数据送到DIN引脚SCLK=1; //SCLK产生上升沿SCLK=0; } //SCLK恢复为低CS=1; } //片选信号恢复为高void main(void){uchar i=0;while(1){i=i++;datout(i<<2); }}在Keil下建立项目,输入源程序,编译后进入调试方式全速运行,示波器显示的波形如图所示。

相关主题