历史上的今天
返回首页

历史上的今天

今天是:2025年03月07日(星期五)

正在发生

2019年03月07日 | 基于STM32的DS18B20驱动

2019-03-07 来源:eefocus

#include "ds18b20.h"

#include "delay.h" 



short tmp_arg; //温度平滑滤波

//复位DS18B20

void DS18B20_Rst(void)   

{                 

DS18B20_IO_OUT(); //SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; //拉低DQ

    delay_us(750);     //拉低750us

    DS18B20_DQ_OUT=1; //DQ=1 

delay_us(15);     //15US

}

//等待DS18B20的回应

//返回1:未检测到DS18B20的存在

//返回0:存在

u8 DS18B20_Check(void)   

{   

u8 retry=0;

DS18B20_IO_IN(); //SET PG11 INPUT  

    while (DS18B20_DQ_IN&&retry<200)

{

retry++;

delay_us(1);

};  

if(retry>=200)return 1;

else retry=0;

    while (!DS18B20_DQ_IN&&retry<240)

{

retry++;

delay_us(1);

};

if(retry>=240)return 1;    

return 0;

}

//从DS18B20读取一个位

//返回值:1/0

u8 DS18B20_Read_Bit(void)  

{

    u8 data;

DS18B20_IO_OUT(); //SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; 

delay_us(2);

    DS18B20_DQ_OUT=1; 

DS18B20_IO_IN(); //SET PG11 INPUT

delay_us(12);

if(DS18B20_DQ_IN)data=1;

    else data=0;  

    delay_us(50);           

    return data;

}

//从DS18B20读取一个字节

//返回值:读到的数据

u8 DS18B20_Read_Byte(void)     

{        

    u8 i,j,dat;

    dat=0;

for (i=1;i<=8;i++) 

{

        j=DS18B20_Read_Bit();

        dat=(j<

    }    

    return dat;

}

//写一个字节到DS18B20

//dat:要写入的字节

void DS18B20_Write_Byte(u8 dat)     

 {             

    u8 j;

    u8 testb;

DS18B20_IO_OUT(); //SET PG11 OUTPUT;

    for (j=1;j<=8;j++) 

{

        testb=dat&0x01;

        dat=dat>>1;

        if (testb) 

        {

            DS18B20_DQ_OUT=0; // Write 1

            delay_us(2);                            

            DS18B20_DQ_OUT=1;

            delay_us(60);             

        }

        else 

        {

            DS18B20_DQ_OUT=0; // Write 0

            delay_us(60);             

            DS18B20_DQ_OUT=1;

            delay_us(2);                          

        }

    }

}

//开始温度转换

void DS18B20_Start(void) 

{                 

    DS18B20_Rst();   

DS18B20_Check();  

    DS18B20_Write_Byte(0xcc); // skip rom

    DS18B20_Write_Byte(0x44); // convert



//初始化DS18B20的IO口 DQ 同时检测DS的存在

//返回1:不存在

//返回0:存在      

u8 DS18B20_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure;

  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PORTG口时钟 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PORTG.11 推挽输出

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOG, &GPIO_InitStructure);



  GPIO_SetBits(GPIOG,GPIO_Pin_11);    //输出1



DS18B20_Rst();



return DS18B20_Check();

}  

//从ds18b20得到温度值

//精度:0.1C

//返回值:温度值 (-550~1250) 

short DS18B20_Get_Temp(void)

{

    u8 temp;

    u8 TL,TH;

short 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; //返回温度值

else return -tem;    

}



short Get_tempAverage(void)

{

u32 temp_sum;

short temp;


temp = DS18B20_Get_Temp();

if(DS18B20_Init() == 0) //温度采集的起始条件

{

tmp_arg = temp;

temp_sum = tmp_arg;

temp_sum = temp_sum<<3; //放大8倍

}

temp_sum += temp; //加最近的温度值7

temp_sum -= tmp_arg; //减最开始的温度值0

tmp_arg = temp_sum >> 3;

return tmp_arg;

}



 






#ifndef __DS18B20_H


#define __DS18B20_H 

#include "sys.h"   



//IO方向设置

#define DS18B20_IO_IN()  {GPIOB->CRL&=0xFFFFF0FF;GPIOB->CRL|=8 << 1;}

#define DS18B20_IO_OUT() {GPIOB->CRL&=0xFFFFF0FF;GPIOB->CRL|=7 << 1;}

////IO操作函数   

#define DS18B20_DQ_OUT PBout(1) //数据端口 PB1

#define DS18B20_DQ_IN  PBin(1)  //数据端口 PB1 



extern short tmp_arg; //温度平滑滤波



u8 DS18B20_Init(void);//初始化DS18B20

short DS18B20_Get_Temp(void);//获取温度

void DS18B20_Start(void);//开始温度转换

void DS18B20_Write_Byte(u8 dat);//写入一个字节

u8 DS18B20_Read_Byte(void);//读出一个字节

u8 DS18B20_Read_Bit(void);//读出一个位

u8 DS18B20_Check(void);//检测是否存在DS18B20

void DS18B20_Rst(void);//复位DS18B20  

short Get_tempAverage(void); //温度平滑滤波

#endif

推荐阅读

史海拾趣

EREM公司的发展小趣事

