基于DSB18B20-AT24C02-PCF8591的单片机温度报警装置

更新时间:2023-12-09 02:36:01 阅读量: 教育文库 文档下载

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

基于STC89C52、DS18B20、LCD1602、AT24C02 温度警报器的单片机课程设计

院 系: 年级专业:

姓 名: 指导教师: 学 号: 日 期:

光电与通信工程学院

摘要:

随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快的开发,且温度

的检测与控制是工业生产过程中比较典型的应用之一。本文设计了一种基于STC89C52的温度检测及报警系统。该系统将多个单总线温度传感器DS18B20并接在控制器的一个端口上,对各个传感器温度进行循环采集,将采集到的温度值与设定值进行比较,当超出设定的上限温度时,通过蜂鸣器提示及报警信号,还提供时间显示,調时功能。并且能够存储到AT24C02中随时调出数据进行查看。本文中给出了系统实现的硬件原理图及软件流程图。经实验测试表明,该系统测量精度高、扩展方便,在大型仓库,工厂以及智能化建筑等领域的多点温度检测中有广阔的应用前景。 关键词:

STC89C52、AT24C02、LCD1602、DS18B20、数码管、蜂鸣器、报警系统 目录

一、系统的主要功能及工作流程 1.1各元器件 1.2控制部分 1.3测量部分 1.4存储部分 1.5显示部分 1.6报警部分

二、硬件设计:硬件电路原理(附原理图) 三、软件设计:软件设计流程(附流程图)

四、总结与心得体会 五、参考文献 六、附录

6.1系统总硬件电路原理图 6.2系统源程序代码

一、系统的主要功能及工作流程 1.1各元器件

表1 各个及其对其对应元器件

模块 单片机 元器件 STC89C52 时钟电路 11.0592M晶振 30p瓷片电容 模块 元器件 串行口下载MAX232 电路 DB9公头 0.1u电解电容 0.1u瓷片电容 复位电路 10u瓷片电矩阵键盘电按键 容 10K欧电阻 按键 液晶显示 LCD1602 路 1K欧电阻 数据存储 AT24C02 温度传感DS18B20 器 蜂鸣器报5V有源蜂鸣警 器 100欧电阻

稳压电路 直流电源插座 0.1u瓷片电容 10u瓷片电容 1.2控制部分

控制部分采用的是STC89C52 1.2.1 芯片STC89C52简介

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工

作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。

1.2.2芯片STC89C52参数

1. 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[2]

2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机) 3.工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz

4. 用户应用程序空间为8K字节 5. 片上集成512 字节RAM

6. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。

7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片 8. 具有EEPROM 功能

9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2 10.外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒

11. 通用异步串行口(UART),还可用定时器软件实现多个UART

12. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级) 13. PDIP封装 1.3测量部分

测量部分采用的是DS18B20,是一款由美国DALLAS公司生产的温度传感器。

1.3.1温度传感器DS18B20简介

DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

1.3.2温度传感器DS18B20工作方式

DS18B20的测温原理如图所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原

理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。 1.4存储部分

本次课程设计采用的数据存储模块是EEPROM ——AT24C02 1.4.1 AT24C02简介

AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256*8位存储空间,具有工作电压宽(2.5V~5.5V),擦写次数多(大于10000次),写入速度快(小于10ms),抗干扰能力强,数据不易丢失,体积小等特点。并且它是采用I2C总线式进行数据读写的串行操作,只占用很少的资源和I/O线。AT24C02有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,还有一个专门的写保护功能。

AT24C02支持I2C总线数据传送协议,I2C总线协议规定:任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的,主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式。I2C总线协议定义如下: 1、只有在总线空闲时才允许启动数据传送。

2、在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变,时钟线为高电平时,数据线的任何电平变化

将被看作总线的起始或停止信号。 1.4.2 AT24C02的工作原理

AT24C02起始/停止时序

如图所示,时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C总线的起始信号。时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C总线的停止信号。

主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址。8位从器件地址的高4位固定为1010(见表3-7),接下来的3位A2、A1、A0为器件的地址位,用来定义哪个器件以及器件的哪个部分被主器件访问。从器件8位地址的最低位作为读写控制位。1表示对从器件进行读操作,0表示对从器件进行写操作。

在主器件发送起始信号和从器件地址字节后,AT24C02监视总线并当其地址与发送的从地址相符时响应一个应答信号。通过SDA线AT24C02再根据读写控制位R/W的状态进行读或写操作。

AT24C02控制字

I2C总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号(下图)。应答的器件在第9个时钟周期时将SDA线拉低,表示其已收到一个8位数据。AT24C02在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个8位字节之后响应一个应答信号。

