×
嵌入式 > 技术百科 > 详情

【蓝桥杯单片机组】DS18B20

发布时间:2024-05-02 发布时间:
|

DS18B20与单片机采用单总线连接方式,比赛中使用到的文件为提供的“onewire.c”


编程步骤:


(1)初始化


(2)发送ROM操作命令,包括:Read ROM(读ROM) [33H]、Match ROM(匹配ROM) [55H]、Skip ROM(跳过ROM] [CCH]、Search ROM(搜索ROM) [F0H]、Alarm search(告警搜索) [ECH]


(3)发送储存器操作命令,包括:Write Scratchpad(写暂存存储器) [4EH]、Read Scratchpad(读暂存存储器) [BEH]、Copy Scratchpad(复制暂存存储器) [48H]、Convert Temperature(温度变换) [44H]、Recall EPROM(重新调出) [B8H]、Read Power supply(读电源) [B4H]


(4)存储器或适当延时




P.S:使用IAP15时应对onewire.c中的void Delay_OneWire(unsigned int t)做一下改变:


//单总线延时函数

void Delay_OneWire(unsigned int t)

{

unsigned char i;

while(t--){

for(i=0;i<12;i++);

}

}


将之前的延时时间乘以12,因为使用的IAP15的机器周期为振荡周期,若不修改则无法读数。



附:测量温度的代码


uchar low,high;

int gettemper()

{

int t;

Init_DS18B20(); //1、初始化时序

Write_DS18B20(OW_SKIP_ROM); //2、ROM操作命令

Write_DS18B20(DS18B20_CONVERT); //3、存储器操作命令

Delay_OneWire(200);

//end

Init_DS18B20(); //1、初始化时序

Write_DS18B20(OW_SKIP_ROM); //2、ROM操作命令

Write_DS18B20(DS18B20_READ); //3、存储器操作命令

EA = 0;

low = Read_DS18B20();

high = Read_DS18B20();

EA = 1;

t = high<<8;

t = t|low;

return t;

// return 0xf13c; //test

}

该函数返回的是在DS18B20温度暂存器中的精确数据吗,若要选择返回整数值或浮点值,则需要数据处理。


延时的2数值(200)不可以改变。




附:数据处理函数


float get_f_temp()

{

int t;

float temp;

t = gettemper();

if((t&0xf000)>>12 == 0x000f) //负数

temp = ((~t)+1)*0.0625*(-1.0);

else

temp = t*0.0625;

return temp;

}

注意:当读出的温度是负数时,gettemper()返回的最高位为1,此时需要将返回的数值取反再加一,最后乘以12位的精确度0.0625.


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端