单片机课程设计数据采集系统.docx

上传人:b****5 文档编号:3527461 上传时间:2022-11-23 格式:DOCX 页数:21 大小:641.90KB
下载 相关 举报
单片机课程设计数据采集系统.docx_第1页
第1页 / 共21页
单片机课程设计数据采集系统.docx_第2页
第2页 / 共21页
单片机课程设计数据采集系统.docx_第3页
第3页 / 共21页
单片机课程设计数据采集系统.docx_第4页
第4页 / 共21页
单片机课程设计数据采集系统.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机课程设计数据采集系统.docx

《单片机课程设计数据采集系统.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数据采集系统.docx(21页珍藏版)》请在冰豆网上搜索。

单片机课程设计数据采集系统.docx

单片机课程设计数据采集系统

一、摘要

此系统主要以ADC0808和80C51为核心,进行实时数据采集,数据处理和显示,终端接收及存储。

具体包括控制、显示、A/D转化器等。

设计中用AD0808进行8路数据的采样,利用51单片机的串行口进行发送和接收数据。

利用8个LCD数码管进行显示数据处理。

采用PROTEUS和Keiluvision3为开发工具,软件设计采用模块化编程

关键字:

数据采集、ADC0808、双机通讯、IIC

 

二、前言

随着计算机技术的飞速发展,数据采集系统应用在多个领域中。

数据采集时供、农业控制系统中十分重要的环节,在医药、化工、食品等领域中,往往需要随时检测各生产环节的温度、流量、压力等参数。

同时,还要对某一检测点任意参数能够进行随机查寻,将其在某一段时间内检测得到的数据经过转换提取出来,以便进行比较,做出决策,调整控制方案,以提高产品的合格率,产生良好的经济效益。

不仅如此,数据采集系统在我国高科技领域中也扮演着十分重要的地位。

雷达的实时数据采集,航天飞机成功升空,通讯卫星的实时通报数据,这些高科技给国家人民的生活带来了便利。

因此数据采集是一项十分重要的技术。

从严格意义上来讲,数据采集系统是用计算机控制的多路自动检测或巡回检测,并且能够对采集到的数据进行存储、计算、分析,以及从数据中提取可用的信息,供显示,记录、打印或描绘的系统。

数据采集系统通常由数据输入通道、数据处理、数据存储、数据显示、数据输出五个部分组成。

输入通道实现对数据的检测并读取;数据转化是将采集到的数据进行适当的转化;以便输出人们易懂的数据;数据存储是对采集过来的数据进行存储;以防下次用到可以方便提取;数据显示便是将处理后的数据进行显示,让操作者可以方便读取采集到的信息,以便进行控制;数据输出就是将数据输送到打印机打印。

由于RS-485在微机远程通信接口中广泛采用,技术已经相当成熟,故采用标准RS-485标准,实现PC与单片机之间的数据传送(由于本次设计在PROTEUS系统中仿真,因此,略去接口RS-485)。

本设计中对多路采集系统做了基本的研究。

此次试验主要解决的是怎样进行多路数据采集并如何通过串行口发送数据实现双机通讯的。

 

三、正文

3.1、设计要求

3.11.使用PROTEUS作为开发工具,利用ADC0808八路数据采集,信号源为5V直流电压用电阻网络分压。

采样间隔在(1-255秒)之间有外部拨码开关可调,分析数据采集精度。

3.12.将采集到的数据,使用串口传输传到远程单片机,设计传输距离为5KM。

3.13.远程单片机接收数据,按通道和输注(十进制)显示,并将信息存入24C01。

掌握

I2C存储器的程序设计方法,动态显示的设计方法。

 

3.2、系统的组成及工作原理

此系统主要以ADC0808与80C51为中心,通过ADC对电阻网络采集数据,并将采集到的数据通过单片机串口传到另外一篇单片机中,在24C01芯片中存储,同时读取24C01里的数据,并将其显示在数码管中。

由于电阻网络是由滑动变阻器构成,因此,当改变滑动变阻器阻值后,ADC采集到的数据也会变化。

而采集速度也是由人通过拨码开关来控制的。

在采集速度方面,由于采集速度是可控的,因此,需要利用定时器来控制数据的发送。

 

3.3、方案比较

3.31.采样器方案比较:

由于采样的最重要指标是:

转化时间、转换精度。

已知ADC转换芯片有8位,10位,12位,14位,最高的达到16位。

位数不一样,导致处理速度,精度都不一样。

通常,8位逐次逼近ADC的转换时间为100US左右,为本系统的控制时间允许。