当AT24C02工作于读模式时,在发送一个8位数据后释放SDA线并监视一个应答信号。一旦接收到应答信号,AT24C02继续发送数据,如主器件没有发送应答信号,器件停止传送数据且等待一个停止信号。

AT24C02的写模式有字节写和页写两种。本设计中选择字节写模式,其时序见图3-12。该模式下,主器件发送起始命令和从器件地址信息(R/W位置零)给从器件。在从器件产生应答信号后,主器件发送AT24C02的字节地址,主器件在收到从器件的另一个应答信号后,再发送数据到被寻址的存储单元。

AT24C02

应答时序

AT24C02

字节写时序

AT24C02再次应答,并在主器件产生停止信号后开始内部数据的擦写。在内部擦写过程中AT24C02不再应答主器件的任何请求。对AT24C02读操作的初始化方式和写操作时一样,仅把R/W位置为1。有三种不同的读操作方式:立即地址读、选择读和连续读。 连续读操作可通过立即读或选择性读操作启动,在AT24C02发送完一个8位字节数据后,主器件产生一个应答信号来响应,告知AT24C02主器件要求更多的数据。对应每个主机产生的应答信号,AT24C02将发送一个8位数据字节;当主器件不发送应答信号而发送停止位时结束此操作。 1.5显示部分

本次课程设计显示部分采用的是LCD1602 1.5.1 LCD1602简介

工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 注:为了表示的方便 ,后文皆以1表示高电平,0表示低电平。 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的

间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

1.5.2 LCD的工作方式

1602液晶模块内部的控制器共有11条控制指令,如下所示:

序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0 0 0 1 S/C R/L * * 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或DDRAM) 1 0 要写的数据内容 11 从CGRAM或DDRAM读数 1 1 读出的数据内容

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低

电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。

与HD44780相兼容的芯片时序表如下:

读状态 输入 RS=L,R/W=H,E=H 输出 D0—D7=状态字

写指令 输入 RS=L,R/W=L,D0—D7=指令码,E=高 输出 无脉冲 读数据 输入 RS=H,R/W=H,E=H 输出 D0—D7=数据 写数据 输入 RS=H,R/W=L,D0—D7=数据,E=高脉输出 无

1.6报警部分 1.6.1 蜂鸣器的分类

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 1、压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出 1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。 压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。

2.电磁式蜂鸣器电磁式蜂鸣器由振荡器、电磁线圈、磁铁、

振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁

线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

本实验采用TMB12A05蜂鸣器,TMB12A05是有源电磁式蜂鸣器。 1.6.2工作流程

D18B20传感器采集到的温度用数字量传给单片机,在单片机内用程序控制温度的报警。当温度大于上限阈值或者低于下限阈值时,通

过蜂鸣器发出警报。当温度高于下限阈值但低于上限阈值时,不发生警报。

二、硬件设计:硬件电路原理(附原理图)

DS18B20与单片机之间用单总线传输;DS18B20的数据口与单片机的P3.7相连。

工作流程图

DS18B20 芯片STC89C52 LCD显示 AT24C02 报警系统 阀值设定、时间调节(按键)

三、软件设计:

系统软件程序基于Keil uvsion4开发平台,采用C51语言编写。本程序采用模块化程序方法,主要分为以下四个模块: ◆ LCD1602初始化显示模块 ◆ DS18B20数据采集模块 ◆ AT24C02数据存储模块

◆ 温度报警上下限设置、时间设置模块 程序流程图:

主机发出开始信号主机设置为输入模式开始跳出NDS18B20是否响应?初始化LCD1602Y等待480us调用DS18B20模块接收数据调用报警模块拉低总线,延时45us 温度显示 温度时间显示释放总线主程序流程图DS18B20数据采集流程图

进入设置模式(按键)设置温度报警上下限TH与TL调用DS18B20模块Temp>=TH||Temp<=TL?NY报警(LED亮,蜂鸣器响)温度显示报警模块流程图四、总结与心得体会

本次课程设计总得来说真的是受益匪浅,以前在学习理论知识的时候总是眼高手低,感觉老师讲的自己都懂了,也会写个小程序什么的有了小小的满足。可真当让自己去设计,自己去写程序的时候却又是另一番模样。刚拿到课题时,我就准备开始做,默默的告诉自己多

