版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机项目实践报告数据采集器的设计班级:计应 102姓名:潘琴学号: 1008143233一、项目名称:数据采集器的设计二、项目目的:了解A/D转换的基本概念、并行A/D转换芯片ADC0809的内部 结构、与单片机的接口方式,在此基础上完成数据采集器的设计与调试。以及SPI总线的串行A/D转换芯片TLC549、串行D/A转换器件TLC5615,完成数字 电压表、信号发生器的设计。最后是用单片机的定时器/计数器实现频率与周期的测量,将被测信号的周期或频率在液晶屏上显示出来。三、项目过程:1、数据采集器的设计1、1、ADC0808/0809 的内部结构START CLK地址 锁存 与译 码ABCA
2、LEIN0IN1IN2IN3IN4IN5IN6IN78位 A/D 转换器态出存 三输锁器wdl*lul>l01234567DDDDDDDDvccGNDVref( +) Vref( -) OE图1、ADC0808/0809内部逻辑结构1、2、数据采集器的设计过程在Proteus环境下,用ADC0808设计一个数据采集器,通过串行口与上位机相 连,如果串行口收到了上位机的采集命令(0x41),就将8路模拟量转换为数字 量,通过串行口以ASCII码的形式发送给上位机。1、2、1、硬件电路U2(CLOCK)510U218产TAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3
3、/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSEPQP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INTP1.3P3.3/INTP1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WR-P1.7P3.7/RD-780C51929ALE 3023 4 56 7 821前232药22722代DOD1D3D5D7/8D0DD20 12QQQMD6VSD3DreDMoed3 4 5 6 7 QQQQQ3M
4、8D2CLOCKIN0STARTIN1EOCIN2IN3OUT1IN4IN5OUT2IN6OUT3IN7OUT4OUT5ADD AOUT6ADD BOUT7ADD COUT8ALEOEVREF(+) VREF(-)718151712934272812120ADC080826RV12225 AO24 A1,_63% 1k2U5:A如图所示,ADC0808的时钟信号CLK由Proteus的虚拟信号源提供,时钟频率的设置为600 kHz; 8路模拟量中IN0接Vcc, IN7接地,其他6路通过电位器分压获得;单片机串行口的数据收发线与虚拟终端连接。需要说明的是Proteus中ADC0808的数据线,
5、OUT1表示最高位,OUT8表示最低位1、2、2、程序设计程序的流程如图所示,主程序首先完成对串行口和外部中断的初始化,并等待上位机的采集命令,一旦收到采集命令,就启动对IN0的转换。转换完成,ADC0808 通过EOC向单片机发出中断请求,单片机响应中断,读取转换结果,并将其保 存到数组adbuf中。然后启动下一通道的转换,当 8路模拟量全部采集完成时, 主程序再将存放在数组adbuf中的8路数字量转换为ASCII码,通过串行口发送 出去,为了能在虚拟终端上得到清楚的显示格式,相邻两路数字量之间输出空格码,每行显示8个数字量后,输出回车、换行码。数据采集器的程序:#in clude <
6、reg51.h>#in clude <absacc.h>#define uint unsigned #define uchar unsigned uchar idata adbuf8;uint addr; uchar n;void init_serial(void) SCON=0x50; TMOD=0x20; PCON=PCON&0x7f;TH1=-3;TL1=-3;TR1=1;void send(uchar dat) SBUF=dat; while(TI=0);TI=0;void int0(void) interrupt 0 adbufn=XBYTEaddr; ad
7、dr+;n+; if(n<8) XBYTEaddr=0;elseintchar/存放 A/D 转换结果/IN0IN7 的通道地址/通道计数/0101,0000 8 位数据位,无奇偶校验/定时器 T1 工作于方式 2/SMOD=0/装入时间常数,波特率为 9600/启动定时器 T1/读取并保存当前转换结果 /指向下一通道的地址 /计数器加工厂/启动对一一通道的转换EX0=0;void getadc(void) n=0;addr=0x7ff8;XBYTEaddr=0;EX0=1;while(n<8); void main() uchar i;init_serial();IT0=1;EA
8、=1;while(1) while(RI=0);RI=0; i=SBUF;/指向 IN0 通道的地址 /启动对当前通道的转换 /允许外部中断 0 中断 /等待 8 路模拟量转换完成/初始化串行口 /外部中断 0 下降沿触发 /开中断/等待接收完一个字符/清除接收标志/读取收到的字符if(i=0x41) getadc();/ 依次完成对 8 个通道模拟量的转换for(i=0;i<8;i+) send(adbufi/100+0x30); / 发送百位的 ASCLL 码adbufi=adbufi%100;send(adbufi/10+0x30);发送十位的 ASCLL 码send(adbufi
9、%10+0x30); /发送个位的 ASCLL 码sen d(0x20);/发送空格码sen d(0x20); sen d(0x0d);发送回车、换行se nd(0x0a);1、2、3、调试方法与步骤在Keil下建立项目,输入源程序,编译后进入调试方式全速运行,在虚拟终端 的窗口中输入大写字母“ A”,此时8路模拟量转换结果会在一行中显示出来, 依次为IN0、IN1、IN7,由于IN0接+5V,IN7接地,因此对应的显示值为 255和000,而IN1IN6的值由电位器RV1中心抽头的位置确定,调节RV1,然 后在虚拟终端的窗口中输入大写字母“ A”,IN1IN6的值将随之变化。如果在虚拟终端的
10、窗口无任何显示,首先应检查串行口的初始化是否正确、虚拟终端的波特率是否与串行口一致、串行口能否收到采集命令“ A ”。如果串行口能收到采集命令,应检查外部中断的初始化是否正确、启动信号START、转换结束信号 EOC、输出允许信号 OE的连接是否正确,ADC0808的 时钟CLOCK设置不正确,也将无法完成 A/D转换。如果程序能够将IN0IN7的转换结果存入数组adbuf,应重点检查串行口数据发 送函数send ()。REF+REFAINCSCL KDOTLC549内部结构2、2、数字电压表的设计过程利用TCL549转换器设计一个简易数字电压表,用4位LED显示器将被测电压显示出来,测量范围
11、为 0.0005.000V (电路连接:将 ACS、ACLK、ADO分别 与P10P12相连)。2、2、1、硬件电路POCOEFQ ENRi3h*19373938RV1U21kTLC549SDOREF-SCLKAINREF+5-2930 31 卜 XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1 2
12、P3.2/INT0P3.3/INIIP1.3P1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WRP1.7P3.7/RDU118363533932212280C51如图所示,将TLC549的CS、CLK、DO接到单片机的三条I/O 口线,REF+、REF-直接接到Vcc、GND,模拟输入AIN接电位器的中心抽头,调节电位器即 或改变被测输入电压值。2、2、2程序设计程序首先读取 A/D转换结果存入 adin,其值在0255之间,对应的电压值 u=ad in /255*5000( mV),然后将u转换为4位BCD码送显示缓存,并调用显示 程序将显示出来,小数点固定在最高位。数字电压表
13、的设计程序:#in elude <reg51.h>#define uchar un sig ned char#define ulong un shg ned long uchar code segtab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xff;uchar dbuf4=0,0,0,0; sbit AD_CS=P1A0;sbit AD_CLK=PM1;sbit AD_DAT=P1A2; bdata uchar adin;sbit adi
14、 n0=ad in 八0;void delay(void)uchar i;/A/D转换程序/令CS为低选中TLC549 /延时循环读取8位A/D转换结果/令CLK引脚为低先读取高位,后读取低位/读取数据线的一位数据令CLK恢复为高位for(i=0;i<20;i+);uchar getad(void) uchar i;AD_CS=0;delay();for(i=0;i<8;i+)AD_CLK=0;adi n=adin< <1;adi n=AD_DAT;AD_CLK=1; AD_CS=1; return adin; void disp(void) uchar i,n,bse
15、l; bsel=0xfe; for(n=0;n<4;n+) P2=bsel;P0=segtabdbufn; 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+)dbufi=u%10;u=u/10;dbuf3=u;disp(); 2、2、3、调试方法/首先点亮最低位/位选口/将显示缓存的数据转换为字段码显示/点亮最高位的小数点/准备显
16、示下一位/延时/熄灭所有字段/将转换结果换成电压值/转换为 4位 BCD 码送显示缓存/显示电压值在 Keil 下建立项目,输入源程序,编译后进入高度方式全速运行,数码管将以 “ X.XXX ”的格式显示当前测量的电压值,调节电位器,数码管上的电压值将 随之而变化。如果数码管没有显示,应首先检查显示及显示函数。注意,将电压值 u 转换成BCD 码送显示缓存如果出问题,也会影响显示结果。 如果数码管能正常显示,但显示的电压值与实际值不同,一般 A/D 转换程序有 问题,可重点检查getad ()函数,如果电位器 W的中心抽头从最低调到最高, 该函数返回的A/D转换结果也相应地由0x00变化到Ox
17、FF,说明A/D转换是对 的,应检查语句“ u=( ulong) getad() *5000/255;”以及随后的 BCD 码转换程 序。3、信号发生器的设计 3、1、串行 D/A 转换器 TLC5615REFINAGNDVccCSSCLKDIN电源复位控制逻辑2位LSB MSB4位010位数据于无关位16位移位寄存器10位D/A寄存器OUTDOUTTLC5615内部结构3、2、用TLC5615设计信号发生器的过程3、2、1、在Proteus环境下,用TLC5615设计一个锯齿波发生器。(1)、硬件电路 如图所示,将TLC5615的SCLK、CS、DOUT分别与单片机的P1.0、P1.1、P1
18、.2相连,基准电压接+5V。(2)程序设计为了产生锯齿波,可定义一个用于计数的字符变量 n其值由o开始加1,每次 加1后就将其输出,由TLC5615转换为相应的电压值,当n为255时,再加1 又回到0,这样就实现了一个周期的转换。程序如下:#in clude<reg51.h>#i nclude<i ntri ns.h>#defi ne uchar un sig ned char #defi ne uint un sig ned int sbit SCLK=P1A0;sbit CS=P1A1; sbit DIN=P1A2;void datout( uint dat)uch
19、ar i;CS=1;SCLK=0;CS=0;for(i=0;i<16;i+) dat=dat<<1;DIN=CY;SCLK=1;/时钟输入/片选信号/串行数据输入/向TL5615输出16位数据/初始化片选信号为高/初始化时钟为低/选中 TL5615将最高位移入进位位CY /将数据送到DIN引脚/SCLK产生上升沿SCLK=0; CS=1; void ma in (void)uchar i=0;while(1)i=i+;datout(i<<2); /SCLK恢复为低/片选信号恢复为高编译后进入调试方式全速运行,示波器显示在Keil下建立项目,输入源程序, 的波形如图
20、所示。个正弦波发生器。#in clude<reg51.h> #i nclude<i ntri ns.h> #defi ne uchar un sig ned char#defi ne uint un sig ned intsbit SCLK=P1A0;sbit CS=P1A1;sbit DIN=PM2;uchar code wavetab60=0x80,0x8D,0x9A,0xA7,0xB4,0xBF,0xCB,0xD5, 0xDF,0xE7,0xEE,0xF4,0xF9,0xFD,0xFF,0xFF,0xFF,0xFD,0xF9,0xF4,0xEE,0xE7,0xDF
21、,0xD5,0xCB,0xC0,0xB4,0xA7,0x9A,0x8D,0x80,0x72,0x65,0x58,0x4C,0x40,0x34,0x2A,0x21,0x18,0x11,0x0B,0x06,0x02,0x00,0x00,0x00,0x02,0x06,0x0A,0x10,0x18,0x20,0x2A,0x34,0x3F, 0x4B,0x58,0x65,0x72; void datout( uint dat) uchar i;CS=1;SCLK=0;CS=0; for(i=0;i<16;i+) dat=dat<<1;DIN=CY;SCLK=1;SCLK=0;/初始化片
22、选信号为高/初始化时钟为低/选中 TL5615将最高位移入进位位CY/将数据送到DIN引脚/SCLK产生上升沿/SCLK恢复为低/片选信号恢复为高CS=1;void ma in (void)ui nt i=0;for(i=0;i<60;i+)从波表读取数字量输出datout(wavetabi<<2);运行程序,Proteus的虚拟示波器将观察到如图所示的波形。4、1、频率的测量4、1、1、频率测量的过程(1) 、硬件电路在Proteus环境下,设计的频率计电路如图所示,将定时器T0设置在定时方式2,定时时间为250us,满4000次中断正好1s,定时器T1工作于计数方式1,其
23、初 值为0。在启动定时器T0开始定时后,随即送到T1( P3.5)弓I脚的被测脉冲进 行计数,当T0定时满1s后,立即停止T1计数,关闭定时器T0, T1的计数值即为被测信号的频率。U1(P3.5/T1)31302918U1P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0ALEPSENRSTXTAL219 KXTAL1P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7
24、P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD01716LM016L112RP1RESPACK-8262234353637323338391514131110282725242321+5V80C51(2) 、程序设计频率测量模块的程序:#in clude<reg52.h>#i nclude<i ntri ns.h>#defi ne uchar un sig ned char#defi ne uint un sig ned intexter n void ini t_lcd(void);exter n voi
25、d disp_str(uchar x,uchar y,uchar *p);sbit FS=P3A5;/被测信号FS输入端bit RDY=0;测量完成标志/定时中断计数/测量 FS 的频率uint msn;uint count(void)RDY=0;TMOD=0X5a;TH0=TL0=-250; msn=4000;TH1=TL1=0X00;ET0=1;EA=1;while(FS=1);while(FS=0);TR0=1;TR1=1; while(RDY=0);TR1=0;TR0=0; return(TH1*256+TL1);/TO :定时方式2, T1 :计数方式1;/T0 定时时间为 250u
26、s/4OOO 次中断正好 1s/T1 工作于计数方式,初值为 O/ 允许 TO 中断/开中断/等待被测信号变低/等待被测信号变高/TO 开始定时/T1 开始计数/等待 1s/ 关闭 T1 、TO/返回计数值msn-;if(msn=O)RDY=1; void main() uint f;uchar str9="f= uchar i; init_lcd();while(1) f=count();_nop_(); for(i=6;i>2;i-) stri=f%1O+Ox3O;f=f/1O; str2=f+Ox3O; for(i=2;i<6;i+) if(stri!='O
27、') break; stri=' ' disp_str(O,3,str);/如果 1s 已到/设置测量完成标志位Hz"/液晶屏初始化/测量频率/测量结果转换为 5位 ASCII 码/用空格码替换高位的O/显示测量结果void timerO(void) interrupt 1 using 1液晶显示模块 16O2 DRV.C: #include<reg52.h>#include<intrins.h> #define uchar unsigned char#define uint unsigned intsbit RS=P3A3;sbit
28、RW=P3A1;sbit E=P3A0;sfr LCD=0x80;sbit BF=LCDA7;void lcd_cmd(uchar cmd) LCD=cmd;RS=0;RW=0;E=1;_nop_();E=0;while(1)LCD=0xff;RS=0;RW=1;E=0;_nop_();E=1;if(BF=0) break;void lcd_dat(uchar dat)LCD=dat;RS=1;RW=0;E=1;/数据 /命令寄存器选择控制端/读写控制端/使能控制端/P0 作为总线端口就绪线BF,低电平有效/向液晶屏发送指令/向液晶屏写入数据_nop_();E=0;while(1)LCD=0x
29、ff;RS=0;RW=1;E=0;_nop_();E=1;if(BF=0) break;dat=LCD;void init_lcd(void) lcd_cmd(0x01); lcd_cmd(0x3c); lcd_cmd(0x0c); /初始化液晶屏/清屏幕/设置双行显示, 5*10 点阵 / 开显示,关闭光标void disp_str(uchar x,uchar y,uchar *p)在 x 行、y 歹U显示字符串 pif(x=0)Icd_cmd(0x80+y);/设置写入地址elselcd_cmd(0xc0+y);/设置写入地址while(*p)将字符依次发送到液晶屏lcd_dat(*p+)
30、; _(3) 、调试方法Timing;First Edge At妙 Frequency (Hz):Period (Sec$):将被测信号FS用Proteus的虚拟信号源DCLOCK代替,设置其频率,切换以 Keil下,全速运行程序,此时液晶屏的显示将如图所示。停止程序的运行,回到 Proteus修改DCLOCK的频率,再次切换到Keil下运行程序,液晶屏上的测量结 果将随之变化。仁12685Hzo ujCrl M口 lcie 寸 g g > > >QT £ Lu DOQDC1ODQ如果液晶屏没有显示,可将语句“ f=count ();注销,然后再编译运行,如果 仍没
31、有显示,就检查1602DRV.C模块中I/O 口的定义是否与线路一致,直到能 正常显示时,再将注销的语句恢复。如果液晶屏仍没有显示,说明调用count()函数没有返回,可能是RDY变量始 终无效,此时应检查定时器T0的初始化是否正确,电路的连接有无错误。4、2、周期的测量4、2、1、周期测量的过程(1)、硬件电路在Proteus环境下,用定时器/计数器测量周期的电路如图所示,用D触发器对被 测量信号进行分频,这要周期的测量也变成了脉宽的测量。QU2:ADU2:A(CLK)74LS74P1.7P3.7/RD-P1.6P3.6/WR-P1.5P3.5/T1P1.4P3.4/T0P1.3P3.3/I
32、NTLP1.2P3.2/INT0P1.1P3.1/TXDP1.0P3.0/RXDP2.7/A15P2.6/A14EAP2.5/A13ALEP2.4/A12PSENP2.3/A11P2.2/A10P2.1/A9P2.0/A8RSTP0.7/AD7U1741299P0.6/AD680C51XTAL2P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD131306532LM016LRP1RESPACK-82 33 1LCD2423213233+5V343536373818XTAL1P0.0/AD0397.D6D5D4U3d2U1DODE 肖 SR EEV DDV SSV(2)、程序设计(液晶屏显示模块程序与频率测量模块一样) 周期测量模块程序:#include<reg51.h>#define uchar unsigned char #define uint unsigned intextern void disp_str(uchar x,uchar y,uchar *p);extern void init_lcd(void);sbit CLR=P1A0;uint Ts;bit RDY=0;void control(void)IT0=1;EX0=1;TH0=0;/ 触发器清 0 控制位/存放测量结果/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园安全隐患工作制度
- 幼儿园思想教育工作制度
- 幼儿园教学两点工作制度
- 幼儿园班级日常工作制度
- 幼儿园空调消毒工作制度
- 幼儿园舆情监测工作制度
- 幼儿园门卫人员工作制度
- 广播社团办公室工作制度
- 基于信息可视化的景观设计方法研究-以凤凰古城为例
- 学校家长会管理办法
- 2025广东深圳市罗山科技园开发运营服务有限公司高校应届毕业生招聘笔试参考题库附带答案详解
- 子宫动脉监测超声课件
- 手持风扇质量检验及标准说明
- 血站清洁消毒培训课件
- 药物性剥脱性皮炎
- 2024版电网典型设计10kV配电站房分册
- DB32∕T 4341-2022 水下道路隧道消防系统工程施工质量验收规范
- 对口支援新疆管理办法
- 北师大版(2024)七年级下册数学期末复习:解答题压轴题 尖子生练习题(含答案解析)
- 《真空熔炼过程解析》课件
- 2025年上海市金山区中考数学二模试卷(含解析)
评论
0/150
提交评论