51单片机四位一体数码管显示DS18B20测温的项目工程

180it 2022-04-09 PM 792℃ 0条

基于51单片机四位一体数码管显示DS18B20测温的项目工程

#include<reg52.h>//包含51单片机内部寄存器头文件
#define uchar unsigned char// 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
#define uint unsigned int//自定义uint为unsigned int(即无符号字符整数型数据,数据范围:0到6355。)                    
uchar code table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //个位带数点字码表
uchar code Wei[]={0xfe,0xfd,0xfb,0xf7};//数码管位数码表  
//uchar Display_data[4];//显示数据数组 
uint  Temperature_value;//温度值
uint bai,shi,ge,xiaoshu;//温度值                
uchar Temperature_flag;//温度负标志  
sbit DQ=P1^6;//DS18B20数据信号端口
/*DS18B20的延时函数*/
  void DS18B20_Delay(uint i)
{ 
  while(i--); 
 }
/*DS18B20的初始化函数*/   
  void DS18B20_Init()              
{ 
   uchar x=0; 
   DQ = 1;//DS18B20数据信号端口DQ复位 
   DS18B20_Delay(4);             
   DQ = 0;//DS18B20数据信号端口DQ拉低 
   DS18B20_Delay(100);//精确延于480us 
   DQ = 1;//DS18B20数据信号端口拉高 
   DS18B20_Delay(40);
  }     
/*DS18B20读一个字节函数*/   
  uchar DS18B20_ReadOneByte()       
{ 
   uchar i=0; 
   uchar j=0; 
   for (i=8;i>0;i--)
 {
    DQ = 0;//给脉冲信号     
    j>>=1;
    DQ = 1;//给脉冲信号     
    if(DQ)  
    j|=0x80;     
    DS18B20_Delay(10); 
   } 
   return(j);
  }  
/*DS18B20写一个字节函数*/  
  void DS18B20_WriteOneByte(uchar k)     
{
   uchar i=0;     
   for (i=8; i>0; i--)//向DS18B20数据信号端口DQ写入数据8次
 {
    DQ = 0;//DS18B20数据信号端口DQ置低电平
    DQ = k&0x01;//按从低位到高位的顺序向DS18B20数据信号端口DQ发送字节(一次只发送一位)
    DS18B20_Delay(10);      
    DQ = 1;//DS18B20数据信号端口DQ置高电平
    k>>=1;//重复以上的操作,直到所有的字节全部发送完为止。
   }
 }  
 /*单片机读取DS18B20当前温度的函数*/   
  DS18B20_ReadTemperature()            
{
   uchar a,b; 
   DS18B20_Init();//DS18B20初始化
   DS18B20_WriteOneByte(0xcc);//跳读序列号
   DS18B20_WriteOneByte(0x44);//启温度转换 
   DS18B20_Init();//DS18B20初始化
   DS18B20_WriteOneByte(0xcc);//跳读序列号 
   DS18B20_WriteOneByte(0xbe);//读取温度
   a=DS18B20_ReadOneByte();//读取到的第一个字节为温度LS BYTE
   b=DS18B20_ReadOneByte();//读取到的第一个字节为温度MS BYTE
   Temperature_value=b;//先把高八位有效数据赋于Temperature
   Temperature_value<<=8; 
   Temperature_value=Temperature_value|a;
   if(Temperature_value<0x0fff)
   Temperature_flag=0;
   else
 {
    Temperature_value=~Temperature_value+2; 
    Temperature_flag=1;//负温度  
   }
   Temperature_value=Temperature_value*(0.625);//温度值扩大10倍,并精确到1位数。
   return(Temperature_value);
  }
/*DS18B20所测温度值显示函数*/  
  void DS18B20_Display()                              
{
   uchar i;
   bai=Temperature_value/1000;//百位数
   shi=Temperature_value%1000/100;//十位数 
   ge=Temperature_value%100/10;//个位数
   xiaoshu=Temperature_value%10;//小数位
   if(Temperature_flag==0)
 {
    if(bai==0x00)
  {
     bai=0x00;//百位数的0显示    
     if(shi==0x00)  
     shi=0x00;//十位数的0显示    
    }
  }
   else //负温度 
 {   
    bai=0x0b;//负温度百位显示负号:-
    if(shi==0x00)  
    shi=0x00;//十位数的0显示    
  }
   for(i=0;i<10;i++)
 {
    P2=Wei[0];
    P0=table0[bai];//百位
    DS18B20_Delay(20);
    P2=Wei[1]; 
    P0=table0[shi];//十位 
    DS18B20_Delay(20);
    P2=Wei[2];
    P0=table1[ge];//个位
    DS18B20_Delay(20);
    P2=Wei[3]; 
    P0=table0[xiaoshu];//小数位 
    DS18B20_Delay(20);
   }
 }
/*主函数*/  
  void main()                              
{
   DS18B20_Init();//DS18B20初始化显示
   while(1)
 {
    DS18B20_ReadTemperature();//单片机读取DS18B20当前温度
    DS18B20_Display();//共阴数码管显示DS18B20所测温度
   }
 } 

1680900-20200514200140177-271479461.png
1680900-20200812104818897-196454722.png
1680900-20200812163609577-1667728984.png
来源:https://www.cnblogs.com/AChenWeiqiangA/p/12891054.html

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

51单片机四位一体数码管显示DS18B20测温的项目工程