51单片机温度采集报告.docx

上传人:b****7 文档编号:11328891 上传时间:2023-02-27 格式:DOCX 页数:26 大小:433.31KB
下载 相关 举报
51单片机温度采集报告.docx_第1页
第1页 / 共26页
51单片机温度采集报告.docx_第2页
第2页 / 共26页
51单片机温度采集报告.docx_第3页
第3页 / 共26页
51单片机温度采集报告.docx_第4页
第4页 / 共26页
51单片机温度采集报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

51单片机温度采集报告.docx

《51单片机温度采集报告.docx》由会员分享,可在线阅读,更多相关《51单片机温度采集报告.docx(26页珍藏版)》请在冰豆网上搜索。

51单片机温度采集报告.docx

51单片机温度采集报告

目录

1.摘要-----------------------------------------------3

2.前言-----------------------------------------------4

3.正文-----------------------------------------------5

4.结论----------------------------------------------19

5.参考文献------------------------------------------19

6.附录----------------------------------------------19

 

一、摘要

此系统主要以AD1674模数转换器和AT89C51单片机为核心,进行实时温度数据采集,数据处理和显示,终端接收及存储。

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

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

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

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

关键字:

AT89C51、温度采集、AD1674、双机通讯

 

二、前言

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

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

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

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

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

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

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

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

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

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

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

 

三、正文

3.1、设计要求

使用proteus作为开发工具,完成双机通讯的温度采集功能:

1、使用LM20温度传感器、AD1674模数转换器、AT89C51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5S)后通过串口发送到主机;

2、使用AT89C51单片机、4位拨码开关、LED显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3S),之后显示接收地址与温度信息,当接收时间间隔超过6S未收到数据,系统报警;

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

此系统主要以AD1674与80C51为中心,通过AD1674对LM20温度传感器采集数据,并将采集到的数据通过单片机串口传到另外一篇单片机中,并将其显示在数码管中。

由于LM20采集到温度会改变,AD1674采集到的数据也会变化。

需要利用定时器来控制数据的发送。

而波特率是由人通过拨码开关来控制的。

3.3、方案比较

3.31.采样器方案比较:

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

转化时间、转换精度。

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

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

AD1674是美国AD公司生产的12位逐次逼近式A/D转换器系列产品,它们转换精度高、速度快,内部设有时钟电路和参考电压源,其中AD1674还在片内集成了采样保持器,转换速度也最快,是AD574和AD674的升级换代产品。

但价格较高,适用于高精度快速采样系统中。

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

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

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

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

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

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

本次设计采用查询方法。

3.33.显示方案比较:

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

动态显示需要对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数据采集模块、发送机发送模块、接收机接收模块、LED数码管显示模块、传输速率处理模块。

(1)ADC数据采集模块:

在此模块中,主要是ADC采集数据是的时序处理,CE=1,CS=0,A0=0,RC=0,进行12位模数转换,STS由高电平变为低电平说明转换结束,单片机进行采集。

(2)发送机发送模块:

在此模块中,主要是查询法得知转换结束(STS由高电平变为低电平说明转换结束),将采集到数据进行一定处理后进行发送。

(3)接收机接收模块:

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

并且调用显示功能。

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

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

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

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

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

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

(6)传输速率处理模块:

在此模块中,主要处理波特率问题,即如何通过用户的要求,改变传输波特率,并且显示出来。

3.42.小结:

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

3.6、实验流程图

3.7、程序主体

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

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

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineaddo(10.0/4095.0)//转换进率,12位精度(2^12-1=4095),满量程为10V

uintnum;//计数次数

/*管脚定义*/

sbitSTS=P2^0;

sbitCS=P2^1;

sbitA0=P2^2;

sbitCE=P2^3;

sbitRC=P2^4;

/*毫秒延时函数*/

voiddelay_ms(uintn)

{

uinti;

while(n--)

{

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

}

}

/*读取AD1674转换结果*/

uintAD1674_Read(void)

