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

📄 ds18b20.c

📁 此程序为ds18b20温度采集芯片的keil c 程序没有加入显示的部分,但已调试过.可用
💻 C
字号:
#include <reg51.h>
#include "intrins.h"
unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7, 
                                 0xef,0xdf,0xbf,0x7f}; 
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,   //显示码值
                                    0x66,0x6d,0x7d,0x07, 
                                    0x7f,0x6f,0x77,0x7c, 
                                    0x39,0x5e,0x79,0x71,0x00,0x40}; 
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22, 
                                25,28,31,34,38,41,44,48, 
                                50,53,56,59,63,66,69,72, 
                                75,78,81,84,88,91,94,97}; 
unsigned char displaycount; 
unsigned char displaybuf[8]={16,16,16,16,16,16,16,16}; 
unsigned char timecount; 
unsigned char readdata[8]; 
sbit DQ=P3^7; 
bit sflag; 
bit resetpulse(void)  //复位子程序
{ 
  unsigned char i; 
  DQ=0; 
  for(i=255;i>0;i--); 
  DQ=1; 
  for(i=60;i>0;i--); 
  return(DQ); 
  for(i=200;i>0;i--); 
} 
void writecommandtods18b20(unsigned char command) //写ds18b20的命令控制字
{ 
  unsigned char i; 
  unsigned char j; 
  for(i=0;i<8;i++) 
    { 
      if((command & 0x01)==0) 
        { 
          DQ=0;                   //写0
          for(j=35;j>0;j--); 
          DQ=1; 
        } 
        else 
          { 
            DQ=0;              
            for(j=2;j>0;j--); //写1
            DQ=1; 
            for(j=33;j>0;j--); 
          } 
      command=_cror_(command,1);  //command的值循环右移一位    
    } 
}


unsigned char readdatafromds18b20(void) 
{ 
  unsigned char i; 
  unsigned char j; 
  unsigned char temp; 
  temp=0; 
  for(i=0;i<8;i++) 
    { 
      temp=_cror_(temp,1); //将读入的一位值右移一位;因为ds18b20传数值时是低位在前
      DQ=0; 
      _nop_(); 
      _nop_(); 
      DQ=1; 
      for(j=10;j>0;j--); 
      if(DQ==1) 
        {
          temp=temp | 0x80; //读入1
        } 
        else 
          { 
            temp=temp | 0x00; //读入0
          } 
      for(j=200;j>0;j--); 
    } 
  return(temp); 
} 


void main(void) 
{ 
  TMOD=0x01; 
  TH0=(65536-4000)/256; //定时4ms
  TL0=(65536-4000)%6; 
  ET0=1; 
  EA=1; 
  while(resetpulse()); 
  writecommandtods18b20(0xcc); //跳跃ROM命令,同时访问总路线上所有的从机设备
  writecommandtods18b20(0x44); //启动温度转换命令
  TR0=1; 
  while(1) 
    { 
      
    } 
} 


void t0(void) interrupt 1 using 0 
{ 
  unsigned char x; 
  unsigned int result; 
  TH0=(65536-4000)/256; 
  TL0=(65536-4000)%6; 
  if(displaycount==2) 
    { 
      P0=displaycode[displaybuf[displaycount]] | 0x80; 
    } 
    else 
      { 
        P0=displaycode[displaybuf[displaycount]]; 
      } 
  P2=displaybit[displaycount]; 
  displaycount++; 
  if(displaycount==8) 
    { 
      displaycount=0; 
    } 
  
  timecount++; 
  if(timecount==150) 
    { 
      timecount=0; 
      while(resetpulse()); 
      writecommandtods18b20(0xcc); 
      writecommandtods18b20(0xbe); //写CCH后写BEH应用于单节点系统
      readdata[0]=readdatafromds18b20(); 
      readdata[1]=readdatafromds18b20(); 
      for(x=0;x<8;x++)
        { 
          displaybuf[x]=16; 
        } 
      sflag=0; 
      if((readdata[1] & 0xf8)!=0x00) 
        { 
          sflag=1; 
          readdata[1]=~readdata[1]; 
          readdata[0]=~readdata[0]; 
          result=readdata[0]+1; 
          readdata[0]=result; 
          if(result>255) 
            { 
              readdata[1]++; 
            } 
        } 
      readdata[1]=readdata[1]<<4; 
      readdata[1]=readdata[1] & 0x70; 
      x=readdata[0]; 
      x=x>>4; 
      x=x & 0x0f; 
      readdata[1]=readdata[1] | x; 
      x=2; 
      result=readdata[1]; 
      while(result/10) 
        { 
          displaybuf[x]=result; 
          result=result/10; 
          x++; 
        } 
      displaybuf[x]=result; 
      if(sflag==1) 
        { 
          displaybuf[x+1]=17; 
        } 
      x=readdata[0] & 0x0f; 
      x=x<<1; 
      displaybuf[0]=(dotcode[x]); 
      displaybuf[1]=(dotcode[x])/10; 
      while(resetpulse()); 
      writecommandtods18b20(0xcc); 
      writecommandtods18b20(0x44); 
    } 
}

⌨️ 快捷键说明

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