多机温度检测

更新时间:2024-01-29 02:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

河南理工大学

《单片机应用与仿真训练》设计报告

多机温度检测系统设计

专业班级: 电气08-6班 指导老师: 王莉 所在学院:电气工程与自动化学院

2011年7月 7 日

摘要

本设计是采用AT89S52 8位单片机作为控制核心设计了温度测量系统,该系统由温度检测模块、微控制器模块、串口通信模块、数码管显示和报警模块等四部分组成,能对0℃~99℃范围的温度进行测量,同时利用4位八段数码管可以实时显示环境温度。该系统结构简单,成本低,具有较好的应用价值。

本系统首先由下位AT89S52单片机通过p2.3口不断循环采集数字化温度传感器DS18B20的温度数据,然后转换成十进制温度值,通过串行口发送至上位AT89S52单片机,由上位机通过串行口接收数据,再与报警温度进行比较,判断是否进行报警,上位机同时驱动四位八段数码管将温度显示出来。

实现本系统的主要难点在于温度的采集和传送。

DS18B20只需要接到单片机的一个I/O口上,由于单总线为开漏所以需要外接一个4.7K的上拉电阻。其功能强大,但需要不断地发送采集命令以及循环读取它传出的数值,然后进行换算成十进制温度。

单片机串口通信是单片机一个非常有用的功能,可以构建多机系统来实现更为强大的功能,而且通过MAX232可以进行远距离的通信,实现远程控制,但是对于单片机初学者来说不太容易掌握其发送接收的时序和数据格式,所以我们采用了简单的直接通信而未进行数据发送前的请求应答和数据发送完得数据检查校错。

当然,由于我们是首次设计这样完整的应用系统,可能实现的功能不太完善。 关键词:AT89S51 单片机 温度测量 串口通信 18B20 Max232

河南理工大学本科课程设计报告

目录

1 概述............................................................................................................................ 1

1.1 下位机温度采集发送系统........................................................................... 1 1.2上位机显示及报警系统.................................................................................. 2 2 系统总体方案及硬件设计 ....................................................................................... 3

2.1主要硬件简介.................................................................................................. 3 2.2各部分电路设计.............................................................................................. 6 3软件设计....................................................................................................................11

3.1 功能需求分析................................................................................................11 4实验仿真................................................................................................................... 13 5课程设计体会 .......................................................................................................... 14 附1 源程序代码 ...................................................................................................... 16 附2 系统原理图 .................................................................................................... 24

- 2 -

河南理工大学本科课程设计报告

1 概述

1.1 下位机温度采集发送系统

下位机温度采集发送系统是本系统的主要核心之一,它的主要功能是采集DS18B20的温度数据,进行转换,并通过串口发送出去。该温度测量系统采用8051内核Atmel公司的AT89S52八位单片机。

温度采集发送系统由温度检测模块、下位控制器模块、发送放大模块三部分组成,如图1-1 温度测量系统的系统框图:

温度 采集 下位机控制模块 发送放大模块

图1-1 温度测量系统的系统框图

温度检测模块中温度传感器DS18B20采集温度数据,通过P2.3口传给下位单片机,微控制模块进行数据转换,得出十进制温度值,然后通过串行口经MAX232将数据发送出去。

- 1 -

河南理工大学本科课程设计报告

1.2上位机显示及报警系统

上位机系统的主要功能是接收下位机发送过来的温度数据,与报警温度进行比较,判断是否发送报警信号,并同时直接驱动四位八段数码管进行显示。

上位机系统由串口接收模块、处理控制模块、数码管显示模块和报警模块四部分组成,如图1-2上位机系统框图:

图1-2上位机系统框图

串口接收处理控制数码管显示 报警控制模块 串行口接收数据后进行判断是否报警,并由P0口和P2.0~P2.3直接驱动数码管显示温度数据。报警控制模块通过按钮电路可以改变报警温度的上下限实现系统的灵活功能。

- 2 -

