DS18B20单总线温度传感器驱动程序

来源:互联网 发布:mac暴风影音调节字幕 编辑:程序博客网 时间:2024/05/01 23:20

淘宝店铺  : https://shop114292239.taobao.com

SCDN      : http://blog.csdn.net/beyondmike 

QQ        : 276678408

Email     : hxtiou@163.com

Mike      :欢迎咨询单片机方案开发和技术培训

/****************************************************************************** File      : DS18B20.c* Function  : DS18B20温度传感器驱动程序* Author    : Mike--->欢迎咨询单片机方案开发和技术培训* 淘宝店铺  : https://shop114292239.taobao.com* SCDN      : http://blog.csdn.net/beyondmike *  QQ       : 276678408* Email     : hxtiou@163.com * Copyright : 版权归 Mike 所有,请保留本人著作权,勿随意修改、随意发布,未经              允许不得用于其他商业用途* 注        :本程序在STC12C5A60S2单片机上测试通过*****************************************************************************/#include "include.h" #include "DS18B20.h"sbit DQ = P3^6;void delayus(int m)//1T--->STC12C5A60S2{for(;m>0;m--)    {        _nop_();        _nop_();    }}u8 ds18b20_init(void)//初始化ds18B20{u8 retry = 0;DQ = 1;    //DQ复位delayus(8);  //稍做延时DQ = 0;    //单片机将DQ拉低delayus(250); //精确延时 大于 480usDQ = 1;    //拉高总线delayus(15);while((!DQ) && (retry++ < 250)){delayus(2);}delayus(20);if(retry >= 250)return 1;//1初始化失败return 0;//0初始化成功 }//******************************************************************************u8 readonechar(void)//读一字节{u8 i=0;u8 dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80;delayus(15);}return dat;}//******************************************************************************void writeonechar(u8 dat)//写一字节{u8 i = 0;for (i = 8;i > 0;i--){DQ = 0;DQ = dat&0x01;delayus(5); //不能延时过久DQ = 1;dat >>= 1;}}//******************************************************************************u16 read_temperature(void)//读取温度{u8 TPL = 0;u8 TPH = 0;u16 temp = 0;u8 retry = 0;ds18b20_init();writeonechar(0xCC); // 跳过读序号列号的操作writeonechar(0x44); // 启动温度转换//while(!DQ);        //等待转换完成while((!DQ) && (retry++ < 250)){delayus(2);}ds18b20_init();writeonechar(0xCC); //跳过读序号列号的操作writeonechar(0xBE); //读取温度寄存器TPL = readonechar();//读低8位TPH = readonechar();//读高8位temp = ((u16)TPH << 8) | (u16)TPL;  //高8位和低8位转化为u16 //温度在寄存器中为12位,分辨率为0.0625,放大10倍输出并四舍五入 temp = (u16)((float)temp*0.0625*10+0.5);return temp;}u16 temp_disp(void)//显示温度---消抖计算,使温度更准确{u16 read_dat = 0;read_dat = read_temperature();#ifUART_EN printf("DS18B20读出dat = %d",read_dat);printf("℃\n");#endifreturn read_dat;}