数字温度计报告222.docx

上传人:b****7 文档编号:16443691 上传时间:2023-07-13 格式:DOCX 页数:22 大小:142.46KB
下载 相关 举报
数字温度计报告222.docx_第1页
第1页 / 共22页
数字温度计报告222.docx_第2页
第2页 / 共22页
数字温度计报告222.docx_第3页
第3页 / 共22页
数字温度计报告222.docx_第4页
第4页 / 共22页
数字温度计报告222.docx_第5页
第5页 / 共22页
数字温度计报告222.docx_第6页
第6页 / 共22页
数字温度计报告222.docx_第7页
第7页 / 共22页
数字温度计报告222.docx_第8页
第8页 / 共22页
数字温度计报告222.docx_第9页
第9页 / 共22页
数字温度计报告222.docx_第10页
第10页 / 共22页
数字温度计报告222.docx_第11页
第11页 / 共22页
数字温度计报告222.docx_第12页
第12页 / 共22页
数字温度计报告222.docx_第13页
第13页 / 共22页
数字温度计报告222.docx_第14页
第14页 / 共22页
数字温度计报告222.docx_第15页
第15页 / 共22页
数字温度计报告222.docx_第16页
第16页 / 共22页
数字温度计报告222.docx_第17页
第17页 / 共22页
数字温度计报告222.docx_第18页
第18页 / 共22页
数字温度计报告222.docx_第19页
第19页 / 共22页
数字温度计报告222.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字温度计报告222.docx

《数字温度计报告222.docx》由会员分享,可在线阅读,更多相关《数字温度计报告222.docx(22页珍藏版)》请在冰点文库上搜索。

数字温度计报告222.docx

数字温度计报告222

单片机课程设计

题目:

数字温度计设计

班级:

姓名:

学号:

指导教师:

设计时间:

评语:

 

成绩

一、引言………………………………………………………………

(2)

二、概述………………………………………………………………

(2)

1.课程设计的意义…………………………………………………

(2)

2.设计的任务和要求………………………………………………

(2)

三、设计方案及原理…………………………………………………

(2)

1.设计方案…………………………………………………………………

(2)

2.原理………………………………………………………………………

(2)

四、硬件设计……………………………………………………………(3)

1.系统模块…………………………………………………………………(3)

2.主控制器…………………………………………………………………(3)

3.显示电路…………………………………………………………………(3)

4.温度传感器………………………………………………………………(4)

五、软件设计…………………………………………………………(6)

1.系统程序…………………………………………………………………(6)

2.主程序流程图……………………………………………………………(6)

六、总结………………………………………………………………(7)

七、参考文献…………………………………………………………(8)

八、附录………………………………………………………………(8)

1.仿真图…………………………………………………………(8)

2.源程序…………………………………………………………(8)

 

1、引言

随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术,本文主要介绍了一个基于89S51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20的数据采集过程。

对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。

DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。

2、概述

2.1课程设计的意义

本次课程设计是在我们学过单片机后的一次实习,可增加我们的动手能力。

特别是对单片机的系统设计有很大帮助。

本课程设计由两个人共同完成,在锻炼了自己的同时也增强了自己的团队意识和团队合作精神。

2.2设计的任务和要求

(1)基本范围-50℃-110℃

(2)精度误差小于0.5℃

(3)LED数码直读显示

(4)可以任意设定温度的上下限报警功能 

3、设计方案及原理

3.1设计方案

由于本设计是测温电路,进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。

3.2原理

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。

 

图1总体设计框图

4、硬件设计

4.1系统模块

系统由单片机最小系统、显示电路、按键、温度传感器等组成。

4.2主控制器

单片机AT89C51具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要。

4.3显示电路

图2数码管显示电路

显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。

P2口的低四位作为数码管的位选端。

采用动态扫描的方式显示。

4.4温度传感器

(1)DS18B20的性能特点

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。

与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。

DS18B20的性能特点如下:

.独特的单线接口仅需要一个端口引脚进行通信;

.多个DS18B20可以并联在唯一的三线上,实现多点组网功能;

.不需要外部器件;

.可通过数据线供电,电压范围为3.0-5.5V;

.零待机功耗;

.温度以9^12位数字量读出;

.用户可定义的非易失性温度报警设置;