2 系统总体方案及硬件设计

2.1主要硬件简介

⑴单片机简介

所谓单片机,全称是单片微型计算机,又控制器。它是在一块半导体芯片上,集成了CPU,ROM,RAM,I/O口、定时器/计数器、中断系统、AD模数转换器等功能部件,构成了一台完整的数字电子机。目前单片机己成功地运用在智能仪表、机电设备、过程控制、数据处自动检测和家用电器等各个方面。单片机在控制领域中,有如下几个特点:

1)小巧灵活、成本低、易于产品化,能方便地组装成各种智能式控备及各种智能仪器仪表。

2)面向控制,能针对性地解决从简单到复杂的各类控制任务,因而得最佳的性能价格比。

3)抗干扰能力强,适应温度范围宽,在各种恶劣的环境下都能可靠作,这是其它机种无法比拟的。

4)可以很方便地实现多机和分布式控制,使整个控制系统的效率和性大为提高

AT89S52单片机是Atmel 公司推出的和工业80C51产品为完全兼容的8位机,其特有的布尔处理机,在逻辑处理与控制方面具有突出优点。特点如下:

* 与MCS-51单片机产品兼容 * 8K字节在系统可编程Flash存储器 * 1000次擦写周期 * 全静态操作:0Hz~33Hz * 三级加密程序存储器 R * 32个可编程I/O口线 * 三个16位定时器/计数器 * 八个中断源

* 全双工UART串行通道 * 8位微控制器 * 低功耗空闲和掉电模式

河南理工大学本科课程设计报告

* 掉电后中断可唤醒 *8K 字节在系统可编程 * 看门狗定时器 * 双数据指针 * 掉电标识符图

2-1为AT89S52的引脚图:

图2-1 AT89S52引脚图

⑵DS18B20简介

数字化温度传感器是DALLAS最新单线数字温度传感器,支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。其适合于现场温度测量,可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下

- 4 -

河南理工大学本科课程设计报告

图2-2DS18B20管脚图

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。

根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

DS18B20产品的特点

(1)只要求一个端口即可实现通信。

(2)在DS18B20中的每个器件上都有独一无二的序列号。 (3)实际应用中不需要外部任何元器件即可实现测温。 (4)测量温度范围在-55°C- +125°C之间。 (5)数字温度计的分辨率用户可以从9位到12位选择。 (6)内部有温度报警上、下限设置。

- 5 -

河南理工大学本科课程设计报告

2.2各部分电路设计

⑴、单片机最小系统设计

最小应用系统设计是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。

本次设计采用的是AT89C52,其特点是8字节FLASH闪速存储器,256字节,32个I/O口线,3个16位定时/计数器,掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.主演的是它与C51系列产品指令和引脚完全兼容.

最小系统的时钟电路采用12MHZ晶振,机器周期为1us,连接两个30pF的电容,连接到AT89S52的XATL1,XATL2上面,如3.2图所示。

复位电路采用的是上电+按钮电平复位,是利用电容充电来实现上电复位。当按钮按下后,电源施加在单片机复位端RST上, 实现单片机复位功能.。

最小系统设计如图2-3所示

图2-3 单片机最小系统设计图

⑵ DS18B20与AT89S52单片机接口电路的设计

DSl8B20数字温度计提供9位(二进制)温度读数,指示器件的温度信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线,DS18B20与AT89C52单片机的接口电路如图2-4所示,其中DS18B20与单片机的接口为P2.3。

- 6 -

河南理工大学本科课程设计报告

图2-4 DS18B20模块设计

⑶下位机与上位机串行通信电路设计

本系统采用的是下位机采集温度信息并换算,通过串行口发送至上位机,因此需用到单片机的串行口。单片机的串行口是一个可编程的全双工串行通信接口。它可用作异步通信方式,与串行传送信息的外部设备相连接,或用于通过标准异步通信协议进行全双工的AT89S52多机系统也能通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。

