收藏1 举报
#include "ds18b20.h" //复位DS18B20 void DS18B20_Rst(void) { CLR_DS18B20(); //拉低DQ DelayUs(750); //拉低750us SET_DS18B20();; //DQ=1 DelayUs(15); //15US } //等待DS18B20的回应 //返回1:未检测到ds18b20的存在 //返回0:存在 uint8_t DS18B20_Check(void) { uint8_t retry=0; while (DS18B20_DQ_IN&&retry<200) { retry++; DelayUs(1); }; if(retry>=200)return 1; else retry=0; while (!DS18B20_DQ_IN&&retry<240) { retry++; DelayUs(1); }; if(retry>=240)return 1; return 0; } //从DS18B20读取一个位 //返回值:1/0 uint8_t DS18B20_Read_Bit(void) // read one bit { uint8_t data; CLR_DS18B20(); //拉低DQ DelayUs(2); SET_DS18B20();; //DQ=1 DelayUs(12); if(DS18B20_DQ_IN)data=1; else data=0; DelayUs(50); return data; } //从ds18b20读取一个字节 //返回值:读取到的数据 uint8_t DS18B20_Read_Byte(void) // read one byte { uint8_t i,j,dat; dat=0; for (i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat; } //写一个字节到DS18B20 //dat:要写入的字节 void DS18B20_Write_Byte(uint8_t dat) { uint8_t j; uint8_t testb; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 1 DelayUs(2); SET_DS18B20(); //DS18B20_DQ_OUT=1; DelayUs(60); } else { CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 0 DelayUs(60); SET_DS18B20(); //DS18B20_DQ_OUT=1; DelayUs(2); } } } //开始温度转换 void DS18B20_Start(void)// ds1820 start convert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0x44);// convert } //初始化DS18B20的IO口DQ同时检查DS的存在 //返回1:不存在 //返回0:存在 uint8_t DS18B20_Init(void) { //配置PC16口 GPIO_QuickInit(HW_GPIOC, 16, kGPIO_Mode_OPP); SET_DS18B20(); //使PA2输出高电平 DS18B20_Rst(); return DS18B20_Check(); } //从ds18b20得到温度值 //精度:0.1C //返回值:温度值 (-550~1250) float DS18B20_Get_Temp(void) { uint8_t temp; uint8_t TL,TH; int16_t tem; DS18B20_Start (); // ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0xbe);// convert TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); // MSB if(TH>7) { TH=~TH; TL=~TL; temp=0;//温度为负 }else temp=1;//温度为正 tem=TH; //获得高八位 tem<<=8; tem+=TL;//获得低八位 tem=(float)tem*0.625;//转换 if(temp)return tem/10.00; //返回温度值 else return -tem/10.00; }
#include "gpio.h" #include "common.h" #include "uart.h" #include "ds18b20.h" /* CH Kinetis固件库 V2.50 版本 */ /* 修改主频 请使用 CMSIS标准文件 system_MKxxxx.c 中的 CLOCK_SETUP 宏 */ /* UART 快速初始化结构所支持的引脚* 使用时还是推荐标准初始化 */ /* UART1_RX_PE01_TX_PE00 UART0_RX_PF17_TX_PF18 UART3_RX_PE05_TX_PE04 UART5_RX_PF19_TX_PF20 UART5_RX_PE09_TX_PE08 UART2_RX_PE17_TX_PE16 UART4_RX_PE25_TX_PE24 UART0_RX_PA01_TX_PA02 UART0_RX_PA15_TX_PA14 UART3_RX_PB10_TX_PB11 UART0_RX_PB16_TX_PB17 UART1_RX_PC03_TX_PC04 UART4_RX_PC14_TX_PC15 UART3_RX_PC16_TX_PC17 UART2_RX_PD02_TX_PD03 UART0_RX_PD06_TX_PD07 UART2_RX_PF13_TX_PF14 UART5_RX_PD08_TX_PD09 */ int main(void) { float temp; DelayInit(); /* 初始化一个引脚 设置为推挽输出 */ GPIO_QuickInit(HW_GPIOE, 26, kGPIO_Mode_OPP); /* 初始化一个串口 使用UART0端口的PTD6引脚和PTD7引脚作为接收和发送,默认设置 baud 115200 */ UART_QuickInit(UART0_RX_PB16_TX_PB17, 115200); printf("DS18B20 DEMO:\r\n"); while(DS18B20_Init()){;} while(1) { temp=DS18B20_Get_Temp(); printf("Temperate:%4.2f \r\n",temp); GPIO_ToggleBit(HW_GPIOE, 26); DelayMs(1000); } }
#ifndef __DS18B20_H #define __DS18B20_H #include "gpio.h" #include "common.h" #define CLR_DS18B20() PCout(16)=0 #define SET_DS18B20() PCout(16)=1 #define DS18B20_DQ_IN PCin(16) uint8_t DS18B20_Init(void); //初始化DS18B20 float DS18B20_Get_Temp(void); //获取温度 void DS18B20_Start(void); //开始温度转换 void DS18B20_Write_Byte(uint8_t dat);//写入一个字节 uint8_t DS18B20_Read_Byte(void); //读出一个字节 uint8_t DS18B20_Read_Bit(void); //读出一个位 uint8_t DS18B20_Check(void); //检测是否存在DS18b20 void DS18B20_Rst(void); //复位DS18B20 #endif
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
发帖类勋章
30
149
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号