⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 用单片机实现对温度的测量
💻 C
字号:
/*****************************************************************/ 
/*                                                               */                                                                
/*名称:                   测温+显示程序                         */                                                                                                                                                                           
/*功能:           读取当前18B20温度,由数码管显示出来。         */                                                    
/*难度等级:                   中                                */                                                                     
/* 作者:                  51kaifa                               */
/* 版权:           http://www.51kaifa.com                       */
/*编写日期:        2006.05.19                                   */                                                                                                                                                                                                             
/*****************************************************************/


#include<reg52.h>
#define  uchar  unsigned char

sbit DQ =P1^4;//18B20数据线引脚

sbit addr0 = P1^4;//系统片选地址线0
sbit addr1 = P1^5;//系统片选地址线1
sbit addr2 = P1^6;//系统片选地址线2
sbit addr3 = P1^7;//系统片选地址线3
//行扫描数组
uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
//数码管显示的段码表
uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
                       0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
                       0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格

uchar dispbuf[8]; //显示缓冲区   
uchar  temper[2];//存放温度的数组                      

/*****************************延时函数**************************/

void delay (unsigned int us)  
{
  while(us--);
}

void reset(void)   //复位
{
  uchar x=0;
  DQ = 1;
  delay(8);   //稍做延时
  DQ = 0;
  delay(80);   //精确延时 大于 480us
  DQ = 1;   //拉高总线
  delay(14);
  x=DQ;
  delay(20);
}
/**********************从DS18B20读一字节***************/
uchar readbyte(void) //读1字节
{
  uchar i=0;
  uchar dat=0;
  for (i=8;i>0;i--)
  {
    DQ = 0;
    dat>>=1;
    DQ = 1;
    if(DQ)
    dat|=0x80;
    delay(4);
   }
  return(dat);
 }
/***********************向DS18B20写一字节***********************/
void writebyte(unsigned char dat) //写1字节
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
   DQ = 0;
   DQ = dat&0x01;
   delay(5);
   DQ = 1;
   dat>>=1;
   }
 delay(4);
}
/***********************CPU读取温度值***************************/
void readtemp(void) //读取温度
{
  uchar a=0,b=0;
  reset();
  writebyte(0xCC); // 跳过序列号
  writebyte(0x44); // 启动温度转换
  reset();
  writebyte(0xCC);
  writebyte(0xBE); //读9个寄存器,前两个为温度
  a=readbyte();   //低位
  b=readbyte();   //高位
  temper[0]=a&0x0f;
  a=a>>4;         //低位右移4位,舍弃小数部分
  temper[1]=b<<4;         //高位左移4位,舍弃符号位
  temper[1]=temper[1]|a;
  }

/******************************显示+读键*************************/

void vLedKey_Scan()
{  unsigned char i,value;  

    for(i=0;i<8;i++){
       addr3 = 0;
       addr0 = 0;
       addr1 = 1;
       addr2 = 0;//开发板上U4(74HC574)的片选地址
       value =table[dispbuf[i]]; //取一行显示数据 
       if(i==3)
       value &= 0x7f;
       P0 = value;
       addr3 = 1; 
       addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
       P2 = scan[i];//取row0--row7行扫描数据
       delay(50); //延时50us
       P2 = 0xff;//关显示
       }
 }

/*******************************主函数***********************/

main()
{ uchar i;
  uchar temp;
  float backbit;   
  for(i=0;i<8;i++)
   dispbuf[i] = 17;
  while(1){
      vLedKey_Scan(); //显示,读键扫描 
      
       readtemp();//读18B20
       backbit = temper[0];//换成浮点数
       backbit = backbit * 6.25;//乘以0.0625*100
       temp = backbit;//取低2位整数部分
       dispbuf[5] = temp%10 ;
       
       temp = temp/10;
       dispbuf[4] = temp%10 ;
       
       temp = temper[1];//取整数部分
       dispbuf[3] = temp%10;
       
       temp = temp/10;
       dispbuf[2]= temp%10;
  }
}

/********************************结束************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -