基于51单片机温度检测电子设计系统DS18B20(Proteus仿真+Keil源码+设计文档+原理图等)附下载链接!

提供对应的Proteus仿真电路图,Keil程序源码(C语言),原理图,模块资料、元件清单、程序流程图等电子资料参考学习。

1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接

01设计要求

设计一个基于51单片机温度检测报警系统:
1)采用51单片机搭配DS18B20温度传感器与4位数码管组成硬件系统;
2)测温量程范围-55.0~125.0摄氏度;
3)测温分辨率可达 0.1 摄氏度;
4)当温度低于设定下限或超出设定上限时,系统自动进行声光预警;
5)支持按键手动自定义设置温度上下限阈值。

02系统概述

传感器采用DS18B20,负责采集温度数据后发给单片机。显示设备采用4位共阴数码管,显示检测到的温度值。按键模块,主要是进行报警值的设置。报警模块采用蜂鸣器+LED的模式,超出报警范围则进行声光报警。

03Proteus仿真在这里插入图片描述

04示例代码

/*   数码管的显示值:  0    1    2    3    4    5     6   7    8    9    -   */
uchar code Array1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };

/*                     0.   1.   2.   3.   4.   5.    6.  7.   8.   9.  */
uchar code Array2[]={ 0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };

uchar Buff[4];					                          //显示缓冲区
uchar ShowID = 1;					                      //当前显示的是哪一个数码管

int AlarmLow = 200;				                          //默认报警的温度下限值是20度
int AlarmHig = 350;				                          //默认报警的温度上限值是35度

/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
		for(j=0;j<110;j++);
}

/*********************************************************/
// 延时X*10us函数
/*********************************************************/
void DelayX10us(unsigned char t)
{
    do{
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        _nop_();                                          //延时1us
        }while(--t);                                      //t先自减,然后判断t的值是否大于0
}
/*********************************************************/
// 复位18B20
/*********************************************************/
bit Reset18B20()
{
    bit ack;                                              //定义一个bit型变量

    DQ = 0;                                               //数据引脚拉低
    DelayX10us(50);                                       //延时500us
    DQ = 1;                                               //数据引脚拉高
    DelayX10us(6);                                        //延时60us
    ack = DQ;                                             //读取复位值
    while(!DQ);                                           //判断是否为高电平
    
    return ack;                                           //返回复位值
}
/*********************************************************/
// 向18B20写数据或命令
/*********************************************************/
void Write18B20(unsigned char dat)
{
    unsigned char mask;                                   //定义一个mask变量
    
    for(mask=0x01; mask!=0; mask<<=1)                     //循环8次,从低到高依次写入
    {
        DQ = 0;                                           //初始电平为0
        _nop_();                                          //延时大约为1us
        _nop_();                                          //延时大约为1us
        if((dat & mask) == 0)                             //判断写入的一位是否为0
            DQ = 0;                                       //为0,数据位为0
        else
            DQ = 1;                                       //否则,数据位为1
        DelayX10us(6);                                    //延时60us
        DQ = 1;                                           //拉高数据位,为下次写作准备
    }
}
/*********************************************************/
// 从18B20读数据或命令
/*********************************************************/
unsigned char Read18B20()
{
    unsigned char mask;                                   //定义一个mask变量
    unsigned char dat;                                    //定义一个dat变量,用于保存读到的数据
    
    for(mask=0x01; mask!=0; mask<<=1)                     //循环8次,从低到高依次读出
    {
        DQ = 0;                                           //初始电平为0
        _nop_();                                          //延时大约为1us
        _nop_();                                          //延时大约为1us
        DQ = 1;                                           //数据电平拉高
        _nop_();                                          //延时大约为1us
        _nop_();                                          //延时大约为1us
        if(DQ == 0)                                       //判读数据引脚是否为0
            dat &= ~mask;                                 //若为0,dat按位与上0xfe,读出0
        else
            dat |= mask;                                  //否则,dat按位或上0x01,读出1
        DelayX10us(6);                                    //延时60us
    }
    
    return dat;                                           //返回读出数据dat
}
/*********************************************************/
// 获取18B20温度数据
/*********************************************************/
int Get18B20Temp()
{
    bit ack;                                             //定义bit型变量
    int temp;                                            //定义有符号整形变量temp,用于保存温度数据
    unsigned char LSB, MSB;                              //定义两个无符号字符型变量,用于保存从18B20中读出的两个数据
    
    ack = Reset18B20();                                  //获取18B20复位位
    if(ack == 0)                                         //判读是否复位
    {
        Write18B20(0xcc);                                //跳过检测ROM
        Write18B20(0x44);                                //启动温度转换指令
    }
    
    ack = Reset18B20();                                  //获取18B20复位位
    if(ack == 0)                                         //判读是否复位
    {
        Write18B20(0xcc);                                //跳过检测ROM
        Write18B20(0xbe);                                //读取温度指令
        LSB = Read18B20();                               //先读第8位
        MSB = Read18B20();                               //再读高8位
        temp = ((int)MSB<<8) + LSB;                      //高8位,第8位整合成一个有符号的整型变量,并把值保存在temp中
        temp = temp * 0.0625 * 10;                       //合成温度值并放大10倍
    }
    
    return temp;                                         //返回读到的温度数值
}
/*********************************************************/
// 定时器初始化
/*********************************************************/
void TimerInit()
{
	TMOD = 0x01;					                      // 使用定时器0,工作方式1	 
	TH0  = 248;						                      // 给定时器0的TH0装初值,定时2ms
	TL0  = 48;						                      // 给定时器0的TL0装初值
	ET0  = 1;							                  // 定时器0中断使能
	EA   = 1;							                  // 打开总中断
	TR0	 = 1;							                  // 启动定时器0
}

05原理图在这里插入图片描述

注:

  1. 源码使用Keil4或Keil5打开

  2. 仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。

06资料获取

1)项目完整资料获取链接:下载链接

2)Keil、Proteus各个版本安装包: 下载链接

posted @ 2026-06-29 14:39  _Passion  阅读(40)  评论(0)    收藏  举报