室内数字温度测量计
天津电子信息职业技术学院
设 计 课 程
课题名称
姓 名
学 号
班 级 专 业
成 绩
完成日期
1
室内数字温度测量器
摘要
随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个
领域,已经成为一种比较成熟的技术。对于温度的测量方法与装置的研究就凸显
得非常重要。 由单片机与温度传感器构成的测温系统可广泛应用于很多领域。
关键词:单片机;数字控制;温度计; DS18B20
2
目录
一、设计的目的 ................................................... 4
1.设计思路: ................................................... 4
2.总体设计方框图: ............................................. 4
二、系统硬件电路的设计 ........................................... 5
1(主控制器 .................................................... 5
(1) AT89S52引脚图 ........................................................................ 5
(2) AT89C52单片机引脚 ................................................................. 6
(3)原理图 ......................................................................................... 6
2.复位电路的设计 ............................................... 7
3.晶振电路的设计 ............................................... 7
四、温度采集电路中DS18B20的简介与用法 ........................... 8
1(DS18B20 的性能特点如下: .................................... 8
2.引脚功能说明 ................................................. 9
3.温度传感器与单片机的连接 .................................... 10
4.温度显示电路 ................................................ 10
五、系统程序的设计 .............................................. 11
六、致谢 ........................................................ 13
七、参考文献 .................................................... 13
..................................................... 13 附录 程序 .
3
一、设计的目的
系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。培养一定
的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、
参考文献,寻找解决
.
1.设计思路
温度只要在所设定的上下温度界限设计方框图
方框图(图1)所示为数字温度控制器的单体设计方框图。其工作原理为:当
该电路上电工作以后,首先刷新显示(LED),然后,温度传感器采集温度送单
片机检查温度的高低,由单片机送出信号经过驱动电路送往显示电路或报警电
路。
4
二、系统硬件电路的设计
1(主控制器
AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程
Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51
产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于
常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得
AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。AT89S52
具有以下
功能:
8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指
针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片
AT89S52引脚图
5
(2) AT89C52单片机引脚
图3 数码显示器
(3)原理图
图4 原理图
6
2.复位电路的设计
单片机复位电路的设计如图3.1所示。该复位电路采用手动复位与上电复位相结合的方式。当按下按键时,VCC通过R2电阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC通过电阻R2和电容C构成回路,该回路是一个对电容C充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。
图5 复位电路图
3.晶振电路的设计
单片机晶振电路的设计如图5所示。XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(X2)是来自反向振荡器的输出。按照理论上AT89C52使用的是12MHz的晶振。
7
图6 晶振电路图
四、温度采集电路中DS18B20的简介与用法
由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,
需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用DALLAS公司的数字温度传感器DS18B20作为测温元件。
DALLAS 最新单线数字温度传感器DS18B20是一种新型的”一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持”一线总线”接口的温度传感器。温度测量范围为-55,+125 摄氏度,可编程为9位,12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3 根或2 根线上,CPU只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
1(DS18B20 的性能特点如下:
(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条总线即可实现微处理器与DS18B20的双向通讯;
(2) DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温;
(3) DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
(4)适应电压范围更宽,电压范围:3.0,5.5V,在寄生电源方式下可由数据线供电;
8
(5) 测温范围-55?,,125?,在-10,+85?时精度为?0.5?;
(6) 零待机功耗;
(7) 可编程的分辨率为9,12位,对应的可分辨温度分别为0.5?、0.25?、0.125?和0.0625?,可实现高精度测温;
在9位分辨率时最多在93.75ms 外部封装形式
2.引脚功能说明
NC :空引脚,悬空不使用;
VDD :可选电源脚,电源电压范围3~5.5V。当工作于寄生电源时,此引脚必须接地。 DQ :数据输入/输出脚。漏极开路,常态下高电平。
9
GN :为电源地
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20
28H)是产品类型标号,的地址序列码。64位光刻ROM的排列是:开始8位(
接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625?/LSB形式表达,其中S为符号位。
3.温度传感器与单片机的连接
4.温度显示电路
显示电路采用共阳LED数码管,从P0口输出段码,列扫描用P1.2,P1.5口来实现如
图
10
五、系统程序的设计
系统程序主要包括主程序、读出温度子程序、温度转换命令程序、计算温度子程序、显示数据刷新子程序等等。
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s进行一次。
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
11
图10 主程序框图
, 读出温度数据后,LOW的低四位为温度的小数部分,可以精确到0.0625?LOW的
高四位和HIGH的低四位为温度的整数部分,HIGH的高四位全部为1表示负数,全为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5?的话,向个位进1;小于0.5?的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据
转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55?,所以可以将整数部分的最高位换成一个“-”,表示为负数。图9为温度数据处理程序的
图。
12
六、致谢
作为一名电子信息的大二学生,我觉得做单片机课程设计是很有意义的,而且也是必要的。在做这次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的实际资料是十分必要的,也是必不可少的。
其次,在这次课程设计中,我们运用了所学的专业课知识,如:汇编语言、模拟和数字电路知识等,自学了proteus仿真。学了虽然过去我从未独立应用过他们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
13
sbit DQ = P3 ; //数据口define interface
//sbit dula = P2 ; //数码管段选
//sbit wela = P2 ; //数码管位选
uint temp; //温度值 variable of temperature
//不带小数点
signed char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, un
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//带小数点
unsigned char code table1[] =
{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*************精确延时函数*****************/
void delay(unsigned char i)
{
while(--i);
}
/******************************************
此延时函数针对的是12Mhz的晶振
delay(0):延时518us 误差:518-2*256=6
delay(1):延时7us (原帖写"5us"是错的)
delay(10):延时25us 误差:25-20=5
delay(20):延时45us 误差:45-40=5
delay(100):延时205us 误差:205-200=5
delay(200):延时405us 误差:405-400=5
*******************************************/
/*****************DS18B20******************/
void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command {
DQ = 1; //DQ复位,不要也可行。
delay(1); //稍做延时
DQ = 0; //单片机拉低总线
delay(250); //精确延时,维持至少480us
DQ = 1; //释放总线,即拉高了总线
delay(100); //此处延时有足够,确保能让DS18B20发出存在脉
冲。 }
14
uchar Read_One_Byte() //读取一个字节的数据read a byte date
线移出 //读数据时,数据以字节的最低有效位先从总
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us //至少维持了1us,表示读时序开始
dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。
DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
delay(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us //控制器进行采样
{
dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
}
delay(10); //此延时不能少,确保读时序的长度60us。
}
return (dat);
}
void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低总线
_nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ = dat&0x01; //从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总线后的15us
//因为15us后DS18B20会对总线采样。
delay(10); //必须让写时序持续至少60us
DQ = 1; //写完后,必须释放总线,
dat >>= 1;
delay(1);
}
}
uint Get_Tmp() //获取温度get the temperature
15
{
float tt;
uchar a,b;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //温度转换指令
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //读暂存器指令
a = Read_One_Byte(); //读取到的第一个字节为温度LSB
b = Read_One_Byte(); //读取到的第一个字节为温度MSB
temp = b; //先把高八位有效数据赋于temp
temp <<= 8; //把以上8位数据从temp低八位移到高八位
temp = temp|a; //两字节合成一个整型变量
tt = temp*0.0625; //得到真实十进制温度值
//因为DS18B20可以精确到0.0625度
//所以读回数据的最低位代表的是0.0625度
temp = tt*10+0.5; //放大十倍
//这样做的目的将小数点后第一位也转换为可显示数字
//同时进行一个四舍五入操作。
return temp;
}
/****************数码码动态显示函数**************/
void Display(uint temp) //显示程序
{
uchar A1,A2,A3;
A1 = temp/100; //百位
A2 = temp%100/10; //十位
A3 = temp%10; //个位
P0 = ~table[A1]; //显示百位
P2 = 0xf7;
delay(0);
P0 = ~table1[A2]; //显示十位,使用的是有小数点的数组(因为temp值扩大了
10倍,虽然是十位,实际为个位)
P2 = 0xfb;
delay(0);
P0 = ~table[A3]; //显示个位
P2 = 0xfd;
delay(5);
}
16
void main()
{
while(1)
{
Display(Get_Tmp());
}
}
17