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

📄 ds18b20.c~

📁 基于GPRS的远程温度采集控制系统, 嵌入式系统, C源代码, 供做嵌入式开发及远程控制的朋友参考.
💻 C~
字号:
#include<stdio.h>#include<unistd.h>#include"44B.H"static void delay_1us(void)//1us延时函数{    asm("nop");	}static void delay_nus(unsigned int n)//N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}static void delay_1ms(void)//1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}static void delay_nms(unsigned int n)//N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}static void tempconvert(unsigned char temH,unsigned char temL){     unsigned char L,H;             H=(temL >> 4)+(temH<<4);    //温度整数部分     L=(temL & 0x0F)? 5:0;    //温度小数部分.     printf("%d.%d\n",H,L);    }static unsigned char InitDs18b20(void) //复位函数定义{   unsigned char  RX=1; //函数返回值设置  //rPCONF=0x01; //PF0输出口   rPCONF=0x1255;   rPDATF=0x01;   delay_nus(5);   rPDATF=0x0; //PF0输出0,拉低   delay_nus(500);   delay_1us();   rPDATF=0x01; //低脉冲时间500us已过,PF0置高  // delay_nus(100);   rPCONF=0x0000; //改为输入口,进行读值   //printf("delay 100");   delay_nus(100);   if((rPDATF & 0x01)==0) //读到PF0口为低时说明存在脉冲收到       {         //printf("%x\n",rPDATF);         RX=0;//success!       }    else         RX=1;//fail!     delay_nus(480);    // rPCONF=0x01;//output   rPCONF=0x1255;     rPDATF=0x01;   return  RX; //函数返回RX值,在收到存在脉冲时RX为零}static unsigned char DS18B20_ReadOneBit_1(){     unsigned char bReturnValue=0;     //rPCONF=0x01;    rPCONF=0x1255;    rPDATF=0x01;    //delay_1us();    rPDATF=0x0;    delay_1us();    rPDATF=0x01;//a sign read       rPCONF=0x0000;    delay_nus(15);    if(rPDATF&0x01)     {          bReturnValue=1;     }    delay_nus(50);    return bReturnValue;}static unsigned char DS18B20_ReadOneBit_0(){    unsigned char bReturnValue=1;    rPCONF=0x1255;    rPDATF=0x01;    rPDATF=0x0;    delay_1us();    rPCONF=0x0000;    delay_nus(15);    if((rPDATF&0x01)==0)         bReturnValue=0;     rPCONF=0x1255;     rPDATF=0x01;     delay_nus(50);     return bReturnValue;}static unsigned char ReadOneByte(void){   unsigned char uci;   unsigned char ucReadData;   unsigned char ucMaskCode;    ucReadData = 0;    ucMaskCode = 0x01;   for(uci=0; uci<8; uci++)       {         if(DS18B20_ReadOneBit_1()==1)          {            ucReadData |= ucMaskCode;          }         ucMaskCode <<= 1 ;      }   return ucReadData;}static void DS18B20_WriteOneBit_0(){     rPCONF=0x1255;     //rPCONF=0x01;      rPDATF=0x01;    // delay_1us();     rPDATF=0x0;     delay_nus(15);          delay_nus(15);     delay_nus(30);     rPDATF=0x01;}static void DS18B20_WriteOneBit_1(){     //rPCONF=0x01;     rPCONF=0x1255;     rPDATF=0x01;    // delay_1us();     rPDATF=0x0;     delay_nus(15);     rPDATF=0x01;     delay_nus(15);     delay_nus(30);}				    static void WriteOneByte(unsigned char ucWriteData){    unsigned char uci;    unsigned char ucTemp;    ucTemp = ucWriteData;   for(uci=0; uci<8; uci++)    {        if(ucTemp & 0x01)           {                DS18B20_WriteOneBit_1();           }        else          {             DS18B20_WriteOneBit_0();           }       ucTemp >>= 1 ;    }}static void ConfigDs18b20 (void){        if( InitDs18b20()==1)             {       printf("fail") ; //初始化       exit(1);            }         WriteOneByte(0xcc);  //skip rom     WriteOneByte(0x4e);  //write scratchpad     WriteOneByte(0x19);  //温度上下限     WriteOneByte(0x1a);      WriteOneByte(0x7f);     //set 11 bit (0.0625)     InitDs18b20();      WriteOneByte(0xcc);  //skip rom     WriteOneByte(0x48);  //保存设定值     InitDs18b20();      WriteOneByte(0xcc);  //skip rom     WriteOneByte(0xb8);  //回调设定值     InitDs18b20();}float ReadTemperature(void) {     unsigned char tempL=0;  //临时变量低位     unsigned char tempH=0; //临时变量高位     //unsigned char TH=0;//上限     //unsigned char TL=0;//下限     unsigned char con=0;     float temperature; //温度值     unsigned char ucTempDataBuff[9]; //用于映像DS18B20内容字节内容的缓冲区      ConfigDs18b20();			    if( InitDs18b20()==1)       {       printf("error") ; //初始化       exit(1);      }            printf("OK!\n") ;        WriteOneByte(0xcc); //跳过读序列号的操作        WriteOneByte(0x44); //启动温度转换                     //转换需要一点时间,延时        delay_nms(750);        InitDs18b20(); //初始化        WriteOneByte(0xcc); //跳过读序列号的操作        WriteOneByte(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)        ucTempDataBuff[0] = ReadOneByte();        ucTempDataBuff[1] = ReadOneByte();        ucTempDataBuff[2] = ReadOneByte();        ucTempDataBuff[3] = ReadOneByte();        ucTempDataBuff[4] = ReadOneByte();        ucTempDataBuff[5] = ReadOneByte();        ucTempDataBuff[6] = ReadOneByte();	     ucTempDataBuff[7] = ReadOneByte();	     ucTempDataBuff[8] = ReadOneByte();        for(con=0;con<9;con++)	       printf("%x\n",ucTempDataBuff[con]);       tempL=ucTempDataBuff[0];       tempH=ucTempDataBuff[1];       tempconvert(tempH,tempL);         temperature=((tempH*256)+tempL)*0.0625;       return  temperature;}

⌨️ 快捷键说明

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