(完整版)基于51单片机与DS18B20的数字温度计设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2
温度报警,能任意设定温度范围实现声光报警;
每隔10分钟记录一次温度数据,至少能查询过去10个时刻的温度情况。
2
序号
耗材名称
数量
1
AT89S51
1
2
FJ5461BH,共阳极四合一数码管
1
3
欧姆龙按键
4
4
DS18B20,串口温度传感器,
2
5
485串行通信驱动电路(封装DIP)
1
6
120/0.5W电阻
*读取18B20 ID
*
***************************************/
void GetID()
{
unsigned char i ;
Init_DS18B20() ;
WriteOneChar(0x33);
delay(1) ;
for(i=0 ; i<8 ; i++ )
B20_ID[i] = ReadOneChar();
实际温度=07D0H*0.0625=2000*0.0625=125℃。
例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算),
实际温度=370H*0.0625=880*0.0625=55℃。
可见其中低四位为小数位。
图8DS18B20温度数据表
4.2
LED数码管显示采用动态扫描方式,能简化电路布线,节约单片机I/O端口。
{
unsigned char x=0,i;
DQ = 1;
delay(8);
DQ = 0;
//delay( 500 ); //480us - 720us
DisPlay_Dtube( tempe_n , 3 , 3 , 0x00 );
DQ = 1;
//delay( 40 );
DisPlay_Dtube( tempe_n , 1 , 3 , 0x00 );
图13 读温度值子程序流程图图14DS18B20初始化子程序流程图
3DS18B20写字节和读字节子程序流程图:
图15 DS18B20写字节子程序流程图图16DS18B20读字节子程序流程图
5.3
中断采用T0方式1,初始值定时为50ms。
中断模块需调用两个子程序:
读温度值子程序:定时读取温度值,实时更新温度值
for ( i = 16; i > 1; i-- )
{
x = DQ; // x=0初始化成功;x=1初始化失败
if(!x) break;
}
retuຫໍສະໝຸດ Baidun ( x );
//delay( 100 );
DisPlay_Dtube( tempe_n , 1 , 3 , 0x00 );
}
/**********************************
static unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
2
18
芯排线一米
1
3
2
2
由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。
2
考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
unsigned int ChTempe(unsigned char a ,unsigned char b)
{
unsigned int T = 0 ;
T=a+b*256;
if (T==0xffff) return 0xffff;
if (T>0x8000)
{
T=-T;
return (0x8000+T*5/8);
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃
温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字
应用包括温度控制、工业系统、消费品、温度计和任何热感测系统
负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作
温度查询模块流程图如下:
N
Y
N
Y
N
Y
Y
N
N
Y
Y
N
N
Y
图18温度查询模块流程图
6 PCB
7
DS18B20相关函数:
/**************************
*18B20初始化
*
*************************/
unsigned char Init_DS18B20(void)
*数码管显示
* Num:显示的数字
* DIS_NUM :循环显示次数
12
7
PNP三极管
4
8
发光二极管直径5mm,红一绿一
2
9
蜂鸣器
1
10
辅铜板10cm*20cm
1
11
1k/(1/8w),
4
12
插座DIP40
1
13
与RS232电路配套的DIP插座
1
14
电源板插(SIP2套件)
4
15
双排IDC10排插,RS232通信接插在板接插座
1
16
DB9串口通信接头(阴)
1
17
0.75导线3米(红、黑、白各1米
DS18B20数字温度传感器的初始化和读取温度值
LED数码管显示驱动与控制
按键识别和响应控制
温度设置和报警
温度值的存储和读取
2.单片机系统电路原理图:
图2 单片机系统原理图
4.1
4.1.1
独特的单线接口仅需一个端口引脚进行通信
简单的多点分布应用
无需外部器件
可通过数据线供电
零待机功耗
测温范围-55~+125℃,以0.5℃递增
图11 键盘输入电路5
5
5.1
主程序需要调用3个子程序,分别为:
实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示
查询记录温度值子程序:查询过去存储的温度值,最多可查询10个值
温度设定、报警子程序:设定报警温度值,当温度超过该值时产生报警,即驱动蜂鸣器鸣叫、8个发光二极管发光
主程序流程图:
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
//延时函数
static void delay(unsigned int i)
{
while(--i);
}
数码管显示函数:
unsigned intcode DtubeNum[]={0xeb,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA};/************************************************
下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,
Init_DS18B20() ;
WriteOneChar(0xCC);
WriteOneChar(0x44);
while(!DQ)
DisPlay_Dtube( tempe_n , 0 , 3 , 0x00 );
Init_DS18B20();
WriteOneChar(0x55);
for(i=0 ; i<8 ; i++)
{
unsigned char i , CRC_Data = 0;
for( i = 0 ; i < c ; i ++)
//CRC_Data = CRC_Table[];
return CRC_Data ;
}
/**************************
*
*读一个字节
*
*************************/
以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。
图1 系统总体方框图
2
本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如图1。
3
3
1.本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:
}
/**************************
*读取温度
*
*************************/
unsigned int ReadTempe(char ID)
{
unsigned char i;
unsigned char a=0;
unsigned char b=0;
unsigned int T=0;
信息与通信工程学院
课
程
设
计
项目:基于单片机的DS18B20数字温度计设计
指导老师:湛腾西
设计人:尹世强彭娇礼
班级:电实11-1BF
2013年06月18日
1
1
1、测量精度0.5℃
2、范围:-50℃-110℃
3、可测多点温度,演示两点以上
4、LED直读显示
5、可任意设计温度报警的上限与下限
6、可上传通信(RS232口),也可以相互对通(485口)
段码和位码由单片机P0送出,分别用74HC673N锁存。
图9 数码管驱动显示电路
4.3
当温度超过设定温度值时,实现声光报警,蜂鸣器鸣叫、8个发光二极管点亮。蜂鸣器由单片机P2^3口控制,用三极管驱动,发光二极管接单片机P1口,由74HC673N锁存。
图10报警电路
4.4
四个键分别连接单片机P3^4、P3^5、P3^6、P3^7构成独立式键盘,分别实现加、减、报警温度设定功能键和温度查询功能键。
记录温度值子程序:定时记录温度值,供查询使用
把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。
中断模块流程图:
Y
N
图17中断模块流程图
5.4
温度查询模块需要接受按键输入,进入查询界面后,按加减键分别查询上一个和下一个历史温度值,并驱动数码管显示需要查询的温度值。
WriteOneChar( B20_Rom[ID][i]);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
T = ChTempe( a , b );
return T ;
}
/*-----------------------------
温度换算
-----------------------------*/
图12 主程序流程图
5.2
读温度值模块需要调用4个子程序,分别为:
DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作
DS18B20写字节子程序:对DS18B20发出命令
DS18B20读字节子程序:读取DS18B20存储器的数据
延时子程序:对DS18B20操作时的时序控制
1.读温度值模块流程图:2.DS18B20初始化子程序流程图:
4.1.2
图3DS18B20外形及引脚
GND:地
DQ:单线运用的数据输入/输出引脚
VD:可选的电源引脚
4.1.3
单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。
图4 DS18B20接线原理图
4.1.4
主机使用时间隙来读写DS18B20的数据位和写命令字的位。
1.初始化时序如下图:
}
else
return (T*5/8);
}
/*********************************************
* CRC校验
*
**********************************************/
unsigned char CRC(unsigned char c)
图5 DS18B20初始化时序
2.DS18B20读写时序:
图6DS18B20读写时序
4.1.5
高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
图7 字节分配
}
return(dat);
}
/**************************
*
*写一个字节
*
*************************/
static void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
温度报警,能任意设定温度范围实现声光报警;
每隔10分钟记录一次温度数据,至少能查询过去10个时刻的温度情况。
2
序号
耗材名称
数量
1
AT89S51
1
2
FJ5461BH,共阳极四合一数码管
1
3
欧姆龙按键
4
4
DS18B20,串口温度传感器,
2
5
485串行通信驱动电路(封装DIP)
1
6
120/0.5W电阻
*读取18B20 ID
*
***************************************/
void GetID()
{
unsigned char i ;
Init_DS18B20() ;
WriteOneChar(0x33);
delay(1) ;
for(i=0 ; i<8 ; i++ )
B20_ID[i] = ReadOneChar();
实际温度=07D0H*0.0625=2000*0.0625=125℃。
例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算),
实际温度=370H*0.0625=880*0.0625=55℃。
可见其中低四位为小数位。
图8DS18B20温度数据表
4.2
LED数码管显示采用动态扫描方式,能简化电路布线,节约单片机I/O端口。
{
unsigned char x=0,i;
DQ = 1;
delay(8);
DQ = 0;
//delay( 500 ); //480us - 720us
DisPlay_Dtube( tempe_n , 3 , 3 , 0x00 );
DQ = 1;
//delay( 40 );
DisPlay_Dtube( tempe_n , 1 , 3 , 0x00 );
图13 读温度值子程序流程图图14DS18B20初始化子程序流程图
3DS18B20写字节和读字节子程序流程图:
图15 DS18B20写字节子程序流程图图16DS18B20读字节子程序流程图
5.3
中断采用T0方式1,初始值定时为50ms。
中断模块需调用两个子程序:
读温度值子程序:定时读取温度值,实时更新温度值
for ( i = 16; i > 1; i-- )
{
x = DQ; // x=0初始化成功;x=1初始化失败
if(!x) break;
}
retuຫໍສະໝຸດ Baidun ( x );
//delay( 100 );
DisPlay_Dtube( tempe_n , 1 , 3 , 0x00 );
}
/**********************************
static unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
2
18
芯排线一米
1
3
2
2
由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。
2
考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
unsigned int ChTempe(unsigned char a ,unsigned char b)
{
unsigned int T = 0 ;
T=a+b*256;
if (T==0xffff) return 0xffff;
if (T>0x8000)
{
T=-T;
return (0x8000+T*5/8);
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃
温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字
应用包括温度控制、工业系统、消费品、温度计和任何热感测系统
负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作
温度查询模块流程图如下:
N
Y
N
Y
N
Y
Y
N
N
Y
Y
N
N
Y
图18温度查询模块流程图
6 PCB
7
DS18B20相关函数:
/**************************
*18B20初始化
*
*************************/
unsigned char Init_DS18B20(void)
*数码管显示
* Num:显示的数字
* DIS_NUM :循环显示次数
12
7
PNP三极管
4
8
发光二极管直径5mm,红一绿一
2
9
蜂鸣器
1
10
辅铜板10cm*20cm
1
11
1k/(1/8w),
4
12
插座DIP40
1
13
与RS232电路配套的DIP插座
1
14
电源板插(SIP2套件)
4
15
双排IDC10排插,RS232通信接插在板接插座
1
16
DB9串口通信接头(阴)
1
17
0.75导线3米(红、黑、白各1米
DS18B20数字温度传感器的初始化和读取温度值
LED数码管显示驱动与控制
按键识别和响应控制
温度设置和报警
温度值的存储和读取
2.单片机系统电路原理图:
图2 单片机系统原理图
4.1
4.1.1
独特的单线接口仅需一个端口引脚进行通信
简单的多点分布应用
无需外部器件
可通过数据线供电
零待机功耗
测温范围-55~+125℃,以0.5℃递增
图11 键盘输入电路5
5
5.1
主程序需要调用3个子程序,分别为:
实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示
查询记录温度值子程序:查询过去存储的温度值,最多可查询10个值
温度设定、报警子程序:设定报警温度值,当温度超过该值时产生报警,即驱动蜂鸣器鸣叫、8个发光二极管发光
主程序流程图:
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
//延时函数
static void delay(unsigned int i)
{
while(--i);
}
数码管显示函数:
unsigned intcode DtubeNum[]={0xeb,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA};/************************************************
下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,
Init_DS18B20() ;
WriteOneChar(0xCC);
WriteOneChar(0x44);
while(!DQ)
DisPlay_Dtube( tempe_n , 0 , 3 , 0x00 );
Init_DS18B20();
WriteOneChar(0x55);
for(i=0 ; i<8 ; i++)
{
unsigned char i , CRC_Data = 0;
for( i = 0 ; i < c ; i ++)
//CRC_Data = CRC_Table[];
return CRC_Data ;
}
/**************************
*
*读一个字节
*
*************************/
以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。
图1 系统总体方框图
2
本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如图1。
3
3
1.本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:
}
/**************************
*读取温度
*
*************************/
unsigned int ReadTempe(char ID)
{
unsigned char i;
unsigned char a=0;
unsigned char b=0;
unsigned int T=0;
信息与通信工程学院
课
程
设
计
项目:基于单片机的DS18B20数字温度计设计
指导老师:湛腾西
设计人:尹世强彭娇礼
班级:电实11-1BF
2013年06月18日
1
1
1、测量精度0.5℃
2、范围:-50℃-110℃
3、可测多点温度,演示两点以上
4、LED直读显示
5、可任意设计温度报警的上限与下限
6、可上传通信(RS232口),也可以相互对通(485口)
段码和位码由单片机P0送出,分别用74HC673N锁存。
图9 数码管驱动显示电路
4.3
当温度超过设定温度值时,实现声光报警,蜂鸣器鸣叫、8个发光二极管点亮。蜂鸣器由单片机P2^3口控制,用三极管驱动,发光二极管接单片机P1口,由74HC673N锁存。
图10报警电路
4.4
四个键分别连接单片机P3^4、P3^5、P3^6、P3^7构成独立式键盘,分别实现加、减、报警温度设定功能键和温度查询功能键。
记录温度值子程序:定时记录温度值,供查询使用
把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。
中断模块流程图:
Y
N
图17中断模块流程图
5.4
温度查询模块需要接受按键输入,进入查询界面后,按加减键分别查询上一个和下一个历史温度值,并驱动数码管显示需要查询的温度值。
WriteOneChar( B20_Rom[ID][i]);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
T = ChTempe( a , b );
return T ;
}
/*-----------------------------
温度换算
-----------------------------*/
图12 主程序流程图
5.2
读温度值模块需要调用4个子程序,分别为:
DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作
DS18B20写字节子程序:对DS18B20发出命令
DS18B20读字节子程序:读取DS18B20存储器的数据
延时子程序:对DS18B20操作时的时序控制
1.读温度值模块流程图:2.DS18B20初始化子程序流程图:
4.1.2
图3DS18B20外形及引脚
GND:地
DQ:单线运用的数据输入/输出引脚
VD:可选的电源引脚
4.1.3
单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。
图4 DS18B20接线原理图
4.1.4
主机使用时间隙来读写DS18B20的数据位和写命令字的位。
1.初始化时序如下图:
}
else
return (T*5/8);
}
/*********************************************
* CRC校验
*
**********************************************/
unsigned char CRC(unsigned char c)
图5 DS18B20初始化时序
2.DS18B20读写时序:
图6DS18B20读写时序
4.1.5
高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
图7 字节分配
}
return(dat);
}
/**************************
*
*写一个字节
*
*************************/
static void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)