完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于DS18B20的原理和时序就不作太多叙述了!网上有的是,自己找吧! 1.复位操作:引脚拉低——延时480-960us——引脚高——延时15-60us void DS18B20_RST(void) // 1.复位操作: 引脚拉低——延时480-960us——引脚高——延时15-60us { DS18B20_IO_OUT(); //切换为输出模式 OutputDS = 0;//拉低 delay_us(750); OutputDS = 1;//拉高 delay_us(15); } 2.等待响应(相当于检验设备是否正常): 将引脚设置为输入模式——判断引脚低电平时间是否大于60us、小于240us——返回应答结果 int DS18B20_Check(void) //响应1--失败 响应0----成功 { //2.应答操作: 将引脚设置为输入模式——判断引脚低电平时间是否大于60us、小于240us——返回应答结果 uint8_t retry=0; DS18B20_IO_IN(); //切换到输入模式 while(InputDS && retry<200) //引脚一直为高,未被设备主动拉低。提供200us的超时时间 { retry++; delay_us(1); } if(retry>=200) return 1; //超时仍为响应(200us) else retry=0; while(!InputDS && retry<240)// 引脚响应则 判断引脚低电平时间是否大于60us、小于240us——返回应答结果 { retry++; delay_us(1); } if(retry>=240)return 1; //应答过时,检查失败 // printf("truern"); return 0; //检验成功,返回0 } 3.读0、读1操作 uint8_t DS18B20_Read_Bit(void) //3. 读0、读1操作 { //将引脚设置为输出模式——引脚拉低——延时2us——引脚拉高——设置为输入模式——延时2us——读取引脚状态——返回读取结果 周期60us uint8_t data;//暂存数据 DS18B20_IO_OUT(); //切换输出模式 OutputDS = 0; //拉低 delay_us(2); OutputDS = 1; //释放 DS18B20_IO_IN(); //切换输入模式 delay_us(10); if(InputDS)data =1 ; else data = 0; delay_us(50); //printf("数据:%drn",data); return data; } 4.写0,写1操作 void DS18B20_Write_One(void) //写1操作 设置引脚为输出模式——引脚拉低——延时2us——引脚拉高——延时大于60us { DS18B20_IO_OUT(); //SET PG11 OUTPUT; OutputDS = 0;//拉低2us delay_us(2); OutputDS = 1; delay_us(60); } void DS18B20_Write_Zero(void) //写0操作 设置引脚为输出模式——引脚拉低——延时60-120us——引脚拉高——延时2us { DS18B20_IO_OUT(); //SET PG11 OUTPUT; OutputDS = 0;//拉低2us delay_us(60); OutputDS = 1; delay_us(2); } 5、功能函数:将上面的函数复用
uint8_t DS18B20_Read_Byte(void) //读取一个字节8bit { uint8_t data=0; for(uint8_t i=0;i<8;i++) { data>>=1; if(DS18B20_Read_Bit()) { data |=0x80; } } return data; } 写一个字节 void DS18B20_Write_Byte(uint8_t data) //写一个字节 { DS18B20_IO_OUT(); //SET PG11 OUTPUT; for (int i=1;i<=8;i++) { if(data&0x01) //先写低位,1就写1 DS18B20_Write_One(); else DS18B20_Write_Zero(); data >>= 1;//右移位 } } 启动设备 // 读取传感器的值 float DS18B20_Get_Temp(void) { float data; uint8_t TH,TL; uint16_t TB; DS18B20_Start(); DS18B20_RST(); DS18B20_Check(); DS18B20_Write_Byte(0xCC); // 忽略ROM地址,直接发送命令 DS18B20_Write_Byte(0xBE); // 读取暂存器中9字节数据 TL = DS18B20_Read_Byte(); // 低8位 TH = DS18B20_Read_Byte(); // 低八位 TB = TH; TB <<=8; TB = TB|TL; // printf("TB:%drn",TB); data = TB* 0.0625; //data = ((uint16_t)DS18B20_Read_Byte() | DS18B20_Read_Byte() << 8) * 0.0625f; return data; }
// 读取传感器的值 float DS18B20_Get_Temp(void) { float data; uint8_t TH,TL; uint16_t TB; DS18B20_Start(); DS18B20_RST(); DS18B20_Check(); DS18B20_Write_Byte(0xCC); // 忽略ROM地址,直接发送命令 DS18B20_Write_Byte(0xBE); // 读取暂存器中9字节数据 TL = DS18B20_Read_Byte(); // 低8位 TH = DS18B20_Read_Byte(); // 低八位 TB = TH; TB <<=8; TB = TB|TL; // printf("TB:%drn",TB); data = TB* 0.0625; //data = ((uint16_t)DS18B20_Read_Byte() | DS18B20_Read_Byte() << 8) * 0.0625f; return data; } 6、实际应用 /*========= 应用代码 ========================*/ __align(8) OS_STK DS18B20_TASK_STK[DS18B20_STK_SIZE]; //任务堆栈 static void DS18B20_Task_Entry(void *param) //如何函数,就是任务本身 { float data; while(1) { data = DS18B20_Get_Temp(); printf("温度:%frn",data); delay_ms(500); } } int DS18B20_Task_Init(void ) { //设置引脚为输入 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PG11端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化IO口 GPIO_SetBits(GPIOG,GPIO_Pin_11); //PG11 输出高 INT8U err; err = OSTaskCreate(DS18B20_Task_Entry, (void*)0, (OS_STK*)&DS18B20_TASK_STK[DS18B20_STK_SIZE-1],DS18B20_TASK_PRIO);//创建液位采集任务 if(err == OS_ERR_NONE ) return 0; else return 1; } 7. .H文件内容 //DS18B20 任务 用于指示系统是否正常工作 #define DS18B20_TASK_PRIO 9 //设置任务优先级 #define DS18B20_STK_SIZE 128 //设置任务栈大小 int DS18B20_Task_Init(void ); #define InputDS PGin(11) //定义引脚输入P11 #define OutputDS PGout(11) //定义引脚输出P11 #define DS18B20_IO_IN() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}//10:上拉输入 00:输入模式 #define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;} //00:推挽输出模式 11:输出模式,最大速度50MHz |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:16 , Processed in 0.658291 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号