长时间做出来,可是并没有按照自己想象的那样做到。跟同学探讨一下,然后静下心来把整个课题所要完成的目标分析清楚,确定要用到哪些模块,然后一个模块一个模块的去写程序,当然这其中也免不了走了许多弯路。当自己解决一些问题后再回头看下原来自己所犯的错误真的好低级,自己的粗心跟大意浪费了很多时间,这些都可以避免的。各个模块之间的相互嵌用是最难调试的一部分,在此期间也闹出了许多笑话,不管过程再怎样艰难,我们只要一步一个脚印的去做就好了,这种事情急不来的。还有就是很多在课堂上听到的玄而又玄的一些知识,真正拿到实验室来上上手练习一下理解的可以快很多。感谢林峰老师的耐心答疑。 五、参考文献

[1]STC89C52

http://wenku.http://www.wodefanwen.com//view/d91a61da50e2524de5187e00.html74hc573

[2]赵福图等编. 现代传感器集成电路.人民邮电出版社.2000.1 [3] http://wiki.dzsc.com/info/7439.html 数码管 [4] 慧净电子免费资料 WWW.HLMCU.COM 蜂鸣器的介绍 [5]徐敏编.单片机原理及应用.机械工业出版社.2012.8

六、附录

6.1系统总硬件电路原理图

6.2系统源程序代码

#include #include #include #include

#define PCF8591 0x90 //PCF8591 地址 #define AT24C02 0xa0 // AT24C02 地址 sfr AUXR = 0x8E;

#define uchar unsigned char #define uint unsigned int

sbit sda=P2^0; //I2C总线的使能端 sbit scl=P2^1; sbit DQ = P3^7; sbit K8=P1^5; sbit K7=P1^7; sbit K6=P1^6; sbit K2=P1^2; sbit K1=P1^1; sbit K3=P1^3; sbit beep=P1^5; sbit LED=P1^4; sbit RS=P2^6; sbit RW=P2^5;

sbit EN=P2^7;//LCD的位定义 int M1,dz1=0,dz2=0; unsigned long M2; uint high,low; uint tem1,tem2,tem3; uint temp,temp1,temp2; uint QWE; uchar adc;

uchar num=0; //quan ju bian liang

char V1,V2,V3,ho1,ho2,mi1,mi2,s1,s2,h1,h2,L1,L2; //定义电压、时、分、秒

uint t1,t2,t3; //定义温度 最高温度 最低温度

char Hou1=0,Hou2,Min1,Min2; //定义时、分、 uchar code table_Digital[]=\ uchar code table[]=\ uchar code table1[]=\

/******************LCD液晶显示部分*****************/ void delay(uint z) {

uint x,y; for(x0;x--) for(y=0;y<110;y++) ; }

void write_com(uchar com)

{ /*写命令函数*/ RS=0; P0=com; delay(5); EN=1;

delay(5); EN=0; }

void write_date(uchar date)

{ /*写数据函数*/ RS=1; P0=date; delay(5); EN=1; delay(5); EN=0; }

void lcd_init()

{ /*液晶初始化函数*/ RW=0; EN=0;

write_com(0x38); delay(5); write_com(0x38);

delay(5); write_com(0x0c); write_com(0x01); }

void Time_init(void)

{ /*日期及时间初始化函数,此处对变量直接赋值即可设定你所需要的时间*/

ho1=0; ho2=0; mi1=Min1; mi2=Min2; s1=0; s2=0; t1=tem1; t2=tem2; t3=tem3; }

void show1(void)

{ /*显示初始化函数,亦可用于控制液晶更新实时时间*/ write_com(0x80); write_date(table[7]); write_com(0x81);

write_date(table_Digital[M2/1000]); write_com(0x82); write_date(table[3]); write_com(0x83);

write_date(table_Digital[M2/100]); write_com(0x84);

write_date(table_Digital[M2]); /*以上显示年月日*/

/*以下显示时分秒*/ write_com(0x86);

write_date(table_Digital[ho1]); write_com(0x87);

write_date(table_Digital[ho2]); write_com(0x88); write_date(table[2]); write_com(0x89);

write_date(table_Digital[mi1]); write_com(0x8A);

write_date(table_Digital[mi2]); write_com(0x8B); write_date(table[2]);

write_com(0x8C);

write_date(table_Digital[s1]); write_com(0x8D);

write_date(table_Digital[s2]); }

void show2(void) {

/*显示温度******/ write_com(0xc0); write_date(table[4]); write_com(0xc1);

write_date(table1[tem1=M1/1000]); write_com(0xc2);

write_date(table1[tem2=(M100)/100]); write_com(0xc3);

write_date(table1[tem3=(M10)/10]); write_com(0xc5); write_date(table[5]); write_com(0xc6);

write_date(table_Digital[h1]); write_com(0xc7);

本文来源:https://www.bwwdw.com/article/9zy5.html

Top