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

📄 18b20.c

📁 18B20温度计编程例子。希望高手来帮帮改进
💻 C
字号:


/********************************************/
#include"reg51.h"
#include "intrins.h"//预处理命令
#define uchar unsigned char //
#define uint unsigned int
#define  DATA_OUT  P0              //定义段码数据输出口
#define  BIT       P2              //定义位位码数据输出口
sbit DQ=P1^7; //定义DS18B20温度传感器的数据通信端口

unsigned char code seg[]={0xc0,0xf9,0xA4,0xB0,0x99,
                    0x92,0x82,0x0F8,0x80,0x90,0xFF};//定义数码管段码值(共阳)
unsigned char code bit_data[]={0X00,0X80,0X40,0XC0,
                               0X20,0XA0,0X60,0XE0};//定义数码管位码数据(经3-8译码器译码产生位码)
unsigned char data_seg[8];         //显示缓存           
/*
void delay2(void)//延时程序
 {
   unsigned char k,i;
   for(i=0;i<5;i++)
   for(k=0;k<50;k++);
 }

*/
/***********18b20程序**************/
//11us延时函数//
void  delay(uint t)
   {for(;t>0;t--);} 


//**********DS18B20复位函数************//
void ow_reset(void)
  {char presence=1;
   while(presence)
     {
       while(presence)
          { DQ=1;_nop_();_nop_();
            DQ=0;//产生低电平的复位脉冲
            delay(50);//延时550us
            DQ=1;   //经过延时后,将数据线拉至高电平,等待66us
            delay(10);//延时等待66us后发出存在脉冲
            presence=DQ;
			// delay(3); 	
          }
		 delay(50); 	 
        presence=~DQ;//发出存在脉冲,是低电平,单片机检测到低电平说明复位成功
     }
    // delay(20); //低电平持续220us	
     DQ=1;
  }
//********DS18B20写命令函数**********//
//向1-Write  总线上写一个字节//
 void  write_byte(uchar val)
   {  uchar i;
      for (i=8;i>0;i--)//一个字节8位
        { DQ=1;_nop_();_nop_();//
          DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//将数据线从高电平拉至低电平,产生写时序,延时5us,
          DQ=val&0x01;   //就是对数据线进行采样,如果相与后为0,DQ就为0,否则就为1 
          delay(6);//延时66us
          val=val>>1; //右移一位
         }
          DQ=1;
          delay(1);
     }
//********DS18B20读1字节函数**********//
 uchar read_byte(void)
   {  uchar i;
      uchar value=0;
      for(i=8;i>0;i--)
        { DQ=1;_nop_();_nop_();
           value>>=1;        //将读取的温度值移位
           DQ=0;            //高电平拉到低电平后至少维持1us
           _nop_();_nop_();_nop_();_nop_();//至少维持1us
           DQ=1;_nop_();_nop_();_nop_();_nop_();//拉到高电平产生读时序,读时序产生后DS18B20马上就输出温度数据
           if (DQ)value|=0x80;//这时DS18B20输出数据,如果输出数据线DQ为1就发送1,为0就发送0
           delay(6);//读一位的时序至少维持60us以上然后再释放总线拉到高电平
        }
         DQ=1;//读完一个字节后就将数据线拉到高电平
         return(value);//返回读取的温度数据
   }
//*********读出温度函数*********//
void read_temp(void)
     {  uchar j;
        uint low,high,tempdata;
       for(j=1;j<4;j++)
         { ow_reset();//总线复位
          //Matching_ROM(j);  //调用匹配函数
           write_byte(0xcc);//跳过ROM
           write_byte(0x44);//发转换命令
           delay(1);
           ow_reset();
           //Matching_ROM(j);  //调用匹配函数
           write_byte(0xcc);//跳过ROM
           write_byte(0xbe); //发读命令,就是从暂存器里把温度数据读出来的命令
           low=read_byte();//温度低8位
           high=read_byte();//温度高8位 
           high=high<<8;
           tempdata=low+high;
           tempdata=tempdata>>4;
          
          
 	   data_seg[0]=tempdata/100;
           data_seg[1]=tempdata%100/10;
           data_seg[2]=tempdata%100%10;
          /* temp_display[0]=1;
           temp_display[2]=2;
           temp_display[1]=2;
           temp_display[2]=3;
*/
          
         }
      }


/**************DS18B20ROM匹配函数*****************/
/*
void Matching_ROM(unsigned char mux)
 { 
  unsigned char i,*P;
  if(mux==1) P=ROM1;
  if(mux==2) P=ROM2;
  if(mux==3) P=ROM3;
  write_byte(0x55);
  for(i=0;i<8;i++)
   {write_byte(*(P+i));}
 }*/
void main(void)
 {
         unsigned char m;
   while(1)
    {
    for(m=0;m<3;m++)              //
     {
       DATA_OUT=seg[data_seg[m]]; //将显示缓存数据转换成数码管段码数据输出
       BIT     =bit_data[m];      //位码输出
       read_temp();
       DATA_OUT=0XFF;             //去消隐
 
      } 
    } 
 }

⌨️ 快捷键说明

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