.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

.负电压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作。

(2)DS18B20的内部结构

DS18B20采用3脚PR一35封装或8脚SOIL封装,其内部结构框图如图3所示。

图3DS18B20内部结构框图

4位ROM的位结构如图4所示。

开始8位是产品类型的编号;接着是每个器件的唯一的序号,共有48位;最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用单线进行通信的原因。

非易失性温度报警触发器TH和TL,可通过软件写人用户报警上下限数据。

8位检验CRC

48位序列号

8位工厂代码(10H)

MSBLSBMSBLSBMSBLSB

图464位ROM结构框图

(3)DS18B20测温原理

图5所示,图中低温度系数振荡器的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数振荡器随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输人。

图5DS18B20的测温原理图

图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到。

时,温度寄存器的值将加1,减法计数器1的预置值将重新被装人,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。

如此循环,直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。

图4.8中的斜率累加器用于补偿和修正测温过程中的非线形性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直到温度寄存器值达到被测温度值。

另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读/写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:

初始化DS18B20(发复位脉冲)~发ROM功能命令~发存储器操作命令~处理数据。

(4)DS18B20与单片机的接口电路

DS18B20可以采用两种方式供电:

一种是采用电源供电方式,此时DS18B20的第1脚接单片机课程设计指导地,第2脚作为信号线,第3脚接电源;另一种是寄生电源供电方式,如图6所示。

单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最长为500ms。

采用寄生电源供电方式时,VDD和GND端均接地。

由于单线制只有一根线,因此发送接口必须是三态的。

图6DS18B20采用寄生电源的电路图

(5)测温系统的硬件工作原理

对DS18B20初始化后,主机发出SKIPROM命令,此命令执行后的存储器操作命令将对所在线的DS18B20,在发出温度转换启动码(44H),等待750ms后,先发出匹配ROM命令(55H)紧接着主机提供一片DS18B20的64位序列号,读取其温度存储器值,存入数据缓存。

5、软件设计

5.1系统程序

系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。

5.2主程序流程图

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。

这样可以在一秒之内测量一次被测温度,其程序流程见图7所示,各模块功能如下:

●读出温度子程序:

读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。

●温度转换命令子程序:

发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。

●计算温度子程序:

将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。

●显示数据刷新子程序:

主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。

●按键扫描处理子程序:

按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。

 

图7主程序流程图

6、总结

通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。

但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。

而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。

所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。

通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

7、参考文献

[1]马忠梅,张凯,等.单片机的C语言应用程序设计(第四版).北京航空航天大学出版社.

[2]薛庆军,张秀娟,等.单片机原理实验教程.北京航天航空大学出版社.

[3]刘和平,刘跃.单片机原理及应用.重庆:

重庆大学出版社.

[4]杨西明,朱骐.单片机编程与入门.北京:

机械工业出版社.

8、附录

8.1仿真图

8.2源程序

#include"reg51.h"

#include"intrins.h"//_nop_();延时函数用

#definedmP0//段码输出口

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P2^7;//温度输入口

sbitw0=P2^0;//数码管4

sbitw1=P2^1;//数码管3

sbitw2=P2^2;//数码管2

sbitw3=P2^3;//数码管1

sbitbeep=P1^7;//蜂鸣器和指示灯

sbitset=P2^6;//温度设置切换键

sbitadd=P2^4;//温度加

sbitdec=P2^5;//温度减

inttemp1=0;//显示当前温度和设置温度的标志位为0时显示当前温度

uinth;

uinttemp;

ucharr;

ucharhigh=35,low=20;

ucharsign;

ucharq=0;

uchartt=0;

ucharscale;

//**************温度小数部分用查表法***********//

ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数断码表

ucharcodetable_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

//共阴LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"

uchartable_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位带小数点的断码表

uchardatatemp_data[2]={0x00,0x00};//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用

/*****************11us延时函数*************************/

voiddelay(uintt)

{

for(;t>0;t--);

}

voidscan()

{

intj;

for(j=0;j<4;j++)

{

switch(j)

{

case0:

dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu

case1:

dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei

case2:

dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei

case3:

dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei

//else{dm=table_dm[b3];w3=0;delay(50);w3=1;}

}

}

}

//***************DS18B20复位函数************************/