ADC的转换精度为1/28=0.39%,输入0~5V时分辨率为5/(28-1)=0.0196V。

因此选择ADC0808芯片是最佳的选择方案。

用此芯片可以直接将8个单端模拟信号输入,分时进行数据采集,转换。

3.32.单片机控制ADC方案比较:

用单片机控制ADC通常有两种方式。

一种是查询法,另外一种是中断控制法。

查询法是单片机不断地对EOC状态进行读取。

当发现EOC变化时,则单片机便对转化好的数据进行读取。

中断控制法则是当ADC变换结束后向单片机发送中断请求,然后进入中断服务进行想干操作。

查询法是用在对转换时间不高的工程中,而中断方法则应用在转换时间高的工程当中,在此次设计中,选择中断方式控制ADC。

3.33.显示方案比较:

(1)端口接线及数码管数选择:

由于本次实验显示的数据是从24C01中读取的,因此是在另外一片单片机上进行显示的。

由于该单片机的闲置端口足够提供控制显示器端口,因此不需要外加其它高级芯片。

如果端口数量不够,可以采样扩展端口,此类芯片有比较熟悉的8155芯片或者8255等等。

由于精度要求达到0.1%,因此,这里用8只数码管,3只用来显示通道数,4只用来显示数值。

(2)显示方法:

显示方法有动态显示与静态显示两种方法。

动态显示需要对CPU时刻对显示器进行数据刷新,显示数据会有闪烁感,占用的CPU时间多。

静态显示数据稳定,但是接线复杂。

这两种方法各有利弊,故当显示装置中有多个多段LED式,通常采用动态扫描驱动电路在该单片机系统中,使用7段LED显示器构成8位显示器,段选线控制显示的字符,位选线控制显示位的亮或暗。

3.34.双机通信接口方案比较:

由于此次设计是在PROTEUS上仿真的,因此不需要外加双机端口之间的诸如电平转换器、串行通信RS-232、RS-485.直接利用单片机串行接口相互连接发送便可。

3.35.外部拨码开关的方案比较:

由于通常都用switch开关来控制单片机,以便达到我们人所需要的条件。

但在此次设计中,由于在PROTEUS软件中8个switch不仅占用空间,而且还不好控制,故选择dipsw拨号开关,这个开关switch功能一样,但体积小,而且可以同时全部开,全部关,故选择dipsw开关。

 

3.4、电路设计(图示)

 

3.5、模块分析

此系统中共用到的模块如下:

ADC数据采集模块、发送机发送模块、接收机接收模块、24C01存储模块、LED数码管显示模块、采集速率处理模块。

(1)ADC数据采集模块:

在此模块中,主要是ADC采集数据是的时序处理,主要处理的拐角为0E(输出允许),START(开始转换),而EOC拐角则用来充当中断信号源

(2)发送机发送模块:

在此模块中,主要是一个中断控制处理,即当ADC转换完后,产生了一个下降沿触发信号时,发送模块进入中断,对数据进行发送,否则不发送数据,在此模块中当TI=1,进入中断以后,要用软件清零。

(3)接收机接收模块:

与发射机对应,波特率要设置成与发射机波特率相同,而且也是在收到信号后进入中断处理。

将收到的数据存到24C01芯片中。

否则,一直调用显示功能。

在此模块中,当RI=1,进入中断以后,要用软件清零

(4)24C01模块:

在此模块中,主要是处理SCK与SDA的时序问题,由于它是串行读取数据的,因此,时序出错,便不能得出数据来。

在24C01的读写过程中,地址很重要,在写过程中,要先写地址,再写数据。

在读过程也是先写入地址,在读数据。

(5)LED数码管显示模块:

在此模块中,主要是考虑将采集到的数据正确地显示处理,给操作者一个非常直观的界面。

在这个模块中要处理的一个难题是:

如何不让数码管跳动显示。

软件实现过程主要控制好段选与位选,以及延时时间上的处理。

(6)采集速率处理模块:

在此模块中,主要处理时间问题,即如何通过定时器到达用户的要求,实现人机信息交换。

在软件实现过程中,需要注意定时寄存器的重新赋值。

3.42.小结:

经简单理论分析,本系统数据采集核心采用ADC0808,单片机系统选用80C51构成的最小系统,用LED动态显示采集到的数据,数据通过80C51串行端口传输,实现单片机与单片机之间的通信。

 

3.6、实验流程图

 

3.7、程序主体

//******************************************************************************

(1)ADC采集、发送机数据处理、数据发送的程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitST=P3^5;

sbitOE=P3^7;

uchargetdata,picknum,t=0,Total=0;

