基于STC89C52和DS18B20的温度检测装置设计Word格式文档下载.docx
《基于STC89C52和DS18B20的温度检测装置设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于STC89C52和DS18B20的温度检测装置设计Word格式文档下载.docx(40页珍藏版)》请在冰豆网上搜索。
![基于STC89C52和DS18B20的温度检测装置设计Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/28/620cc017-c11c-4546-84e3-bc7c7402b683/620cc017-c11c-4546-84e3-bc7c7402b6831.gif)
C范围内,精度为±
0.5°
最高分辩率可达0.0625。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
主控制器即单片机部分,用于存储程序和控制电路;
LED显示部分是用1602字符液晶显示温度;
传感器部分,即温度传感器,用来采集温度,进行温度转换;
复位部分,即复位电路。
测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
本设计能完成的温度测量范围是-55°
C~+128°
C,精度为0.1°
C,支持温度正负提示,软件预设上限温度30°
C,下限温度20°
C,并支持硬件手动配置温度上下限,通过4个键实现温度上限和下限设置,超过此上下限即实现报警功能。
附加功能:
实现一个时钟,显示时、分、秒,并可以设置时间。
3.整体设计电路图
4.单片机的造型
二、单片机概述
根据老师提供的元器件清单,选择采用STC89C52单片机进行使用。
STC89C52介绍:
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
主要特点:
1.8K字节程序存储空间;
2.512字节数据存储空间;
3.内带2K字节EEPROM存储空间;
4.可直接使用串口下载;
主要参数:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.[2]2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz4.用户应用程序空间为8K字节5.片上集成512字节RAM6.通用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、T210.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒11.通用异步串行口(UART),还可用定时器软件实现多个UART12.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)13.PDIP封装
P1口各个引脚的第二功能介绍:
P3口的第二功能介绍:
单片机的最小系统中还包含了复位电路和晶振电路。
晶振电路:
复位电路:
设计过程的注意点:
1.考虑对速度的要求。
单片机的运行速度首先看时钟频率,指令集,几个时钟为一个机器周期。
在选用单片机时,要根据需要选择速度,不要片面追求高速,单片机的稳定性、抗干扰性的参数基本上跟速度成反比,另外速度越快功效也越大。
2.考虑定时器/计数器的功能。
大部分单片机提供了2—3个定时器/计数器,有些定时/计数器还具有输入捕获、输出比较和PWM(脉冲宽度调制)功能,利用这些模块不仅可以简化软件设计,而且能少占用CPU的资源。
现在还有不少单片机提供了看门狗定时器(WDT),当单片机“死机”后可以自动复位。
选用时可根据自己的需要和编程要求进行选择。
3.考虑I/O口的驱动能力。
I/O口的数量和功能是选用单片机时首先要考虑的问题之一,根据实际需要确定数量,I/O多余不仅芯片的体积增大,也增加了成本。
驱动电流大的单片机可以简化外围电路。
51系列的单片机下拉(输出低电平)时驱动电流大,但上拉(输出高电平)时驱动电流很小。
4.考虑工作电压与功耗的要求。
单片机的工作电压最低可以达到1.8V,最高为6V,常见的是3V和5V。
单片机的功耗参数主要是指正常模式、空闲模式、掉电模式下的工作电流,用电池供电的系统要选用电流小的产品,同时要考虑是否要用到单片机的掉电模式,如果要用的话必须选择有相应功能的单片机。
5.单片机的串行接口。
单片机常见的串行接口有:
标准UART接口、TWI通讯接口、增强型UART接口、I2C总线接口、CAN总线接口、SPI接口、USB接口等。
大部分单片机都提供了UART接口,也有部分单片机没有串行接口。
三、温度检测电路
根据所提供的材料以及对电路的分析,决定采用DS18B20作为温度检测部分
特点:
DS18B20是DALLAS公司最新推出的单线数字温度传感器,新的“一线器件”体积更小、适用电压更宽、更经济。
Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822“一线总线”数字化温度传感器,测量温度范围为-55°
C,在-10~+85°
DS1822的精度较差为±
2°
C。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、DS1822的特性DS18B20可以程序设定9~12位的分辨率,精度为±
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!
1).只要求一个端口即可实现通信;
2).在DS18B20中的每个器件上都有独一无二的序列号;
3).实际应用中不需要外部任何元器件即可实现测温;
4).测量温度范围在-55。
C到+125。
C之间;
5).数字温度计的分辨率用户可以从9位到12位选择;
6).内部有温度上、下限告警设置;
温度测量电路的框图及其原理:
低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器冲输入。
计数器1和温度寄存器被预置在5℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
温度采集读写时序图:
DS18B20电路图:
读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节。
在读出时须进行CRC校验,校验有错时不进行温度数据的改写。
流程图如下:
温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中,采用1s显示程序延时法等待转换的完成。
流程图如下:
DS18B20温度采集、转换程序:
#include<
reg52.h>
#include"
intrins.h"
#include"
DS18B20.H"
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P1^0;
//定义接口
uinttemp;
//温度变量
ucharflag1;
//接收标志位
externdelay_nms(uintnms);
//***********************************
//功能:
串行口初始化,波特率9600,方式1
voidInit_Com(void)
{
TMOD=0x20;
//设定T1定时器的工作方式2
PCON=0x00;
//波特率不加倍
TH1=0xFd;
//T1定时器装初值
TL1=0xFd;
TR1=1;
//启动T1定时器
REN=1;
//允许接受串行口
SM0=0;
//设定串口工作方式1即8位异步通讯
SM1=1;
tmpchange();
//读一次温度,防止运行程序时读出85摄氏度
delay_nms(400);
//85度不显示(用延时跳过)
}
//DS18B20复位,初始化函数
voiddsreset(void)
uinti;
DS=0;
//数据线拉到低电平0
i=103;
//延时850us(该时间范围可以在480~960us)
while(i>
0)
i--;
DS=1;
//数据线拉到高电平1
i=4;
//延时等待(如果初始化成功则在15—60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在)
//读1位数据函数
bittmpreadbit(void)
bitdat;
//设置一位数据
i++;
//i++起延时作用
i++;
dat=DS;
i=8;
while(i>
0)i--;
return(dat);
//读1字节函数
uchartmpread(void)
uchari,j,dat;
dat=0;
for(i=1;
i<
=8;
i++)
{
j=tmpreadbit();
dat=(j<
<
7)|(dat>
>
1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
//向DS18B20写一个字节数据函数
voidtmpwritebyte(uchardat)
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)//写1
else
//写0
voidtmpchange(void)//DS18B20开始获取数据并转换
dsreset();
delay_nms
(1);
tmpwritebyte(0xcc);
//写跳过读ROM指令
tmpwritebyte(0x44);
//写温度转换指令
}
voidtmp()//读取寄存器中存储的温度数据
floattt;
uchara,b;
tmpwritebyte(0xbe);
a=tmpread();
//读低8位
b=tmpread();
//读高8位
temp=b;
temp<
//两个字节组合为1个字
temp=temp|a;
tt=temp*0.0625;
//温度在寄存器中是12位,分辨率是0.0625
temp=tt*10+0.5;
//乘以10表示小数点后只取1位,加0.5是四折五入
四.显示电路
一般显示电路概述、用到的电路图、硬件电路注意的问题、程序流程、编程注意点…
根据所提供的材料以及对电路的分析,决定采用LCD1602作为显示部分
实物图如下:
LCD1602的介绍:
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
根据电路的要求,分析之后各个引脚的所接位置:
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,使用时可以通过一个103电位器调整对比度。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
在电路中接P2^6。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
根据电路程序的分析,直接接地。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
此处接到P2^5。
第7~14脚:
D0~D7为8位双向数据端。
从P0^0到P0^7接口。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
相应所得到的电路图:
在显示电路焊接过程中,硬件需要注意的问题:
在硬件焊接一开始,首先要考虑好元器件的安放位置,使得整体的布局尽可能的达到美观,由于lcd1602有16个引脚,必须要了解各个引脚的具体功能,记住各个引脚所接的对应单片机的位置。
尤其是4,5,6这三个位置的引脚,对于lcd1602具有较为重要的作用,因而必须仔细焊接,避免焊接错误,或者是看错。
另外,在焊接的时候也要注意小心焊接,避免烧坏显示,导致显示出现问题。
程序流程图:
编写程序:
reg52.h"
1602.h"
//*****************************************************
//液晶位定义
sbitLCD_EN=P2^6;
sbitRS=P2^7;
//一毫秒延时函数
voiddelay_nms(uintnms)
{
uinti,j;
for(i=nms;
i>
0;
i--)
for(j=90;
j>
j--)
{
_nop_();
//****************************************************
//函数功能:
向1602写入指令(选择位置)
voidwrite_com(ucharcom)
RS=0;
//选择写命令模式(RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
)
P0=com;
//将要写的命令字送到数据总线上
LCD_EN=0;
//E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
//稍作延时以待数据稳定
LCD_EN=1;
//使能端给一个高脉冲
//稍作延时
//将使能端置0以完成高脉冲
向1602写入数据
voidwrite_date(uchardate)
RS=1;
//选择写命令模式(高电平时选择数据寄存器)
P0=date;
//定行定列显示数组
voidwrite_stringtable(ucharh,ucharl,uchar*s)
if(h==0)//确定第几行
h=0x80;
//第一行的第一个地址
h=0xc0;
//第二行的第一个地址
h=h+l;
//行(列)加?
?
write_com(h);
//写一个字符地址
while(*s)//显示字符串
write_date(*s);
s++;
//1602初始化
voidLCD_Initial()
write_com(0x38);
//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);
//设置开显示,不显示光标
write_com(0x06);
//写一个字符地址指针自动加1
write_com(0x01);
//显示清0,数据指针清0
5、键盘电路
键盘扫描概述:
首先,确定键盘编码方案:
采用编码键盘或非编码键盘。
随后,确定键盘工作方式:
采用中断或查询方式输入键操作信息。
然后,设计硬件电路。
非编码键盘系统中,键闭合和键释放的信息的获取,键抖动的消除,键值查找及一些保护措施的实施等任务,均由软件来完成。
1.监测有无键按下;
键的闭合与否,反映在电压上就是呈现出高电平或低电平,所以通过电平的高低状态的检测,便可确认按键按下与否。
2.判断是哪个键按下。
一.编程扫描方式:
当单片机空闲时,才调用键盘扫描子程序,反复的扫描键盘,等待用户从键盘上输入命令或数据,来响应键盘的输入请求。
二.定时扫描工作方式:
单片机对键盘的扫描也可用定时扫描方式,即每隔一定的时间对键盘扫描一次。
三.中断工作方式:
只有在键盘有键按下时,才执行键盘扫描程序并执行该按键功能程序,如果无键按下,单片机将不理睬键盘
3.完成键处理任务。
(二)从电路或软件的角度应解决的问题
1.消除抖动影响。
键盘按键所用开关为机械弹性开关,利用了机械触点的合、断作用。
由于机械触点的的弹性作用,一个按键开关在闭合和断开的瞬间均有一连串的抖动、
抖动时间的长短由按键的机械特性决定,一般为5~10ms,这是一个很重要的参数。
抖动过程引起电平信号的波动,有可能令CPU误解为多次按键操作,从而引起误处理。
为了确保CPU对一次按键动作只确认一次按键,必须消除抖动的影响。
按键的消抖,通常有软件,硬件两种消除方法。
这种方法只适用于键的数目较少的情况。
软件消抖:
如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
通常采用软件延时的方法:
在第一次检测到有