📄 ds18b20.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 + -