voiddelay(uintt)//单位延时1ms,总延时1ms*t.(120为实验测试值)

{

uinti,j;

for(i=0;i

for(j=0;j<121;j++);

}

voiddelay1()

{;;}

voidSend(uchardat)

{

SBUF=dat;

while(!

TI);

TI=0;

}

voidmain(void)

{

P2=0x00;//从0端口开始

TMOD=0x21;//定时器1工作在方式2

SCON=0x40;//串口工作方式1

PCON=0x00;//波特率位9600b/s

TH1=0xfd;

TL1=0xfd;

TR1=1;

TH0=(65536-50000)/256;//定时器0控制采集速率

TL0=(65536-50000)%256;

ET0=1;

IT0=1;

EX0=1;

EA=1;

TR0=1;

while

(1)

{

picknum=P0;

}

}

voidTimer_0()interrupt1//中断处理

{

TR0=0;//关中断

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t++;

if(t==20)//t=20,则是1S时间

{

Total++;

t=0;

}

if(picknum==0)//如果拨码开关是0,则将其置1.

picknum=1;

if(Total==picknum)//经历时间与人为设定的时间相同,则进入中断进行数据采集

{

P1=0xff;

OE=0;

ST=0;

delay

(1);

ST=1;

delay1();

ST=0;

Total=0;

}

TR0=1;//开中断

}

voidinter_0()interrupt0//当ADC转换好了后,则EOC下降沿触发中断

{

TR0=0;

OE=1;

getdata=P1;

delay

(1);

OE=0;

Send(getdata);//在中断里面发送数据

delay(100);

P2++;

if(P2==0x08)

P2=0x00;

TR0=1;

}

//******************************************************************************

(2)接收机接收、存储、显示的程序如下:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#include<24C01_head.h>//包含24C01头文件

uchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80};//0~9数字(共阴CC)

uchartime[]={8,8,8,8,8,8,8,8};

ucharnum,getdata,room=0,a,count=0x08;

voiddelay(uintt)//单位延时1ms,总延时1ms*t.(120为实验测试值)

{

uinti,j;

for(i=0;i

for(j=0;j<121;j++);

}

uchardate_deal(uchartemp)//二进制转化为十进制

{

ucharcont=1,sum=0,i;

for(i=0;i<8;i++)

{

if(temp&0x01)

sum=sum+cont;

cont=cont*2;

temp=temp>>1;

}

returnsum;

}

voidsum_change(ucharsum)//数据处理

{

floatc;

uintcont;

c=8000/255.0*sum;

cont=c/1;

time[3]=cont/1000;

time[5]=(cont%1000)/100;

time[6]=((cont%1000)%100)/10;

time[7]=((cont%1000)%100)%10;

}

voiddisp()//显示子程序

{

uchari;

if(count==0x08)

{

P0=0xff;

P2=0x00;

}

else

{

for(i=0;i<8;i++)

{

P2=dispbitcode[i];

if(i==0)

P0=table[count];

elseif(i==1||i==2)

P0=table[10];

elseif(i==4)

P0=table[11];

else

P0=table[time[i]];

delay(3);

P2=0xff;

}

}

}

voidmain(void)

{

P2=0xff;

TMOD=0x20;//定时器T1工作于方式2

SCON=0x50;//串口工作方式1,允许接受(REN=1)

PCON=0x00;

TH1=0xfd;//波特率9600hz

TL1=0xfd;

TR1=1;

REN=1;

SM0=0;

SM1=1;

EA=1;

ES=1;

init();

while

(1)

{

disp();//显示数据

}

}

voidser()interrupt4//串行中断

{

RI=0;

write_add(room,SBUF);

delay(20);

getdata=read_add(room);//读24C01里面的数据

room++;//控制内存地址

if(room>=8)

room=0;

num=date_deal(getdata);//处理数据

sum_change(num);

count++;

if(count>=8)//控制显示的数据

count=0;

}

//************************24C01_head.h头文件***********************************

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitsda=P1^7;

sbitscl=P1^6;

voidstart()//开始信号

{

sda=1;

_nop_();

scl=1;

_nop_();

sda=0;

_nop_();

}

voidstop()//停止

{

sda=0;

_nop_();

scl=1;

_nop_();

sda=1;

_nop_();

}

voidrespons()//应答

{

uchari;

scl=1;

_nop_();

while((sda==1)&&(i<250))i++;

scl=0;

_nop_();

}

voidinit()

{

sda=1;

_nop_();

scl=1;

_nop_();

}

voidwrite_byte(uchardate)//写一个字节

{

uchari,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

_nop_();

sda=CY;

_nop_();

scl=1;

_nop_();

}

scl=0;

_nop_();

sda=1;

_nop_();

}

