标题: 基于51单片机,DS18B20温度传感器数码管显示 [打印本页]

作者: 有心插花花木兰    时间: 2019-10-17 11:26
标题: 基于51单片机,DS18B20温度传感器数码管显示
ds18b20温度传感器,设置高低电平预警值。高于预警值H或低于预警值L蜂鸣器报警。并且掉电保存功能

K1、显示当前温度,预警值H,预警值L

k 2,加预警值

k3,减预警值

k4,保存当前显示的值


/**************************************************************************************
*                DS18B20温度传感器实验              *
实现现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示
   检测的温度值,
注意事项:                     
***************************************************************************************/
#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
#include"temp.h"
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit key_1=P3^1;
sbit key_2=P3^0;
sbit key_3=P3^2;
sbit key_4=P3^3;
sbit beep=P1^5;
char num=0,i=1;

u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x76,0x38};                //16是“-” ,17是“H”,18是“L”
char h,l;
u8 h_1,l_1;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);        
}


/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能                   : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/

void datapros(int temp)         
{
           float tp;  
        if(temp< 0)                                //当温度值为负数
          {
                DisplayData[0] = 0x40;           //   -
                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
                temp=temp-1;
                temp=~temp;
                tp=temp;

temp=tp*0.0625*100+0.5;
  //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  //算加上0.5,还是在小数点后面。
   }
  else
   {   
  DisplayData[0] = 0x00;
  tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  //如果温度是正的那么,那么正数的原码就是补码它本身
  temp=tp*0.0625*100+0.5;
  //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  //算加上0.5,还是在小数点后面。
}
DisplayData[2] = smgduan[temp / 10000];
DisplayData[3] = smgduan[temp % 10000 / 1000];
h_1=temp % 10000 / 1000;
DisplayData[4] = smgduan[temp % 1000 / 100] | 0x80;
l_1=temp % 1000 / 100;
DisplayData[5] = smgduan[temp % 100 / 10];
DisplayData[6] = smgduan[temp % 10];
}
void datapros_1(int temp)
{
DisplayData[2] = smgduan[temp % 1000 / 100];
DisplayData[3] = smgduan[temp % 100 / 10];
DisplayData[4] = smgduan[temp % 10]|0x80;
DisplayData[5] = smgduan[0];
DisplayData[6] = smgduan[0];
}

/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能   :数码管显示函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<6;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位        
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                }
                P0=DisplayData[6-i];//发送数据
                delay(100); //间隔一段时间扫描        
                P0=0x00;//消隐
        }               
}

void keypros_1()   
{
        if(key_1==0)                 
        {        
                delay(1000);   
                if(key_1==0)         
                {               
                        if(i==1){DisplayData[1]=table[17];datapros_1(ds18b20_read_hl(1));h=ds18b20_read_hl(1);}

if(i==2){DisplayData[1]=table[18];datapros_1(ds18b20_read_hl(0));l=ds18b20_read_hl(0);}
                        if(i==3){DisplayData[1]=smgduan[0];datapros(Ds18b20ReadTemp());}
                        if(i==4){i=0;}
                        i++;        
                }
                while(!key_1);        
        }               
}
void keypros_2()   
{
        if(key_2==0)                 
        {        
                delay(1000);   
                if(key_2==0)         
                {        
                        if(i==2){h++;datapros_1(h);}
                        if(i==3){l++;datapros_1(l);}                                
                }
                while(!key_2);        
        }               
}
void keypros_3()
{  
        if(key_3==0)                 
        {        
                delay(1000);   
                if(key_3==0)         
                {               
                        if(i==2){h--;datapros_1(h);}
                        if(i==3){l--;datapros_1(l);}               
                }
                while(!key_3);        
        }               
}
void keypros_4()
{
                if(key_4==0)                 
        {        
                delay(1000);   
                if(key_4==0)         
                {               
                        Ds18b20_Write_hl(h,l);
                        ds18b20_eeprom();
                }
                while(!key_4);        
        }        
}        

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        while(1)
        {
                keypros_1();
                keypros_2();
                keypros_3();
                keypros_4();
                DigDisplay();//数码管显示函数               
                if(((h_1*10+l_1)<l||(h_1*10+l_1)>h)&&i!=0){beep=~beep;delay(10);}
        }               
}

最后,希望能接手一些项目做,基于51或是32都行
有视频连接和源代码连接
链接:https://pan.baidu.com/s/1Wbc-1TDq_OfL4Q8I_PshGQ
提取码:nbj3
复制这段内容后打开百度网盘手机App,操作更方便哦


DS18B20温度传感器.rar

40.09 KB, 下载次数: 117, 下载积分: 黑币 -5


作者: 666liuxing    时间: 2020-5-25 10:32
能成吗
作者: 有心插花花木兰    时间: 2020-5-25 13:28
666liuxing 发表于 2020-5-25 10:32
能成吗

要硬件和代码配合哦⊙⊙!
作者: liKayla    时间: 2020-5-31 12:19
有仿真图吗
作者: 有心插花花木兰    时间: 2020-6-1 19:10
liKayla 发表于 2020-5-31 12:19
有仿真图吗

去看我其它的文章,联系我我发给你
作者: 有心插花花木兰    时间: 2020-6-1 19:11
666liuxing 发表于 2020-5-25 10:32
能成吗

哪里不会可以问我
作者: ys1640690958    时间: 2020-6-2 17:36
楼主你好,请问可以提供一下仿真电路图吗?

作者: 有心插花花木兰    时间: 2020-6-2 19:08
ys1640690958 发表于 2020-6-2 17:36
楼主你好,请问可以提供一下仿真电路图吗?

其他文章有我联系方式
作者: hyp12349    时间: 2020-6-6 12:08
楼主,这个压缩包里边有没有DS18B20的AD元器件库啊?

作者: 有心插花花木兰    时间: 2020-6-7 01:58
hyp12349 发表于 2020-6-6 12:08
楼主,这个压缩包里边有没有DS18B20的AD元器件库啊?

AD库文件太大,上传不了你给我邮箱我发给你

作者: 梨子栗子    时间: 2020-6-20 21:28
楼主,分享呗取消了,求分享!!!
作者: 有心插花花木兰    时间: 2020-6-21 00:15
梨子栗子 发表于 2020-6-20 21:28
楼主,分享呗取消了,求分享!!!

好,联系我
作者: 1742413784    时间: 2020-12-29 00:50
没有电路图啊
作者: 1742413784    时间: 2020-12-29 00:50
没有符号啊不行




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1