OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3858|回复: 0

基于51单片机,DS18B20温度传感器数码管显示

[复制链接]

4

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-8-25
在线时间
5 小时
发表于 2020-8-25 20:24:33 | 显示全部楼层 |阅读模式
本帖最后由 有心插花花木兰 于 2020-8-26 16:18 编辑

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];
}

/*******************************************************************************
* 函数名         igDisplay()
* 函数功能   :数码管显示函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
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);}
        }               
}
有任何问题可加vxTHEQIUYUE
6A4A662A-02BF-4D7C-9BC9-BA3C29DB5A02.jpeg

DS18B20温度传感器.rar

40.09 KB, 下载次数: 25

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 07:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表