单片机 温度计.docx
- 文档编号:3776613
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:16
- 大小:555.79KB
单片机 温度计.docx
《单片机 温度计.docx》由会员分享,可在线阅读,更多相关《单片机 温度计.docx(16页珍藏版)》请在冰豆网上搜索。
单片机温度计
摘要
本设计介绍了一种以单片机为主要控制器件,以DS18B20为温度传感器的新型数字温度计,主要包括硬件电路的设计和系统程序的设计。
硬件电路主要包括主控制器,测温电路和显示电路等,主控制器采用单片机STC89S52,温度传感器采用DS18B20,显示电路采用8位共阴数码管以动态扫描法直接显示。
以单片机作为主控核心,与温度传感器、锁存器等模块组成核心主控制模块,在主控模块上设有数码管。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键字:
STC89S52DS18B2074LS245数码管
目录
1.引言2
2.总体设计3
2.1基本原理3
2.2系统总体框图及设计思路4
3.详细设计4
3.1硬件设计4
3.2软件设计9
3.2.1程序设计思路9
3.2.2程序流程图10
3.2.3程序代码11
4.系统调试及分析15
5.心得体会17
参考文献18
1.引言
随着电子技术的迅速发展,计算机已深入的渗透到我们的生活中。
随着计算机技术的不断发展,在工业测量控制领域内单片机的应用越来越广泛。
同时,随着超大规模集成电路工艺和集成制造技术的不断完善,单片机的硬件集成度也不断提高,已经出现了能满足各种不同需求、具有各种特殊功能的单片机,这类单片机具有集成度高,性能价格比优越等优点,在工业测量领域内获得了极为广泛的应用价值。
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们迫切需要检测与控制温度。
在人类的生活环境中,温度扮演着极其重要的角色。
本设计的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。
并且引导一种创新的思维,把学到的知识应用到日常生活当中。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全面提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
2.总体设计
2.1基本原理
本系统是一个基于单片机STC89S52的数字温度计的设计,用来测量环境温度,测量范围为-50℃—110℃度。
整个设计系统分为3部分:
单片机控制、温度传感器以及数码显示。
整个设计是以STC89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。
单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。
LED采用2个四位一体共阴的数码管。
2.2系统总体框图及设计思路
总体设计思路:
本设计通过温度传感器DS18B20收集外界温度信息,并发送给单片机处理该数据,通过8位数码管显示当先温度值。
3.详细设计
3.1硬件设计
1.芯片及原理介绍
(一)STC89S52
STC89S52:
8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33MHz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
(二)数码管
a、段及小数点上加限流电阻
b、使用电压:
段:
根据发光颜色决定;小数点:
根据发光颜色决定
c、使用电流:
静态:
总电流80mA(每段10mA);动态:
平均电流4-5mA峰值电流100mA
LED数码显示原理:
七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。
LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码表
“0”
3FH
“8”
7FH
“4”
66H
“C”
39H
“1”
06H
“9”
6FH
“5”
6DH
“d”
5EH
“2”
5BH
“A”
77H
“6”
7DH
“E”
79H
“3”
4FH
“b”
7CH
“7”
07H
“F”
71H
(三)18B20温度传感器
DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信,无须经过其它变换电路;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●内含64位经过激光修正的只读存储器ROM;
●可通过数据线供电,内含寄生电源,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;●测温范围为-55℃-+125℃,测量分辨率为0.0625℃①采用单总线专用技术。
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入用户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
DS18B20字节定义
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
表1DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
一部分温度对应值表
2.硬件原理图
P3.6口接DS18B20数据口,接收温度信息,P0口接74LS245锁存器,作为8位数码管的段选控制端,P2口接8位数码管的位选信息。
通过执行程序,8位数码管显示当前温度。
3.2软件设计
3.2.1程序设计思路
主程序实时显示当前温度,读出并处理DS18B20的测量的当前温度值。
温度测量每隔一段时间进行一次。
读出的温度进行转换,变成数码管能显示的数据,单片机动态扫描8位数码管,显示温度值。
3.2.2程序流程图
3.2.3程序代码
1、预定义部分
#include
#include
#defineucharunsignedchar//定义无符号字符型
#defineuintunsignedint//定义无符号整型
sbitDQ=P3^6;//定义温度传感器DS18B20的数据输入端
//共阴数码管段码及空白显示
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//温度小数对照表
ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
ucharCurrentT=0;//当前读取的温度整数部分
ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值
ucharDisplay_Digit[]={0,0,0,0};//待显示的各温度数位
bitHI_Alarm=0,LO_Alarm=0;//高低温报警标志
bitDS18B20_IS_OK=1;//传感器正常标志
uintTime0_Count=0;//定时器延时累加
2、延时部分
voidDelay(uintx)
{
while(--x);
}
3、初始化DS18B20部分
通过改变温度传感器DQ端高低电平启动DS18B20工作。
如果初始化成功,则返回0,否则返回1
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;Delay(8);//拉高电平
DQ=0;Delay(90);//拉低电平
DQ=1;Delay(8);//拉高电平
status=DQ;//读取当前DQ值
Delay(100);
DQ=1;//再次拉高电平
returnstatus;//初始化成功时返回0
}
4、读一字节部分
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;
_nop_();
for(i=0;i<8;i++)//每次读取1位,循环8次,即一字节
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0x80;
Delay(30);
DQ=1;
}
returndat;
}
5、写一个字节部分
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)//每次写1位,循环8次,即一字节
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
6、读取温度值部分
voidRead_Temperature()
{
if(Init_DS18B20()==1)//DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);//跳过序列号
WriteOneByte(0x44);//启动温度转换
Init_DS18B20();
WriteOneByte(0xcc);//跳过序列号
WriteOneByte(0xBE);//读取温度寄存器
Temp_Value[0]=ReadOneByte();//温度低8位
Temp_Value[1]=ReadOneByte();//温度高8位
DS18B20_IS_OK=1;
}
}
7、在数码管上显示温度
voidDisplay_Temperature()
{
uchari;
uchart=150;//延时值
ucharng=0,np=0;//小数点,负号
charSigned_Current_Temp;//定义有符号当前温度值
//如果为负数则取反加1,并设置符号标识及符号显示位置
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
np=0xfd;//默认负号显示在左边第2位
}
//查表得到温度小数部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
//获取温度整数部分(无符号)
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
//有符号的当前温度值,注意定义为char,其值可为-128~+127
Signed_Current_Temp=ng?
-CurrentT:
CurrentT;
//将整数部分分解为三位待显示数字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)//高位为0则不显示
{
Display_Digit[3]=10;
np=0xfb;//调整负号位置
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0xf7;//调整负号位置
}
}
for(i=0;i<30;i++)//刷新显示若干时间
{
P1=0x39;P2=0x7f;Delay(t);//P2=0xff;//显示C
P1=0x63;P2=0xbf;Delay(t);//P2=0xff;//显示。
P1=DSY_CODE[Display_Digit[0]];//小数位
P2=0xdf;Delay(t);//P2=0xff;
P1=(DSY_CODE[Display_Digit[1]])|0x80;//个位及小数点
P2=0xef;Delay(t);//P2=0xff;
P1=DSY_CODE[Display_Digit[2]];//十位
P2=0xf7;Delay(t);//P2=0xff;
P1=DSY_CODE[Display_Digit[3]];//百位
P2=0xfb;Delay(t);//P2=0xff;
if(ng)//如果为负则在调整后的位置显示“-”
{
P1=0x40;
P2=np;
Delay(t);
P2=0xff;
}
}
}
sbite=P3^3;
8、主程序部分
voidmain(void)
{
Read_Temperature();//读取温度值
Delay(50000);
Delay(50000);
while
(1)
{
e=1;
Read_Temperature();//读取温度值
if(DS18B20_IS_OK)//判断DS18B20是否正常工作
{
Display_Temperature();//如果正常工作,则显示温度
}
else
{
P1=0X00;//否则,不显示
}
}
}
4.系统调试及分析
1、用keil编写程序编译运行通过后,用Proteus仿真结果如下
程序运行后8位数码管正常显示当前温度。
2、实物连接图如下
5.心得体会
参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 温度计
![提示](https://static.bdocx.com/images/bang_tan.gif)