AT89S52单片机通过管脚RXD(P3.0,串行数据接收端)和管脚TXD(P3.1,串行数据发送端)与外界通信。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。

本系统串行通信具体设计如图2-5, 图中标号I RXD 和I TXD分别代表下位机得RXD口和TXD口。

- 7 -

河南理工大学本科课程设计报告

图2-5串行通信设计

串行口的控制与状态寄存器简介 ① 串行口控制寄存器SCON

它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表: D7 SM0 D6 SM1 D5 SM2 D4 REN D3 TB8 D2 RB8 D1 TI D0 RI SM0、SM1:串行口工作方式选择位,其定义如下: SM0、SM1 工作方式 0 0 方式0 0 1 1 0 1 1 方式1 方式2 方式3 功能描述 8位移位寄存器 10位UART 11位UART 11位UART 波特率 Fosc/12 可变 Fosc/64或fosc/32 可变 其中fosc为晶体震荡器频率

- 8 -

河南理工大学本科课程设计报告

SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。

REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。 TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。

RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。 TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。

RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。 ②特殊功能寄存器PCON

PCON是为了在CHMOS的AT89S52单片机上实现电源控制而附加的。其中最高位是SMOD。它是一个特殊功能寄存器,没有位寻址功能,字节地址为87H。 PCON电源管理寄存器结构 D7 D6 D5 D4 D3 D2 D1 D0 SMOD - - - GF1 GF0 PD IDL 其中D7位(SMOD)为波特率选择位。 ⑷ LED显示电路设计

上位机接收到温度数据后需要直接驱动四位八段数码管将温度值显示出来,本系统采用的是共阴四位八段数码管,其具体设计如图2-6。

- 9 -

河南理工大学本科课程设计报告

图 2-6 数码管显示电路设计

⑸ 键盘电路设计

本系统只需用键盘实现简单的改变报警上下限,所以只需要简单的四个按钮即可,键盘电路具体设计如图2-7。

图2-7键盘电路设计

- 10 -

河南理工大学本科课程设计报告

3软件设计

3.1 功能需求分析

本系统需要具体实现的功能可划分为以下几个部分: 1. 温度数据采集 2. 温度数据换算 3. 温度数据传送与接收 4. 温度显示 5. 报警上下限调整

6. 温度数据与报警上下限比较及报警

系统又分为上位机和下位机两部分,易知前三个要求属于下位机的功能范畴,要求三至要求六属于上位机的功能范畴。

根据下位机的功能范畴,可设计出其工作流程图如下:

- 11 -

开始 系统初始化 DS18B20初始化 采集DS18B20温度并换算 串口初始化并发送温度 河南理工大学本科课程设计报告

图3-1下位机工作流程图

由流程图可知,可将下位机的程序划分为若干个实现单一功能的子程序,如DS18B20初始化程序、温度采集程序、温度换算程序、串口初始化程序和串口发送程序等。

根据上位机的功能范畴,可将上位机得工作流程设计如下:

扫描键盘 改变报警上下限 关中断 接收数据 串口中开始 系统初始化 串口初始化 开中断 断 显示温度值

图3-2 上位机工作流程图

- 12 -

河南理工大学本科课程设计报告

4实验仿真

- 13 -

河南理工大学本科课程设计报告

5课程设计体会

通过这次单片机课程设计,我们不仅加深了对单片机理论的理解,将很多课本理论很好地应用到实际当中,而且我们还学会了如何去培养我们的学习精神和团队协作能力,从而不断地战胜自己,超越自己。通过这次完成这次的设计,我们发现了我们在课堂上学习的知识是十分宝贵且有用的,也发现了我们在课堂学习过程中的不足和大意,有很多东西都在课堂上被我们忽略来了,为了完成本次的设计,我们不断地翻阅书籍、请教同学,重新学习了课堂上的知识,虽然还没能做到融会贯通、厚积薄发,但毕竟窥一管而知全豹,走进了单片机应用的辽阔世界,了解到了单片机系统的强大功能,开阔了视野,提高了设计能力,使更多的知识成为了自己的东西,相信这些在我们今后的学习和工作生涯中将会是一笔宝贵的财富。