{

uinttemp;

uchartemp1,temp2;

CS=1;

CE=0;//初始化,关闭数据采集

CS=0;

A0=0;

RC=0;

CE=1;//CE=1,CS=0,RC=0,A0=0启动12位温度转换

_nop_();

while(STS==1);//等待数据采集结束

CE=0;//芯片使能关闭

RC=1;

A0=0;

CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0允许高八位数据并行输出

_nop_();

temp1=P0;//读取转换结果的高八位

CE=0;//芯片使能关闭

RC=1;

A0=1;

CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1允许低四位数据并行输出

_nop_();

temp2=P0;//读取转换结果的低四位

temp=(temp1<<8)|temp2;//高位和低位合成实际温度,temp2为P0口的高四位

return(temp>>4);//返回转换结果,右移四位是因为temp2为P0口的高四位

}

/*数据发送*/

voidputbyte(ucharbyte)//利用硬件串口方式2发送一个字节数据

{

SBUF=byte;//将要发送的数据送到发送缓冲区域,系统自动发送

while(!

TI);//查询是否发送结束当TI=1代表发送结束

TI=0;//清发送结束位方便下一次发送

}

voidinit()

{

TMOD=0x21;//定时器为方式2

TL1=0xFD;

TH1=0xFD;//波特率为9.6K

TH0=(65536-50000)/256;//装初值实现50ms

TL0=(65526-50000)%256;

TR0=1;//启动定时器0

TR1=1;//启动定时器1

ET0=1;//开定时器0

SM0=0;//方式2

SM1=1;

RI=0;

TI=0;

REN=1;

EA=1;//开总中断

ES=1;//开串口中断

}

//设置波特率

voidset_bote(uchartemp)

{

if(temp==1)

{

TL1=0xE8;

TH1=0xE8;//波特率为1.2k

}

elseif(temp==2)

{

TL1=0xF4;

TH1=0xF4;//波特率为2.4K

}

elseif(temp==4)

{

TL1=0xFA;

TH1=0xFA;//波特率为4.8K

}

elseif(temp==8)

{

TL1=0xFD;

TH1=0xFD;//波特率为9.6K

}

}

/*主函数*/

voidmain(void)

{

inttemp,temp1;

uchara,temp2;

ucharj;

init();

/*查询法接收波特率*/

while

(1)

{

if(RI==1)

{

temp=SBUF;

set_bote(temp);//设置波特率

break;

}

}

while

(1)

{

while(num==160);//num计数100实现8秒的延时

num=0;

j=0;//温度正负标志位

temp=AD1674_Read();//读取转换后的12位温度值

temp=(int)((1.8528-temp*addo)*10000/11.79);//实现实际温度的转换

if(temp<0){temp=-temp;j=0x20;}//温度若为负,则标志位00100000

temp2=temp%10;//温度小数位存放在temp2中

temp=temp/10;

a=(uchar)temp;

putbyte(a);//发送温度

delay_ms(10);//延时一段时间

temp2=temp2+132;//温度小数位+132用于接收时的判断

putbyte(temp2);

delay_ms(10);//发送温度小数位

temp=P1;

temp=temp&0x0f;//地址为P1口的低4位

temp1=temp1<<4;

temp1=temp1|0xc0;//地址高位置1即11000000用于接收判断

temp=temp|temp1;

temp=temp|j;//正负标志位存于temp中

putbyte(temp);//发送地址

}

}

/*定时器0中断*/

voidt0()interrupt1

{

TH0=(65536-50000)/256;//装初值50000实现50ms

TL0=(65526-50000)%256;

num++;//计数次数

}//******************************************************************************

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

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

/*数码管显示’0‘-’9‘,‘-’,’C‘无小数点*/

ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6};

/*数码管显示’0‘-’9‘有小数点*/

ucharcodetable1[]={0x40,0x79,0x24,0x30,0x19,

0x12,0x02,0x78,0x00,0x10,0x3f};

/*位选信号选中数码管*/

uchardisbit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchardisnum[8],bote[4];//存放要显示的数据

//倒计时

uchardao[5]={0x92,0x99,0xb0,0xa4,0xf9};

uchartime1;

uchartime2;

ucharflag,num,num1,m,aa,cc;

sbitbeep=P1^7;//蜂鸣器报警

sbitled=P1^6;//红灯亮报警

/*延时子程序*/

voiddelay(uinti)

{

charj;

for(i;i>0;i--)

for(j=200;j>0;j--);

}

/*向缓冲器中写入要显示的数据*/

voidHEXTOBCD(uinttemp,uchara,ucharcc)

