基于89C52单片机的数字温度传感器DS18B20开发测温系统
课程
说明书
1 引言
随着时代的进步和发展,单片机技术已经普及到我们生活工作、科研各个领域,已经成为一种比较成熟的技术,本次课程设计主要涉及一个基于89C52单片机的数字温度传感器DS18B20开发测温系统,重点学习掌握对传感器在单片机下的硬件链接,软件编程以及各模块系统流程的详尽分析,提高电路设计的技巧。该系统可以方便的实现温度的采集和显示,它使用起来相当的方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他猪系统的辅助扩展。DS18B20与AT89C52结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,有广泛的应用前景。
2 设计内容及设计
的选择
2(1 设计目的
本设计包括确定控制任务、系统总体方案设计、硬件系统设计、软件程序的设计等,以便使学生掌握有关单片机控制的设计思想和设计
。为学生今后从事单片机控制系统开发工作打下基础。学习proteus仿真软件实现电路的仿真。 2(2 设计内容及要求
本课程设计的基本要求是使学生全面掌握单片机控制系统设计的基本理论,熟悉掌握单片机的编程方法,用89C52系列单片机及DS18B20温度传感器实现测温范围在: -55?C,125?C以内的数字温度计,精度误差在5?C以内,用四位共阳LED数码管直接读显示,要求高位为0?C时不显示,低于0?C时前面显示“-”。 2. 3 设计工作任务及工作量的要求
1(根据题目要求的指标,通过查阅有关资料,确定系统设计方案,并设计其硬件电路图。
2(画出电路原理图,分析主要模块的功能及他们之间的数据传输和控制关系。 3. 用Proteus软件绘制硬件电路图并仿真。
4. 软件设计包括流程图、用汇编语言或C语言对软件进行编译,并能通过调试。
第1页 共19页
课程设计说明书
2.4 设计成果形式及要求
1. 硬件电路图
2. 软件流程图和程序清单
3. 编写课程设计报告。
2.5 设计方案
温度计电路设计总体设计方框图如图2.1所示,控制器采用单片机AT89C52,温度传感器采用DS18B20,用四位共阳LED数码管实现温度显示。
温度传感器
LED数码管显示 AT89C52
电路 单片机 时钟,复位电路
路
图2.1 总体设计方框图
3 硬件电路设计
3. 1 主电路设计
AT89C52为8位通用微处理器,采用工业
的C51内核,在内部功能及管脚排布上与通用的89C52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XATL2(18脚)为振荡器输入输出端口,外界11.0592MHZ晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0-P3为可编程通用I/O脚,
第2页 共19页
课程设计说明书
其功能用途由软件编程定义。
图3.1 主控芯片接线图
第3页 共19页
课程设计说明书
图3.2 晶振电路图 图3.3 复位电路图
3. 2 显示电路设计
共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点)。如图3.4所示。图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。显示电路设计接线图如图3.5所示。
图3.4 共阳极LED接线 图3.5 显示电路接线图
3. 3 温度传感器原理及其电路设计
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根
第4页 共19页
课程设计说明书
据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20采用3脚PR35封装或8脚SOIC封装,其引脚排列如图3.6及内部结构框图如图3.7及测温原理如图3.8下所示:
图3.6 DS18B20温度传感器引脚排列图
图3.7 DS18B20温度传感器内部结构框图
第5页 共19页
课程设计说明书
预置 斜率累加器
低温度系数振荡计数器1 比较
T 1 器
预置 T x
加1
=0 高温度系数振荡温度寄存器
器
停止
-0 计数器
T 2 2
图3.8 DS18B20温度传感器测温原理图
单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状
态为高电平。如图3.9所示:
图3.9 DS18B20温度传感器接线原理图
第6页 共19页
课程设计说明书
4 系统软件设计
4.1 主程序设计
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图4.1所示,温度流程图如图4.2所示。
图4.1主程序流程图图 图4.2 温度流程图
第7页 共19页
课程设计说明书
4.2 读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图4.3所示:
图4.3 温度转换流程图
4.3 温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,温度转换命令子程序流程图如图4.4。
4.4 显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位,程序流程图如图4.5。
第8页 共19页
课程设计说明书
W4
W3 图4.5 计算温度流程图 图4.4 显示数据刷新流程图 5 系统原理图
系统原理图如图5.1所示 W2
DY1VCCVCC16P0011aaaaDIG1DIG2DIG3DIG425VCC_5VkeyP017bbbbaaaa34P024cccc1P032fbfbfbfbS1ddddggggP041eeee2P0510ececececffffddddP065ggggJ1dpdpdpdp61289P073dpdpdpdpcomcomcomcomGNDVCC_5VDpy4-CA
W1VCC_5VU1RP1P101401P1.0(T2)VCCCOMP11239P002P1.1(T2 EX)P0.0(AD0)R0P12338P01R23P1.2P0.1(AD1)R1P13437P024P1.3P0.2(AD2)R2S2536P035P1.4P0.3(AD3)R310K635P04VCC_5V6P1.5(MOSI)P0.4(AD4)R4734P057P1.6(MISO)P0.5(AD5)GNDR5833P068P1.7(SCK)P0.6(AD6)R6C3932P079RSTP0.7(AD7)R7R31031P3.0(RXD)EA/VPP4.7K104113010kP3.1(TXD)ALE/PROGU21229P3.2(INT0)PSENP10219W1C11328D1Q1P3.3(INT1)P2.7(A15)P1131427DS18B2018W2D2P3.4(T0)P2.6(A14)Q217W3P1241526Q3D3P3.5(T1)P2.5(A13)P13516W422P1625D4Q41P3.6(WR)P2.4(A12)615X21724VCC_5VLED1D5Q5P3.7(RD)P2.3(A11)GND714C2182312MRedD6Q6XTAL2P2.2(A10)28131922D7Q7XTAL1P2.1(A9)9122021P20DQD8Q8GNDP2.0(A8)R122P31120P20AT89S52LEVCCVCC110GND4.7KOEGND
74HC573GNDGND
图5.1 系统流程图
第9页 共19页
课程设计说明书
硬件设计图如图5.2所示
654321
12
112021
图5.2 硬件设计图
第10页 共19页
课程设计说明书
6 系统仿真图
系统仿真图如图6.1所示
图6.1 系统仿真图
第11页 共19页
课程设计说明书
6 总结
我们是从1月上旬开始准备此次课程设计的,此次的课程设计一共用了十多天时间。我们从开始准备到完成课程设计这段时间并不是一帆风顺。当我们知道课程设计题目的时候,我们第一件事就是在百度上搜索了一篇与自己课程设计题目相关的文章,搜索文章的主要目的是让自己有一个具体的方向,同时能得到一个相对正确的结果。
在对自己的题目有所了解以后,我便开始自己的课程设计了,从主电路,显示电路,温度传感器电路等,这之间都遇见了不少麻烦,由于我们没有做出实物,因此只能通过用Altium Designer软件模拟实际的结果,并且得到了想要的结果。在编写程序的过程,我们没有选择汇编来编写,而是用了C语言来写程序,最终也得到了想要的答案。
通过本次课程设计,我在设计过程中遇见了很多问题,这些东西都是在平时上课都无法遇见的。在课堂上,我们所学的很多知识都是在理想状况下出现的,但是在实际情况中会出现很多的误差。然而,通过此次课程设计,我们将很多课堂上的盲区都一一得到解答,并且很好的掌握了与自己课程设计有关的知识,虽然这个知识点知识我们学习的小部分,但是,我们在课下可以做更多这样的练习,这样可以更加的提高自己。在课程设计过程,重要的是我们基本掌握proteus软件的电路仿真,这个对我们专业的学习有很大的帮助。
第12页 共19页
课程设计说明书
7 参考文献
[1].孙涵芳.MCS-51/96系列 单片机原理及应用(修订版).北京航空航天大学出版社.1994
[2].李朝青.单片机原理及接口技术(第3版).北京航空航天大学出版社.2005
第13页 共19页
课程设计说明书
8 附录
程序源代码:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define Disdata P0
#define discan P1
sbit DQ=P2^0;
sbit DIN=P0^7;
int temp;
uchar flag1,flag; uchar h;
Unsigned char code
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳数码管段码
"0" "1" "2" "3" "4" "5" "6" "7" "8"
"9" "灭" "-"
uchar data temp_data[2]={0x00,0x00};//读出温度暂放
uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据
uchar code
ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09};
//小数部分对应十进制 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
"A" "B" "C" "D" "E" "F"
uchar code scan_con[4]={0x01,0x02,0x04,0x08}; //列扫描控制字
/***************************************/ /* 延时函数 */
/***************************************/
第14页 共19页
课程设计说明书
void delay(uint i) //delay
{
while(i--);
}
/************************************************/
/* 初始化ds18b20 */ /************************************************/
Init_DS18B20(void)
{
uchar x=0;
DQ = 1;
delay(8);
DQ = 0;
delay(80);
DQ = 1;
delay(14);
x=DQ;
delay(20);
}
/*************************************************/
/* 读字节函数 */ /*************************************************/
ReadOneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
第15页 共19页
课程设计说明书
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*************************************************/
/* 写字节函数 */ /*************************************************/
WriteOneChar(unsigned char dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************/
第16页 共19页
课程设计说明书
/* 发送温度转换命令 */ /******************************************/
void tmpchange(void) {
Init_DS18B20();
delay(200);
WriteOneChar(0xcc);
WriteOneChar(0x44); }
/******************************************/
/* 读出温度函数 */ /******************************************/
uint tmp() {
// float tt;
Init_DS18B20();
delay(1);
WriteOneChar(0xcc);
WriteOneChar(0xbe);
temp_data[0]=ReadOneChar();
temp_data[1]=ReadOneChar();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0];
return temp; //返回温度值 }
第17页 共19页
课程设计说明书
/******************************************/
/* 温度显示处理函数 */ /******************************************/
void tem_deal(uint tem)
{
/*************温度数据处理*****************/
if(tem>6348)
{
tem=65536-tem;
flag1=1;
}
Dis_play[4]=tem&0x0f;
Dis_play[0]=ditab[Dis_play[4]];
Dis_play[4]=tem>>4;
Dis_play[3]=Dis_play[4]/100;
Dis_play[1]=Dis_play[4]%100;
Dis_play[2]=Dis_play[1]/10;
Dis_play[1]=Dis_play[1]%10;
if(!Dis_play[3])
{
Dis_play[3]=0x0a; //第四位数码管不显示
if(!Dis_play[2])
{
Dis_play[2]=0x0a; //第三位数码管不显示
}
}
if(flag1) //如果flag1>0,则显示负号
{
Dis_play[3]=0x0b;
第18页 共19页
课程设计说明书
}
}
/******************************************/ /* 温度数据显示 */
/******************************************/
void display()
{
char k;
for(k=0;k<4;k++)
{
Disdata=table[Dis_play[k]];
if (k==1){DIN=0;}
discan=scan_con[k];
delay(90);
discan=0x0;
}
}
/******************************************/ /* 主函数 */ /******************************************/
void main()
{
tmpchange();
tem_deal(tmp());
delay(50000);
delay(50000);
第19页 共19页
课程设计说明书
while(1)
{
tmpchange();
tem_deal(tmp());
display();
}
}
第20页 共19页