单片机温度测量论文.docx

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

单片机温度测量论文.docx

《单片机温度测量论文.docx》由会员分享,可在线阅读,更多相关《单片机温度测量论文.docx(27页珍藏版)》请在冰点文库上搜索。

单片机温度测量论文.docx

单片机温度测量论文

西安邮电学院

单片机课程设计报告(数字温度计)

 

院系:

自动化学院

专业班级:

智能0802班

组员:

姚明强(06084055)洪平阳(06084039)朱小龙(06084054)杨万勇(06084046)

寇文龙(06084041)

 

2010年12月6~17日

 

目录

1概述2

1.1课程设计的意义2

1.2设计的任务和要求2

1.3实验仪器设备2

2系统总体方案及硬件设计3

2.1数字温度计设计方案论证3

2.1.1方案一3

2.1.2方案二3

2.2系统总体设计3

2.3系统模块4

2.3.1主控制器4

2.3.2显示电路5

2.3.3温度传感器5

2.3.4报警温度调整按键6

3系统软件算法分析7

3.1主程序流程图7

3.2读出温度子程序8

3.3温度转换命令子程序8

3.4计算温度子程序8

3.5显示数据刷新子程序9

3.6按键扫描处理子程序9

4实验仿真10

焊接实物图11

5源程序代码12

6总结与体会18

1概述

1.1课程设计的意义

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

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

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

1.2设计的任务和要求

1、LED数码管直接显示室内温度。

2、当温度高于35度或低于20度时,启动蜂鸣器报警。

3、温度上下限是-55到+125度。

4、温度误差0.1°C。

 

1.3、实验仪器设备:

1、89C52单片机

2、温度传感器

3、LED数码管

4、实验工具箱及电阻等器材

2系统总体方案及硬件设计

2.1数字温度计设计方案论证

2.1.1方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。

而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。

2.1.2方案二

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

从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。

2.2系统总体设计

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

 

图2.2—1 总体设计方框图

图2.2—2系统仿真图

2.3系统模块

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

2.3.1主控制器

单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。

晶振采用12MHZ。

复位电路采用上电加按钮复位。

图2.3.1—1晶振电路

图2.3.1—2复位电路

2.3.2显示电路

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

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

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

图2.3.2数码管显示电路

2.3.3温度传感器

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20的性能特点如下:

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

2、多个DS18B20可以并联在惟一的三线上,实现多点组网功能

3、无须外部器件;

4、可通过数据线供电,电压范围为3.0~5.5V;

5、零待机功耗;

6、温度以9或12位数字;

7、用户可定义报警设置;

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

9、负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。

另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

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

采用寄生电源供电方式时VDD端接地。

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

图2.3.3温度传感器与单片机的连接

2.3.4报警温度调整按键

本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。

均采用软件消抖。

图2.3.4按键电路

3系统软件算法分析

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

3.1主程序流程图

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

这样可以在一秒之内测量一次被测温度,其程序流程见图3.1所示。

 

图3.1主程序流程图

3.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。

其程序流程图如图3.2示

3.3温度转换命令子程序

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

温度转换命令子程序流程图如上图,图3.3所示

 

图3.3温度转换流程图

 

图3.2读温度流程图

 

3.4计算温度子程序

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4所示。

3.5显示数据刷新子程序

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

程序流程图如图3.5。

 

图3.4 计算温度流程图  图3.5 显示数据刷新流程图

3.6按键扫描处理子程序

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

如下图3.6示。

图3.6按键扫描处理子程序

4实验仿真

进入protuse后,连接好电路,并将程序下载进去。

将DS18B20的改为0.1,数码管显示温度与传感器的温度相同。

图4—1温度显示仿真

当按下SET键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,按ADD或DEC分别对报警温度进行加一或减一。

当再次按下SET键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,按ADD或DEC分别对报警温度进行加一或减一。

图4—2温度调试仿真

当第三次按下SET键时,退出温度报警线设置。

显示当前温度。

焊接实物图

5源程序代码

//DS18B20的读写程序,数据脚P2.7//

//温度传感器18B20汇编程序,采用器件默认的12位转化//

//最大转化时间750微秒,显示温度-55到+125度,显示精度//

//为0.1度,显示采用4位LED共阳显示测温值//

//P0口为段码输入,P34~P37为位选//

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

#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();

}

}

//***********************结束**************************//

6总结与体会

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

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

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

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

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

在焊接过程中我们曾将温度传感器的电源、地焊反啦,导致温度传感器急剧发热,后经观察和查询资料才得以改正。

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

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

当前位置:首页 > 求职职场 > 简历

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

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