ucharread_byte()//读一个字节

{

uchari,k;

scl=0;

_nop_();

_nop_();

for(i=0;i<8;i++)

{

scl=1;

_nop_();

k=(k<<1)|sda;

scl=0;

_nop_();

}

returnk;

}

voidwrite_add(ucharaddress,uchardate)//向一个地址里面写数据

{

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

ucharread_add(ucharaddress)//从一个地址里面读数据

{

uchardate;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

returndate;

}

//***********************************程序结束**********************************

3.8、系统效果

说明:

由于有8路采集,故用总电源电压为8V的直流电源,7个分压电阻,全为1K,再加一个滑动变阻器,阻值也为1K.够成电阻网络,这样能使结果易读。

图一:

初始显示

图二:

0通道显示

 

图三:

改变滑动变阻器,显示0通道

 

图四:

在三的基础上改变拨码开关,显示0通道

 

图五:

在图二的基础上,显示通道1

结合图说明:

图一时刚刚开始上电时,所有LED管全都显示,以验证数码管全都可以正常工作。

图二与图三比较,说明了,变化滑动变阻器是采集的数据变化,从而输出地数据也变化了。

图三与图四相比,说明了,在其他条件不变的情况下,拨动开关的大小会影响数据采集速率(由下面PROTEUS经历的时间大小可以看出)

图二与图五比较,说明了,正常显示下,而不是一直显示0通道。

3.9、错误处理及解决方案

3.91.在采样数据采样回来后,数码管显示总是不对,总是没有规律的显示。

解决方案:

单步调试

发现错误:

原来错误在,ADC0808转换后输出地数据对应到单片机输入端是相反的连接。

即若转换好的数据若为0xbf,在OUT0接P0的情况下,P0=0xfb,而我们要得到0Xbf,因此,硬件连接的时候要首尾对应。

3.92.无论怎么样采集,各路通道采集会来之后总是显示相同数值

解决方案:

接电压表读数

发现错误:

原来错误在,模拟仿真毕竟与实际情况不同,我用了8V的电源,但是电源的负极没有接地,因此整个系统相当于没有接地。

3.93.无论如何,ADC0808都不能工作

解决方案:

与以往写过的ADC0808进行比较

发现错误:

原来错误在,我接的时钟脉冲接错了,不小心接成了一个有边沿的脉冲,而不是时钟脉冲

4.0、实验总结

4.01.这是第一次自己设计了一个小小的系统,并且学会了很多PROTEUS新的知识,这是以前没有学过的,而且也学会了书本中一带而过的知识点,即双机通讯以及EEPROM的读写。

4.02.开始学会总体布局,由于PROTEUS布局界面有限,故如果最开始不布局,则可能功亏一篑,又得重新画图连线。

4.03.培养了在出现错误后自己通过调试,找出错误点,然后解决错误的能力。

自己写的程序只有自己知道构造,因此别人很难帮助你解决问题,只能自己一步一步慢慢调试解决。

4.04.整个大系统应该分布进行,一个一个模块化,当各个模块都成功的时候,连接它们,使它们共同运作也需要小心衔接部分

4.05.通过这次设计性试验,我了解了数据采集的全过程,也体会到了数据采集的重要性。

四、结论

此次试验是在PROTEUS上仿真,仿真效果良好,也不会出现实际工程上出现的问题。

但是在实际工程中还得考虑远距离传输的匹配问题,若传送距离达5KM,则接口RS485至少需要4片。

而且还得考虑各种噪声、滤波、高频影响等等。

五、参考文献

本部分列出撰写论文过程中所参考的文章、书本及其它文献。

【1】张毅刚.新编MCS-51单片机应用设计.哈尔滨工业大学出版社.2006年10月第二版

【2】王东锋.单片机C语言应用100例.电子工业出版社.2009年3月第一版

【3】郭天祥.10天学会单片机和C语言编程

六、附录

附录A:

中断控制寄存器

▪EX0(IE.0),外部中断0允许位;

▪ET0(IE.1),定时/计数器T0中断允许位;

▪EX1(IE.2),外部中断0允许位;

▪ET1(IE.3),定时/计数器T1中断允许位;

▪ES(IE.4),串行口中断允许位;

▪EA(IE.7),CPU中断允许(总允许)位。

控制寄存器TCON

80C51串行口的控制寄存器

附录B:

数码管结构

 

附录C:

串行通讯

80C51串行口的结构

 

方式一:

 

波特率表:

附录D:

24C01时序

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1