首页 > 其他 > 详细

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

时间:2020-05-14 21:30:51      阅读:82      评论:0      收藏:0      [点我收藏+]
#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[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef};  //个位带数点字码表
uchar code Wei[]={0xf7,0xfb,0xfd,0xfe};//数码管位数码表  
uchar Display_data[5];//显示数据数组 
uint  Temperature_value;//温度值               
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;
   Display_data[0]=Temperature_value/1000;//百位数
   Display_data[1]=Temperature_value%1000/100;//十位数 
   Display_data[2]=Temperature_value%100/10;//个位数
   Display_data[3]=Temperature_value%10;//小数位
   if(Temperature_flag==0)
 {
    if(Display_data[0]==0x00)
  {
     Display_data[0]=0x0a;//百位数的0显示    
     if(Display_data[1]==0x00)  
     Display_data[1]=0x0a;//十位数的0显示    
    }
  }
   else //负温度 
 {   
    Display_data[0]=0x0b;//负温度百位显示负号:-
    if(Display_data[1]==0x00)  
    Display_data[1]=0x0a;//十位数的0显示    
  }
   for(i=0;i<150;i++)
 {
    P2=Wei[0];
    P0=table0[Display_data[3]];//小数位
    DS18B20_Delay(20);
    P2=Wei[1];
    P0=table1[Display_data[2]];//个位
    DS18B20_Delay(20);
    P2=Wei[2];
    P0=table0[Display_data[1]];//十位
    DS18B20_Delay(20);
    P2=Wei[3];
    P0=table0[Display_data[0]];//百位
    DS18B20_Delay(20);
   }
 }
/*主函数*/  
  void main()                              
{
   DS18B20_Init();//DS18B20初始化显示
   while(1)
 {
    DS18B20_ReadTemperature();//单片机读取DS18B20当前温度
    DS18B20_Display();//共阴数码管显示DS18B20所测温度
   }
 } 

技术分享图片

技术分享图片

技术分享图片

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

原文:https://www.cnblogs.com/AChenWeiqiangA/p/12891054.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!