{

temp=temp*10+cc;

/*若为正数即0-130*/

if(a==0)

{

disnum[0]=temp/1000;//百位

disnum[1]=temp%1000/100;//十位

disnum[2]=temp%100/10;//各位

disnum[3]=temp%10;//小数位

disnum[4]=11;//显示C

disnum[5]=10;//显示-

}

/*若为负数即-55-0*/

elseif(a==1)

{

disnum[0]=10;//显示-

disnum[1]=temp/100;//十位

disnum[2]=temp%100/10;//个位

disnum[3]=temp%10;//小数位

disnum[4]=11;//显示C

disnum[5]=10;//显示-

}

}

voidinit()

{

SCON=0x50;

TMOD=0x21;//定时器为方式2

TL1=0xFD;

TH1=0xFD;//波特率为9.6K

TH0=(65536-50000)/256;//装初值实现50ms

TL0=(65526-50000)%256;

TR0=1;//开定时器0

TR1=1;//开定时器1

ET0=1;//开定时器0

REN=1;//允许接收

SM0=0;//方式2

SM1=1;

EA=1;//开总中断

ES=1;//开串口中断

}

/*数据发送*/

voidputbyte(ucharbyte)//利用硬件串口方式2发送一个字节数据

{

SBUF=byte;//将要发送的数据送到发送缓冲区域,系统自动发送

while(!

TI);//查询是否发送结束当TI=1代表发送结束

TI=0;//清发送结束位方便下一次发送

}

/*设置波特率*/

voidset_bote()

{

uinttemp=P1;

temp=temp&0x0f;

putbyte(temp);

if(temp==1)

{

TL1=0xE8;

TH1=0xE8;//波特率为1.2K

}

elseif(temp==2)

{

TL1=0xF4;

TH1=0xF4;//波特率为2.4K

}

elseif(temp==4)

{

TL1=0xFA;

TH1=0xFA;//波特率为4.8K

}

elseif(temp==8)

{

TL1=0xFD;

TH1=0xFD;//波特率为9.6K

}

}

voiddisplay_led()

{

uchari;

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

{

P2=disbit[i];//使用查表法进行位选

if(i!

=2)

P0=table[disnum[i]];

else

P0=table1[disnum[i]];

delay(10);//扫描间隔时间太长会数码管会有闪烁感

}

}

voidBEEP()

{

uchari,j;

led=1;

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

{

beep=!

beep;//beep取反

for(j=0;j<250;j++)//需要产生方波

_nop_();

}

beep=1;//关闭蜂鸣器

}

voidmain(void)

{ucharc;

uchari;

init();//初始化

set_bote();//设置波特率并且发送给从机

num=0;//计数次数清0

num1=0;//报警计数次数清0

m=1;//波特率显示结束标志

flag=1;//是否接收到从机发送的数据标志

while

(1)

{

led=0;

if(num<=60&&m==1)

{

uchartemp=P1&0x0f;

if(temp==1)//显示波特率1200

{

bote[0]=1;bote[1]=2;bote[2]=0;bote[3]=0;

}

elseif(temp==2)//显示波特率2400

{

bote[0]=2;bote[1]=4;bote[2]=0;bote[3]=0;

}

elseif(temp==4)//显示波特率4800

{

bote[0]=4;bote[1]=8;bote[2]=0;bote[3]=0;

}

elseif(temp==8)//显示波特率9600

{

bote[0]=9;bote[1]=6;bote[2]=0;bote[3]=0;

}

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

{

P2=disbit[i+4];//使用查表法进行位选

P0=table[bote[i]];

delay(10);//扫描间隔时间太长会数码管会有闪烁感

}

}

else

{

m=0;//波特率显示结束

if(num1==180)//若已经计时9s

{

if(flag==0)//若没有接收到数据

{

uchart=8;

while(t--)//报警

BEEP();

}

else

flag=0;//否则接收到数据标志位清0

num1=0;//计数次数清0

}

time1=60;

while(time1!

=0)

display_led();//显示温度和地址3s

for(c=0;c<5;c++)

{time2=20;

while(time2!

=0)//倒计时5s

{

P2=0x80;

P0=dao[c];

delay(10);

}

}

}

}

}

voidt0()interrupt1

{

TH0=(65536-50000)/256;//装初值实现50ms

TL0=(65526-50000)%2

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

当前位置:首页 > 高等教育 > 历史学

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

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