在这次设计中,串口通信是我们的一大难点,不断的仿真和不断的错误和失败告诉我们基础知识的不踏实,正如老师所言“基础不牢,地动山摇”,于是我们重新认真的看课本重新的学习,终于实现了串口发送和接受功能。

本次设计我们使用的是C51语言,虽然c语言结构明确,可读性强,但由于单片机的硬件资源有限,在数据定义和特殊寄存器的选用及修改上比较固定,对于新手来说有些理解和实现,所以C语言编程时很多地方程序结构固定,而我们又没有系统深入的学习过C51语言,所以在这次设计中我们部分的借鉴了别人的程序,虽然这一部分不是我们写的,但是我们认真读懂了它并且学到了很多东西,包括编程思想和设计技巧,这些都提高了我们的学习能力和模仿能力。

总之,通过这次的课程设计,使我们认识到了不足,看清了学习的方向,找到了学习的动力,提高了动手能力和学习能力,收获很大。

- 14 -

河南理工大学本科课程设计报告

参考文献

㈠姜志海,赵艳雷,单片机的C语言程序设计与应用 北京;电子工业出版社 ㈡张齐 朱西宁,单片机应用系统设计技术 北京 电子工业出版社 ㈢余发山 王福忠,单片机原理及应用技术 徐州 中国矿业大学出版社 ㈣蓝和慧 宁武 等 大学生电子设计竞赛单片机应用技能精讲 北京 电子工业出版社

㈤曹巧媛 单片机原理及应用 北京:电子工业出版社 ㈥胡汉才 单片机原理及接口技术. 北京:清华大学出版社 ㈦周志光,刘定良 单片机技术与应用 长沙 中南大学出版社 参考网站

1周立功单片机http:www.zlgmcu.com/ 2电子发烧友http:www.elecfans.com 3单片机学习网http:www. mcustudy.com/ 4单片机爱好者http:www.mcufans.com/ 5单片机开发http:www.fjbmcu.com/

- 15 -

河南理工大学本科课程设计报告

附1 源程序代码

测温程序

#include #include

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^0;//ds18b20 端口

uint temp;

//温度值

uchar start='Z'; //发送首部标志

void delay1(uint MS); unsigned int ReadTemperature(void); void Init_DS18B20(void);

unsigned char ReadOneChar(void); void WriteOneChar(unsigned char dat); void delay(unsigned int i);

//串口初始化 void UARTinit(void)

{

SCON = 0x50;

TMOD |= 0x20; TH1 = 0xFD; TR1 = 1; TI = 1;

} main() {

unsigned int TempH,TempL;

//1ms延时 //18b20读取温度 //18b20初始化 //18b20读取一个字节 //18b20写一个字节

//短延时

- 16 -

河南理工大学本科课程设计报告

UARTinit(); P2=0x00; while(1) { delay1(1000);

temp=ReadTemperature(); TempH=temp>>4; TempL=temp&0x0F;

TempL=TempL*6/10;//小数近似处理 printf(\ delay1(100); printf(\ delay1(100); printf(\ } }

/******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int i)//延时函数 {

while(i--); }

/******************************************************************/ /* 初始化 */ /******************************************************************/ void Init_DS18B20(void) {

unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5); }

- 17 -

河南理工大学本科课程设计报告

/******************************************************************/ /* 读一个字节 */ /******************************************************************/ unsigned char ReadOneChar(void) {

unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(5); }

return(dat); }

/******************************************************************/ /* 写一个字节 */ /******************************************************************/ void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(5); }

/******************************************************************/ /* 读取温度 */

- 18 -

河南理工大学本科课程设计报告

/******************************************************************/ unsigned int ReadTemperature(void) {

unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(200); Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; return(t); }

