数据采集报告.docx
《数据采集报告.docx》由会员分享,可在线阅读,更多相关《数据采集报告.docx(18页珍藏版)》请在冰豆网上搜索。
数据采集报告
对温度、光强数据采集系统的实现
摘要:
本数据采集系统是以AT89C52单片机为核心,通过ADC0809模数转换器模块对外围数据温度、光强两个参数同时进行采集,然后通过LCD1602液晶显示实时显示采集到的数据。
在基于Proteus的单片机的多路数据采集系统的仿真设计的准确无误的基础上,进行电路的焊接、调试,最终实现该数据采集系统的设计。
数字温度、光强显示计主要由温度检测电路、光强检测电路、ADC0809模数转换器、AT89C52单片机、LCD1602液晶等几部分组成。
温度检测电路主要由LM35与一个同相比例运算放大电路串联,光强检测电路由一个光敏电阻与一个电阻串联组成。
温度、光强两个模拟信号经过AD转换器转换为数字信号后送入单片机,处理后用LCD1602显示采集到的数据。
关键词:
AT89C52单片机AD0809模数转换器LM35LCD1602
一、引言
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
本文基于Proteus的单片机多通道数据显示系统的设计,由单片机对外界多路模拟量进行采集,由各路传感器提供数值,再通过AD转换进行模数转换,然后由液晶显示。
在Proteus准确的仿真设计下,进行电路的焊接、调试,最终实现该数据采集系统的实现。
二、设计方案
2.1、电路系统框图
确定该数据采集系统由温度检测模块、光强检测模块、主控模块、显示模块组成。
电路系统框图如图
(1)所示。
图
(1)
2.2、显示方案选择
方案1:
用LED显示。
这种方法尽管电路简单,成本低廉,但是显示的字符数据很有限,比如有些单位字符无法显示。
方案2:
用LCD显示。
这种方法显示更加直观,而且显示的字符更加广泛。
与较方案1比较,我们选择方案2.
2.3、测温元件方案的选择
方案1:
由于本电路是一个测温电路,可以使用热敏电阻之类的器件利用其感温效应,再将随着被测温度变化的电压和电流采集过来,进行A/D转换之后,通过单片机进行处理,再进过LCD显示出来。
这种方案设计上较为复杂。
方案2:
LM35系列精密摄氏温度传感器是美国NS公司产品,LM35系列是精密集成电路温度传感器,其输出的电压特性线性地与摄氏温度成正比。
因此,LM35比按绝对温标校准的线性温度传感器优越得多。
LM35系列传感器生产制作时已经过校准,输出电压与摄氏温度一一对应,使用极为方便。
灵敏度为10.0mv/℃,精度在0.4℃至0.8℃(-55℃至+150℃温度范围内),重复性好,低输出阻抗,线性输出和内部精密度校准使其与读出或控制电路接口简单和方便,可单独电源和正负电源工作。
相比之下,我们选择LM35作为我们的温度检测。
2.4、光强检测方案
光敏电阻器是一种对光敏感的元件,它的电阻值能随着外界光照强弱(明暗)变化而变化。
将它与一个电阻相串联,利用分压作用可以测出它两端的电压作为模拟信号输入。
2.5、温度检测电路模块设计
温度传感器用LM35,将LM35输出电压信号经过同相比例放大器放大。
因为为了减小误差,又考虑到ADC0809的电压范围是0V~+5V,将温度传感器的微弱的模拟信号放大到与A/D转换器满量程电压相应的电平值,以便充分利用A/D转换器的满量程分辨率。
因此把LM35与一个同相比例放大器相连。
2.6、显示电路模块设计
显示电路采用液晶LCD1602,它是一种字符型液晶模块,是一种采用5×7点阵图形来显示字符的16×2点阵液晶显示器。
其特点是:
亮度高、工作电压低、功耗小、易于集成、驱动简单、寿命长、耐冲击且性能稳定。
LCD1602与单片机接口采用串行方式控制。
2.7、分频电路设计
考虑到数据采集系统采样频率为0.5HZ,又因为AT89C52单片机的的ALE引脚的输出频率是内部时钟频率的1/6,因此用两个D触发器将ALE端的时钟频率四分频,作为AD0809的时钟信号。
三、硬件电路设计
3.1、理论计算
(1)同相比例运算放大电路的输出电压Vo的计算
由于由LM35采集回来的模拟信号电压很微弱,为了充分发挥A/D转换器的满量程分辨率,需要利用放大电路将微弱的输入信号进行放大,在设计当中我们将微弱信号放大了3.5倍。
计算公式如下:
Vo=
3.2、模块电路及元件参数
(1)、电源指示灯
图
(2)
(2)、温度检测电路(温度传感器LM35和同相比例放大器)
图(3)
(3)、光强检测电路
图(4)
(4)、分频电路
图(5)
(5)、液晶显示电路
图(6)
3.3、ADC0809与AT89C52接口设计
(1)、ADC0809的各个引脚及功能
图(7)
1~5、26~28,IN0~IN7:
8路模拟量输入端。
14~15、8、17~21,D0~D7:
8位数字量输出端。
23~25,ADDA、ADDB、ADDC:
3位地址输入线,用于选通8路模拟输入中的一路
22,ALE:
地址锁存允许信号,输入,高电平有效,对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。
6,START:
A/D转换启动信号,输入高电平有效,START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。
本信号有时简写为ST.
7,EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9,OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量,用于控制三态输出锁存器向单片机输出转换得到的数据。
OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。
10,CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ,EOC=0,正在进行转换;EOC=1,转换结束。
使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。
12、16,REF(+)、REF(-):
基准电压。
11,Vcc:
电源,单一+5V。
13,GND:
地
(2)、ADC0809的工作原理
当通道选择地址有效时,ALE高电平信号一出现,地址便马上被锁存,这时转换启动信号START紧随ALE之后(或与ALE同时)出现。
START的上升沿将逐次逼近寄存器SAR复位,ADC0809下降沿时启动芯片,开始AD转换,转换期间START始终为低电平。
ADC上升沿出现后的2μs8个时钟周期内(不定),EOC信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。
微处理器收到变为高电平的EOC信号后,便立即送出高电平OE信号,打开三态门,读取转换结果。
根据方案的选择,该数据采集系统由单片机AT89C51及其外围的晶振电路和电源指示电路、温度检测电路、光强检测电路、ADC0809、同相比例运算放大电路、LCD1602液晶显示模块几部分组成,其电路的总图见附录。
(3)、ADC0809与AT89C52接口设计图
图(8)
四、软件设计
4.1系统主程序流程图
图(9)
程序流程图说明:
程序开始首先进行1602液晶屏幕清屏操作、1602液晶显示初始设置(1.显示模式设置为16*22.指针自加一3.初始化指针位置在第一行第一列)、书写格式说明,然后进入中断函数初始化设置。
程序进入while循环,打开中断,选择ADC0809的模拟信号输入通道,当ADD_A=0,ADD_B=0,ADD_C=0时,选择通道IN0,进行温度数据采集,当ADD_A=1,ADD_B=0,ADD_C=0,选择通道IN1,进行光照数据采集,最终通过ADC0809将模拟信号转换数字信号,通过数据转换,让数据通过LCD1602显示。
4.2、系统C语言程序(见附录)
五、系统调试与测试
将电路焊接结束,用万用表检测芯片的引脚及线与线之间是否有无误。
再检测各个模块电路是否能正常工作。
在检测无误的情况下,下载所编写的程序,看显示所测得的数据是否满足所达到的要求。
看采样频率是否到达0.5HZ,温度的测量精度是否为1摄氏度,光强的精度是否达到0.5%。
如果显示数据结果不对,再不断调试所编写的程序,直到达到设计要求。
5.1、测试条件
单一电源+5V、同相放大电路电压
5.2、测试仪器
数字万用表、双踪示波器、双路稳压电源
5.3、测试数据
测试数据见下表:
表中温度电压是万用表测得的LM35随温度变化的电压经同相比例放大器放大后的电压,光强电压是光敏电阻随光照强度变化的电压。
(1)温度测试数据:
电压/V
0.17
0.68
1.19
1.7
2.21
2.72
3.23
3.57
温度/C
5
20
35
50
65
80
95
105
(2)光强测试数据:
电压/V
0.26
0.63
1.05
1.26
1.89
2.31
2.73
3.15
光强/%
5.0
15.5
25.0
35.0
45.5
55.5
65.0
75.5
由以上测得数据看出,测得的温度精度为1摄氏度,光照精度0.5%。
满足设计要求。
六、结束语
通过基于51单片机的对外围电路的温度、光照的数据采集,学到了许多新的知识,为后面学习打下了良好的基础。
附录:
1、系统主程序
#include
#include
sbitADD_A=P3^5;
sbitADD_B=P3^6;
sbitADD_C=P3^7;
sbitSTART=P3^1;
sbitOE=P3^0;
#defineADP1
#defineDP0
unsignedchari=5;
unsignedcharAD_result,display,cnt=0;
voidSLE_channel(unsignedcharchannel);
voiddelayms(unsignedcharxms);
voidtimer1_init(void);
unsignedcharADC_get_data(void);
voidLight(unsignedcharL_data);
unsignedcharsi_she_wu_ru(unsignedcharpre_data);
voidmain(void)
{
LCD_CLR_screen();//液晶清屏操作
lcd_1602_init();//初始化液晶,2x165x7
LCD_1602_printf(1,1,"L(%)T(C)%d");//辅助提示符
timer1_init();//定时器0的初始化
while
(1)//loop
{
}
}
//------------delay
voiddelayms(unsignedcharxms)//延时函数
{
unsignedintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
//------------温度转换函数
unsignedcharsi_she_wu_ru(unsignedcharpre_data)
{
unsignedcharchar_temp,temp;
floatfloat_temp;
char_temp=pre_data*0.55;
float_temp=pre_data*0.55;//温度函数
if((float_temp-char_temp)>=0.5)//四舍五入处理
{
temp=char_temp+1;
}
else
{
temp=char_temp;
}
returntemp;
}
//------------光强转换函数
voidLight(unsignedcharL_data)
{
unsignedinttemp=5;
unsignedchartemp_yu,temp_mo;
temp=102-(unsignedchar)(L_data/2.15);//光强函数
temp=temp*10;
temp_mo=(temp/10);//取光强的整数部分
temp_yu=(temp%10);//取光强的小数部分
if((temp_yu>=0)&&(temp_yu<5))//精度处理部分1:
(0-5)改为02:
(6-9)改为5
{
temp_yu=0;
}
else
{
temp_yu=5;
}
LCD_1602_print_number(2,1,2,(unsignedint)temp_mo);//显示整数部分数字
LCD_1602_print_char(2,3,'.');//显示小数点
LCD_1602_print_number(2,4,1,(unsignedint)temp_yu);//显示小数部分数字
}
//------------ADC通道选择函数
voidSLE_channel(unsignedcharchannel)
{
switch(channel)
{
case5:
//通道5为温度通道
{
ADD_A=1;
ADD_B=0;
ADD_C=1;
break;
}
case6:
//通道6为光强通道
{
ADD_A=0;
ADD_B=1;
ADD_C=1;
break;
}
default:
//非法通道时,选择温度通道
{
ADD_A=1;
ADD_B=0;
ADD_C=1;
break;
}
}
}
//------------ADC0809开启转换函数
voidADC_start(void)
{
START=0;
START=1;//开启转换
delayms
(1);
START=0;
}
//-----------读取AD转换的结果
unsignedcharADC_get_data(void)
{
unsignedcharAD_data;
delayms
(1);//转换时间
OE=1;//输出使能
AD_data=AD;//获取ADC的转换结果
OE=0;//输出禁止
returnAD_data;//返回转换结果
}
//-------------定时器初始化函数
voidtimer1_init(void)
{
TMOD=0x01;//16位工作模式
TH0=(65536-50000)>>8;//定时时间为50ms
TL0=(65536-50000);
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//启动定时器
}
//--------------定时中断函数
voidtimer0()interrupt1
{//进中断先关闭总中断
EA=0;
TH0=(65536-50000)>>8;//重装初值
TL0=(65536-50000);
//-----------中断处理函数在此书写
cnt++;//统计进入中断的次数
if(cnt>=40)
{
cnt=0;//2秒后,清进中断的次数
if(i>=7)//往返取通道5,6
i=5;
SLE_channel(i);//选择模拟量的输入通道
ADC_start();//开启AD转换
AD_result=ADC_get_data();//获取结果
display=si_she_wu_ru(AD_result);//温度精度处理
switch(i)//选择显示通道
{
case5:
{
LCD_1602_print_number(2,8,3,(unsignedint)display);
break;
}
case6:
{
Light(AD_result);
break;
}
}
i++;
}
//-----------禁止在此书写
EA=1;
}
2、电路图:
.