新手上路 
 
	- 积分
 - 29
 
        - 金钱
 - 29 
 
       - 注册时间
 - 2020-8-25
 
      - 在线时间
 - 5 小时
 
 
 
 | 
 
 本帖最后由 有心插花花木兰 于 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 
 |   
 
 
 
 |