void delay1(uint MS) { uint x,j;

for(j=0;j

;

}

接收程序 #include #include

#define uchar unsigned char #define uint unsigned int

//共阴数码管编码

- 19 -

前两个就是温度 河南理工大学本科课程设计报告

uchar code table[] =

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar LED_Buffer[5] = {0}; //从串口接收的数据 uchar flag=0; uchar t=3;

//接收一个温度值标志

//接收数组长度 //接收首部标志 //上限标志 //下限标志

//设置上限按键标识 //设置下限按键标识 //报警Led

static uchar Reflag=0; char RingMax=60; char RingMin=10; uchar KeyMinflag=0; sbit Led=P1^0;

//1ms延时程序

uchar KeyMaxflag=0;

void Delay_1ms(uint i)//1ms延时 { }

void Delay_1us(uint i)//1us延时 { }

//串口中断

void Com_Int(void) interrupt 4 {

EA = 0; RI = 0;

if((SBUF=='Z')&&(t==3)) {

LED_Buffer[t] = SBUF-48; if(t==0) {

Reflag=1; if(Reflag==1) uchar x,j; for(j=0;j

uchar x,j; for(j=0;j

- 20 -

河南理工大学本科课程设计报告

}

} t--; }

Reflag=0; t = 4; flag=1;

EA = 1;

//串口初始化 void Com_Init(void) {

TMOD = 0x20; PCON = 0x00; SCON = 0x50; TL1 = 0xFd; TR1 = 1; }

//键盘扫描 void Key() {

if((P2&0x40)==0x00) { } else else

KeyMinflag=0; Delay_1ms(15);

if((!(P2&0x50))&&(RingMax>RingMin))

KeyMaxflag=0; KeyMinflag=1; if((P2&0x80)==0x00)

KeyMaxflag=1; ES = 1; EA = 1;

//启动定时器1

//开串口中断 //开总中断

TH1 = 0xFd; //设置波特率

- 21 -

河南理工大学本科课程设计报告

RingMax++; if((!(P2&60))&&(RingMax>RingMin)) RingMax--; if((!(P2&0x90))&&(RingMax>RingMin)) RingMin++; if((!(P2&0xA0))&&(RingMax>RingMin))

RingMin--;

}

//数码管显示

void Display(uchar bai,uchar shi,uchar ge,uchar xiaoshu) { P0=table[bai];P2|=0x07;P2&=0xF7;Delay_1us(80); P0=table[shi];P2|=0x0B;P2&=0xFB;Delay_1us(80); P0=table[ge]|0x80;P2|=0x0D;P2&=0xFD;Delay_1us(80); P0=table[xiaoshu];P2|=0x0E;P2&=0xFE;Delay_1us(80);

}

void Main() { char temp; //定义温度变量 uchar ge,shi,bai,xiaoshu; //定义个十百小数位

P2|=0xF0;

//输入先写1 Delay_1ms(100); Com_Init();

//初始化

while(1) { Key(); if(flag==1)

//串口接收一个温度值 { bai=0;

shi=LED_Buffer[2]; ge=LED_Buffer[1]; xiaoshu=LED_Buffer[0]; temp=bai*100+shi*10+ge; flag=0; }

if(KeyMaxflag)

//设置上限按键标志

- 22 -

显示设置值

河南理工大学本科课程设计报告

}

{ }

if(KeyMinflag) { }

if((KeyMaxflag==0)&&(KeyMinflag==0)) //无按键,显示正常温度

Display(bai,shi,ge,xiaoshu);

if((temp>=RingMax)||(temp<=RingMin)) //温度不在设置范围内则发光二极管点亮, else

Led=1; Delay_1ms(1);

Led=0;

Display(RingMin/100,(RingMin/10),RingMin,0);

//设置下限按键标志

显示设置值

Display(RingMax/100,(RingMax/10),RingMax,0);

表示报警

- 23 -

河南理工大学本科课程设计报告

附2 系统原理图

- 24 -

本文来源:https://www.bwwdw.com/article/1gqw.html

Top