EREM公司起源于1960年代的瑞士日内瓦,由一群热衷于精密工具制造的工程师创立。在当时,电子行业正逐渐兴起,对高精度工具的需求日益增长。EREM的创始人看到了这一市场机遇,决定专注于生产高精度镊子和钳子,以满足电子行业的需求。他们凭借精湛的工艺和不懈的努力,逐渐在行业内建立了良好的声誉。

Cystech公司的发展小趣事

为了进一步拓展全球市场,C-TECH Co., Ltd在2009年相继成立了香港分公司和中国(深圳)分公司。通过这两家分公司,公司能够更好地了解当地市场需求,提供更加贴近客户的服务。同时,公司还积极参加国际电子展会,与国际同行交流合作,不断提升自身的品牌影响力和市场竞争力。在国际化战略的推动下,C-TECH Co., Ltd的海外市场不断拓展,为公司的发展注入了新的动力。

智烽维(CDA)公司的发展小趣事

经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。

Gamma Microelectronics ( APM )公司的发展小趣事

G24i的成立可以追溯到2006年,它自称是世界上首家生产商业化应用等级DSSC的公司。公司的技术根基源自瑞士洛桑联邦理工学院的M. Gratzel团队,该团队是DSSC技术的先驱。G24i由美国Kanorka Technologies公司投资,而Kanorka则得到了美国军方的资助。这一强大的技术背景为G24i的商业化之路奠定了坚实的基础。公司成立后不久,便致力于将实验室级别的DSSC技术推向市场,开启了其商业化探索的征程。

Consolidated Wire公司的发展小趣事

随着业务的不断发展,Consolidated Wire公司开始积极拓展国内外市场。公司加大了市场推广力度,通过参加行业展会、举办技术研讨会等方式提升品牌知名度。同时,公司还积极开拓海外市场,与国际知名企业建立合作关系,实现了业务的全球化布局。这些举措不仅提升了公司的市场份额,也增强了公司在电子行业的影响力。

Elcos AG公司的发展小趣事

随着国内市场的饱和,Elcos AG开始寻求国际化拓展的机会。公司首先在欧洲市场建立了销售网络,通过与当地合作伙伴的紧密合作,逐渐打开了欧洲市场的大门。随后,Elcos AG又将目光投向了亚洲和北美市场,通过设立海外办事处和参加国际展会等方式,积极推广公司品牌和产品。在国际市场的竞争中,Elcos AG凭借其卓越的产品品质和完善的售后服务体系,赢得了众多客户的信赖和支持。

问答坊 | AI 解惑

2416相比2440的十大优势

三星2009上半年推出的2416芯片相比2440具有压倒性的优势,是完美替代2440的首要选择 1.        性能以及对视频播放能力的支持:2416 主频400MHz和2440持平,但是2416是ARM926JES内核,是ARM920T的增强版本,治理运行速度方面 ...…

查看全部问答>

关于嵌入式的学习和开发

本人只有C语言基础,现在要利用实验室现有博创公司UP-NETARM2410-S嵌入式开发平台(包括GPRS/GPS模块、电机控制模块、摄像头模块等),设计一套能够实现对现场数据的远程无线传输和实时监控功能的远程监控雏形系统。还望大家不吝赐教!!!…

查看全部问答>

我是电气工程与自动化的本科生 我想考嵌入式的研究生 不知道可行吗

我如果从事嵌入式优势是什么   劣势是什么(我的意思是我本科是电气工程与自动化 我该重点自学一些什么方面的知识  ) 还有  那个学校的嵌入式比较好       先谢过了…

查看全部问答>

Sqlite中文目录打不开,有什么解决办法吗?

int rc = _sqlite3_open(_T(\"存储卡\\\\123.db\"), &m_db);    if ( rc != SQLITE_OK )    {       ASSERT(FALSE);    } 打开不成功,如果是英文目录就没有问题!…

查看全部问答>

关于6410裸奔变量创建的地址问题 !

    我的6410裸奔已经起来了  牛人给的的一个简单的BOOT  代码已经可以在DDR里面运行  但是我没有设置变量创建的地址在哪   那6410是自动在内部8K的SRAM创建变量呢  等到满了8K  ...…

查看全部问答>

嵌入式技术交流群 24992320 欢迎加入啊

嵌入式技术交流群 24992320 欢迎加入啊 …

查看全部问答>

求助!!!!!12864液晶显示有问题,大侠们来帮我看一下~~~

我用的是OCM12864-3,程序是显示“欢迎使用”四个字在液晶正中。 程序烧入单片机以后都没问题,当我把电源拔下再插,多试几次,也没有问题。但是!过了3~5分钟,我再上电,“欢迎”这两个字就往上移动了一行,真不知道为什么,郁闷啊!    ...…

查看全部问答>

LaunchPad打横短接J3txd、rxd为何电脑没有找到端口?

如题;需要另外接一个串口转usb(如PL2303之类的)么? 听说这个板子很强大,可以直接连USB线,但是一直没有端口(COM口),是不是程序上面需要设置什么呢? 接法如https://bbs.eeworld.com.cn/thread-371773-1-1.html 二楼的图接法是一样的。 ...…

查看全部问答>

闲置ARM系列开发板 有好几个 需要的联系啊 低价出售了

本帖最后由 开发板之家 于 2015-1-18 23:08 编辑 还有几个其他型号的 有需要的可以留下QQ 我发图片协商 …

查看全部问答>