ow_reset(void)

{

charpresence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;

delay(50);//550us

DQ=1;

delay(6);//66us

presence=DQ;//presence=0复位成功,继续下一步

}

delay(45);//延时500us

presence=~DQ;

}

DQ=1;//拉高电平

}

/****************DS18B20写命令函数************************/

//向1-WIRE总线上写1个字节

voidwrite_byte(ucharval)

{

uchari;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_();//5us

DQ=val&0x01;//最低位移出

delay(6);//66us

val=val/2;//右移1位

}

DQ=1;

delay

(1);

}

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

ucharread_byte(void)

{

uchari;

ucharvalue=0;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_();//4us

DQ=1;_nop_();_nop_();_nop_();_nop_();//4us

if(DQ)value|=0x80;

delay(6);//66us

}

DQ=1;

return(value);

}

/*****************读出温度函数************************/

read_temp()

{

ow_reset();//总线复位

delay(200);

write_byte(0xcc);//发命令

write_byte(0x44);//发转换命令

ow_reset();

delay

(1);

write_byte(0xcc);//发命令

write_byte(0xbe);

temp_data[0]=read_byte();//读温度值的第字节

temp_data[1]=read_byte();//读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0];//两字节合成一个整型变量。

returntemp;//返回温度值

}

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/

work_temp(uinttem)

{

ucharn=0;

if(tem>6348)//温度值正负判断

{tem=65536-tem;n=1;}//负温度求补码,标志位置1

display[4]=tem&0x0f;//取小数部分的值

display[0]=ditab[display[4]];//存入小数部分显示值

display[4]=tem>>4;//取中间八位,即整数部分的值

display[3]=display[4]/100;//取百位数据暂存

display[1]=display[4]%100;//取后两位数据暂存

display[2]=display[1]/10;//取十位数据暂存

display[1]=display[1]%10;//个位数据

r=display[1]+display[2]*10+display[3]*100;

/////符号位显示判断/////

if(!

display[3])

{

display[3]=0x0a;//最高位为0时不显示

if(!

display[2])

{

display[2]=0x0a;//次高位为0时不显示

}

}

if(n){display[3]=0x0b;}//负温度时最高位显示"-"

}

voidBEEP()

{

if((r>=high&&r<129)||r

{

beep=!

beep;

}

else

{

beep=0;

}

}

//*********设置温度显示转换************//

voidxianshi(inthorl)

{

intn=0;

if(horl>128)

{

horl=256-horl;n=1;

}

display[3]=horl/100;

display[3]=display[3]&0x0f;

display[2]=horl%100/10;

display[1]=horl%10;

display[0]=0;

if(!

display[3])

{

display[3]=0x0a;//最高位为0时不显示

if(!

display[2])

{

display[2]=0x0a;//次高位为0时不显示

}

}

if(n)

{

display[3]=0x0b;//负温度时最高位显示"-"

}

}

//*********按键查询程序**************//

voidkeyscan()

{

inttemp1;//最高温度和最低温度标志位

if(set==0)

{

while

(1)

{

delay(500);//消抖

if(set==0)

{

temp1++;

while(!

set)

scan();

}

if(temp1==1)

{

xianshi(high);

scan();

if(add==0)

{

while(!

add)

scan();

high+=1;

}

if(dec==0)

{

while(!

dec)

scan();

high-=1;

}

}

if(temp1==2)

{

xianshi(low);

if(add==0)

{

while(!

add)

scan();

low+=1;

}

if(dec==0)

{

while(!

dec)

scan();

low-=1;

}

scan();

}

if(temp1>=3)

{

temp1=0;

break;

}

}

}

}

/****************主函数************************/

voidmain()

{

dm=0x00;//初始化端口

w0=0;

w1=0;

w2=0;

w3=0;

for(h=0;h<4;h++)//开机显示"0000"

{

display[h]=0;

}

ow_reset();//开机先转换一次

write_byte(0xcc);//SkipROM

write_byte(0x44);//发转换命令

for(h=0;h<100;h++)//开机显示"0000"

{

scan();

}

while

(1)

{

if(temp1==0)

{

work_temp(read_temp());//处理温度数据

BEEP();

scan();//显示温度值

keyscan();

}

else

keyscan();

}

}

//******************

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2