基于单片机数据采集系统设计说明.docx
《基于单片机数据采集系统设计说明.docx》由会员分享,可在线阅读,更多相关《基于单片机数据采集系统设计说明.docx(23页珍藏版)》请在冰点文库上搜索。
基于单片机数据采集系统设计说明
前言
数据采集系统是结合基于计算机的测量软硬件产品来实现灵活的、用户自定义的测量系统,它主要完成数据信息的采集、A/D转换、压缩处理,然后通过PC接口总线将处理后的数据送入计算机作进一步处理。
随着计算机技术的飞快发展和普与,以数据采集系统为核心的设备也迅速在国外得到了广泛的应用,现代工业生产和科学研究对数据采集的要求越来越高,如在工业控制中现场数据的采集,温度、压力等数据的采集,在比较重要场所安装的监控设备,还有视频会议、可视等场合中,都需要进行高速数据采集。
现在常用的采集方式是数据采集板卡,常用的有A/D采集卡以与422、485等总线板卡,采用板卡不仅安装麻烦,价格昂贵,容易受到机箱环境的干扰,通讯过程中极易产生错误,而且由于计算机插槽数量和地址、中断资源的限制,不可能挂接很多设备,在一些电磁干扰性强的测试场所,可能无法专门对其作电磁屏蔽,从而导致采集的数据失真,针对上述问题,急需采用新的技术解决。
通用串行总线(UniversalSerialBus)的出现,很好的解决了以上这些问题。
它是由Compaq、Hp、Intel、Lucent(朗讯)、Microsoft、NEC和Philips七家公司联合推出的新一代标准口总线,该总线是一种连接外围设备的机外总线,最多可连接127个设备,为微机系统扩充和配置外部设备提供了方便,不仅解决了I/O插口不够的问题,而且建立了一条连接和访问外设的方法,这些方法可以有效的减少总体成本,减少硬件冲突。
因此,我们能够利用USB总线接口比较容易的实现低成本、高可靠性的多点数据采集系统。
由于USB的种种优点,被越来越多的厂商和用户所接受,出现了USB打印机、摄像机等产品。
尽管目前USB接口的应用主要集中在电脑的周边外设,但是USB产品进入工控领域将是必然的趋势,所以本课题的研究是具有一定的现实意义和经济意义的。
第一章基于单片机的温度数据采集系统设计方案
1.1系统设计任务与要求
本次设计是基于单片机的数据采集系统设计,包括数据的采集与控制模块、数据的显示模块、数据的传输模块与数据的报警控制模块等。
由于温度数据采集技术日渐成熟,且温度数据采集应用围比较广,所以这次采集的数据是温度。
温度传感器热电阻是中低温区最常用的一种温度检测器。
它的主要特点是测量精度高,性能稳定。
其中铂热电阻的测量精确度是最高的,它不仅广泛应用于工业测温,而且被制成标准的基准仪。
1.2系统总体方案的设计
本次设计采用DS18B20温度传感器,因为其芯片兼容了A/D转换模块,所以在其设计上可以简化A/D转化模块,对于其它的优点将在元件介绍中详细说明。
本次设计还设计有LCD液晶显示模块,使温度可以直接显示出来,被人们直接观察到。
通信模块采用TTL转USB的串口通信,芯片采用接法简单、使用方便的PL2303芯片。
它是一集成模块,用最简单的外部电路、最少的外部器件和最小的电路板面积实现USB2.0到UART的转换。
PL2303外围电路非常简单,而与单片机连接时,只要将它的TXD和RXD连到单片机的RXD和TXD就行了
.1.3系统工作流程,见图1-1
图1-1系统工作流程
1.4系统硬件、软件介绍
1.4.1本系统所用的硬件有:
见表1-2。
表1-2系统硬件清单
器件名称
数量
AT89S52单片机
1个
LCD1602
1个
DS18B20
1个
蜂鸣器
1个
TTL转USB模块
1个
PNP
1个
下载线
1个
电容
若干
电阻
若干
导线
若干
1.4.2软件组成
软件有:
keil软件、windows操作系统和串口调试助手等软件组成。
第二章数据采集系统主要元件介绍
2.1AT89S52单片机介绍
2.1.1AT89S52单片机的特点与引脚
AT89C52是一个低电压,高性能CMOS8位单片机,片含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89S52具有以下标准功能:
与MCS51兼容;
8K支持在线编程(ISP)的FLASH结构程序存储器,1000次擦写寿命;
工作电压为4.0V~5.5V;
全静态工作:
0~24MHz;
3级程序安全加密保护;
256*8位部RAM;
32个可编程I/O端口;
3个16位定时器/计数器;
8个中断源;
一个全双工异步串口;
支持低功耗与掉电模式;
支持中断从掉电模式唤醒;
置看门狗;
双数据指针;
工业级产品,温度围(-40°C到85°C),PU为无铅环保产品。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口中断继续工作。
掉电保护方式下,RAM容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
其PDIP图如右图所示:
2.1.2AT89S52芯片的引脚介绍
VCC:
电源。
GND:
地。
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用做高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有部上拉电阻。
在Flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
在程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TT逻辑电平。
当对P1端口写“1”时,部上拉电阻把端口拉高,此时可以作为输入口使用。
当作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作为定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如表1-1所示。
在Flash编程和校验时,P1口接收低8位地址字节。
P2口:
P2口是一个具有部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TT逻辑电平。
对P2端口写“1”时,部上拉电阻把端口拉高,此时可以作为输入口使用。
当作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。
在访问
表1-1P1口部分管脚的第二功能
外部程序存储器或用16位地址读取外部数据存储器(如执行MOVXDPTR)时,P2口送出高8位地址。
在这种应用中,P2口使用很强的部上拉发送1。
在使用8位地址(如MOVXRI)访问外部数据存储器时,P2口输出P2锁存器的容。
在Flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TT逻辑电平。
对P3端口写“1”时,部上拉电阻把端口拉高,此时可以作为输入口使用。
当作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。
P3口也作为AT89S52特殊功能(第二功能)使用,如表1-2所示。
在Flash编程和校验时,P3口也接收一些控制信号。
表1-2P3口部分管脚的第二功能
RST:
复位输入。
在晶振工作时,RST脚持续两个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
在DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)在访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚(PROG)也用做编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行部程序指令,EA应该接VCC。
在Flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.2DS18B20数字温度传感器介绍
2.2.1DS18B20概述
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
2.2.2DS18B20产品概述
(1).只要求一个端口即可实现通信。
(2).在DS18B20中的每个器件上都有独一无二的序列号。
(3).实际应用中不需要外部任何元器件即可实现测温。
(4).测量温度围在-55。
C到+125。
C之间。
(5).数字温度计的分辨率用户可以从9位到12位选择。
(6).部有温度上、下限告警设置。
2.2.3DS18B20引脚图与引脚功能介绍
TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图1
表1DS18B20详细引脚功能描述
2.2.4.DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
2.2.5DS18B20的复位时序
2.2.6DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
2.2.7DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之就得释放单总线。
2.3显示模块
显示系统是单片机不可或缺的环节,它为单片机提供了直观的观察环境。
单片机显示模块应该能够做到快速简练,并且有语义明确,这对使用单片机具有很关键的作用。
本实验系统涉与到两种显示方式,液晶显示和LED数码管显示,这两种显示方法在生活中被广泛的应用,学习这两种显示方法对于单片机系统的开发与设计有很大的意义。
2.3.1LCD概述
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于一样点阵的图形液晶模块。
2.3.2基本特性
低电源电压(VDD:
+3.0--+5.5V)
显示分辨率:
128×64点
置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
置128个16×8点阵字符
2MHZ时钟频率
显示方式:
STN、半透、正显
驱动方式:
1/32DUTY,1/5BIAS
视角方向:
6点
背光方式:
侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
通讯方式:
串行、并口可选
置DC-DC转换电路,无需外加负压
无需片选信号,简化软件设计
工作温度:
0℃-+55℃,存储温度:
-20℃-+60℃
2.3.3引脚定义
LCD12864模块的20个引脚定义如下:
1.Vss 逻辑电源地
2.VDD 逻辑电源正5v
3.V0 LCD驱动电压
4.RS 数据/指令选择:
高电平为数据,低电平为指令
5.R/W 读/写选择:
高电平为读数据,低电平为写数据
6.E 读写使能,高电平有效,下降沿锁定数据
7.DB0 数据输入输出引脚
8.DB1 数据输入输出引脚
9.DB2 数据输入输出引脚
10.DB3 数据输入输出引脚
11.DB4 数据输入输出引脚
12.DB5 数据输入输出引脚
13.DB6 数据输入输出引脚
14.DB7 数据输入输出引脚
15.CS1 片选择号,低电平时选择前64列
16.CS2 片选择号,低电平时选择后64列
17.RET 复位信号,低电平有效。
18.VEE 输出-15v电源给V0提供驱动电源
19.A 背光电源LED正极
20.K 背光电源LED负极
2.3.4基本电路图与时序图
基本连接电路图如下图3.6
图3.6
串行连接时序图
图3.7
第一字节:
作用是控制数据:
其格式是:
11111ABC。
其中:
A为数据传送方向控制:
H表示数据从LCD到MCU,L表示数据从MCU到LCD;B为数据类型选择:
H表示数据是显示数据。
L表示数据是控制指令;C固定为0
第二字节:
表示数据的高4位,格式是DDDD0000
第三字节:
表示数据的低4位,格式是0000DDDD
[第三章数据采集系统硬件设计
3.1数据采集与控制模块
DS18B20温度传感器与单片机的接口电路设计
DS18B20与单片机之间一根导线进行数据传输,不需要对数据进行转换,接线简单。
DS18B20的温度分辨率为0.0625,所以对温度值可以进行准确的温度转换。
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,单片机端口接单线总线,为保证在有效的DS18B20时钟周期提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
3.2数据显示模块
AT89S52单片机与液晶显示LCD1602连接
3.3数据传输模块
3.4报警系统设计模块
6.2LED显示程序设计31
6.3报警系统的程序设计32
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineufloatunsignedfloat
sbitEN=P1^3;//1602使能引脚
sbitRW=P1^4;//1602读写引脚
sbitRS=P1^5;//1602数据/命令选择引脚
sbitbaojing=P3^2;
sbitDQ=P1^6;
floattemperature;
uintcount
voidDelay(intj)//1延时函数100um65000
{uchari;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDdelay(uinti)
{
while(i--);
}
//初始化函数
voidInit_DS18B20(void)
{
ucharx=0;
DQ=1;//DQ复位
Ddelay(8);//稍做延时
DQ=0;//单片机将DQ拉低
Ddelay(80);//精确延时大于480us
DQ=1;//拉高总线
Ddelay(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
Ddelay(20);
}
//读一个字节
ucharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Ddelay(4);
}
return(dat);
}
//写一个字节
voidWriteOneChar(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Ddelay(5);
DQ=1;
dat>>=1;
}
Ddelay(4);
}
//读取温度
floatReadTemperature()
{uchardisp[6];
floattemperature;
uchartb=0,ta=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
ta=ReadOneChar();//读取温度值低位
tb=ReadOneChar();//读取温度值高位
{
disp[0]=((tb<<4)|(ta>>4))/100+'0';//百位
disp[1]=(((tb<<4)|(ta>>4))%100)/10+'0';//十位
disp[2]=(((tb<<4)|(ta>>4))%100)%10+'0';//个位
disp[3]='.';
disp[4]=((ta&0x0f)*625)/1000+'0';//十分位
temperature=(disp[0]-'0')*100+(disp[1]-'0')*10+(disp[2]-'0')+(disp[4]-'0')*0.1;
}
return(temperature);
}
/******************************************************/
ucharBusy_check()//判断忙函数LCD1602
{ucharLCD_Status;
P2=0xff;
RS=0;//0输入指令,1输入数据
RW=1;//0写入指令或数据,1读信息
EN=1;//1读取信息,1-0写指令或数据
Delay(10);
LCD_Status=P2;
EN=0;
returnLCD_Status;//返回状态
}
voidWrite_LCD_Command(ucharcmd)//写LCD命令
{
while((Busy_check()&0x80)==0x80);//D7=1禁止操作,D7=0,允许操作
RS=0;
RW=0;
EN=0;
Delay
(2);//延时
P2=cmd;
Delay
(2);
EN=1;
Delay(10);
EN=0;
}
/**********************************************************/
voidWrite_LCD_Data(uchardat)//向lcd发送数据
{
while((Busy_check()&0x80)==0x80);
RS=1;RW=0;EN=0;
P2=dat;
Delay
(2);
EN=1;
Delay(10);
EN=0;
}
/**********************************************************/
voidInitialize_LCD()//LCD初始化
{
Write_LCD_Command(0x38);//工作方式为:
数据总线8位,显示两行,5*7点阵
Delay(10);
Write_LCD_Command(0x01);//清屏
Delay(10);
Write_LCD_Command(0x06);//字符进入模式:
屏幕不动,字符后移
Delay(10);
Write_LCD_Command(0x0c);//显示开,关光标
Delay(10);
}
/**********************************************************/
voidDisplayListChar(ucharx,uchary,uchar*s)//显示字符串函数x从0开始表示最左边第一个
{
if(y==0)
{
Write_LCD_Command(0x80+x);//表示第一行
}
else
{
Write_LCD_Command(0xC0+x);