我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 667|回复: 12

STM32 18B02

[复制链接]

该用户从未签到

34

主题

12

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2020-11-24 07:57:38 | 显示全部楼层 |阅读模式
/*
********************************************************************************
*文件名     : device_18b20.c
*作用       : 温度传感器功能函数
*原理       : PD8,PD9,PD10,PD11,PD12,PD13作为温度检测的6个管脚
********************************************************************************
*/
#include "drive.h"
#include "system.h"
#include "app.h"


//IO操作函数                                               
//#define   DS18B20_DQ_OUT PDout(0) //数据端口  PD8
#define DS18B20_DQ_OUT_PORT              GPIOD
#define DS18B20_DQ_OUT_CLK               RCC_APB2Periph_GPIOD  
#define DS18B20_DQ_OUT_PIN               GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15
#define Set_DS18B20_DQ_OUT  {GPIO_SetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);}
#define Clr_DS18B20_DQ_OUT  {GPIO_ResetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);}


//#define   DS18B20_DQ_IN  PDin(0)  //数据端口  PD8
#define DS18B20_DQ_IN_PORT              GPIOD
#define DS18B20_DQ_IN_CLK               RCC_APB2Periph_GPIOD  
#define DS18B20_DQ_IN_PIN               GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15
#define DS18B20_DQ_IN  (GPIO_ReadInputData(DS18B20_DQ_IN_PORT))

//IO方向设置
#define DS18B20_IO_IN()  {  GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOD ,&GPIO_InitStructure) ;}
                        
#define DS18B20_IO_OUT() {  GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15 ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;GPIO_Init(GPIOD ,&GPIO_InitStructure) ;}
                           
                           

//复位DS18B20
void DS18B20_Rst(void)     
{                 
    DS18B20_IO_OUT(); //SET PA0 OUTPUT
    Clr_DS18B20_DQ_OUT; //拉低DQ
    DelayUs(550);    //拉低750us
    //DisableIrq();
    Set_DS18B20_DQ_OUT; //DQ=1
    DelayUs(10);     //15US
    //EnableIrq();
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
//byte DS18B20_Check(void)
void DS18B20_Check(void)      
{   
//  DisableIrq();
    DS18B20_IO_IN();     
    //while ((DS18B20_DQ_IN&0x3f00)==0x3f00);
    while ((DS18B20_DQ_IN&0x3f00)==0x0000);
    DelayUs(240);
//  EnableIrq();   
   
   
   
   
//  byte retry=0;
//  DS18B20_IO_IN();  //SET PA0 INPUT   
//  while ((DS18B20_DQ_IN&0x3f00==0x3f00)&&retry<200)
//  {
//      retry++;
//      DelayUs(1);
//  }   
//  if(retry>=200)return 1;
//  else retry=0;
//  while ((DS18B20_DQ_IN&0x3f00==0x0000)&&retry<240)
//  {
//      retry++;
//      DelayUs(1);
//  }
//  if(retry>=240)return 1;     
//  return 0;
}
   

//从DS18B20读取一个位
//返回值:1/0
byte DS18B20_Read_Bit(void)              // read one bit
{
    byte data;
    ushort data16;
    DisableIrq();
    DS18B20_IO_OUT();
    Clr_DS18B20_DQ_OUT;
    DelayUs(1);
    Set_DS18B20_DQ_OUT;
    DS18B20_IO_IN();
    DelayUs(1);     //12
    data16=DS18B20_DQ_IN;
    data16>>=8;
    data=(byte)data16;   
    DelayUs(20);     //50      
    return data;
    EnableIrq();

}
   

   
   
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(byte dat)     
{            
    byte j;
    byte testb;
   
    DS18B20_IO_OUT();//SET PA0 OUTPUT;
    DisableIrq();
    for (j=1;j<=8;j++)
    {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            //DisableIrq();
            Clr_DS18B20_DQ_OUT;// Write 1
            DelayUs(1);                           
            Set_DS18B20_DQ_OUT;
            DelayUs(30);    //60
        //  EnableIrq();            
        }
        else
        {
            //DisableIrq();
            Clr_DS18B20_DQ_OUT;// Write 0
            DelayUs(30);   //60         
            Set_DS18B20_DQ_OUT;
            DelayUs(1);
            //EnableIrq();                           
        }
    }
    EnableIrq();
}
   

void Change_res(byte res)
{
    DS18B20_Rst();            //复位
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc); //跳过Rom
    DS18B20_Write_Byte(0x4e); //写暂存器
    DS18B20_Write_Byte(0x02); //写TH
    DS18B20_Write_Byte(0x01); //写TL
    DS18B20_Write_Byte(res);  //写结构寄存器
    DS18B20_Rst();            //复位
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc); //跳过Rom
    DS18B20_Write_Byte(0x48); //把暂存器内容写到EPRam中
        
}


   
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{                                          
    //DisableIrq();
    DS18B20_Rst();     
    DS18B20_Check();
    //EnableIrq();
    //DisableIrq();  
    DS18B20_Write_Byte(0xcc);// skip rom     跳跃查询指令
    DS18B20_Write_Byte(0x44);// convert      收到此指令后芯片将进行一次温度转换,将转换的温度值放入RAM的第1、2地址
    //EnableIrq();
}
   
     
//byte DS18B20_Init(void)
//{
//  GPIO_InitTypeDef GPIO_InitStructure;    //GPIO
//  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );  //使能PORTA口时钟  
//  /* Configure PA0 */
//  GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_OUT_PIN;  //SPI CS
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_Init(DS18B20_DQ_OUT_PORT, &GPIO_InitStructure);
//  /* Deselect the PA0 Select high */
//  GPIO_SetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);
//  DS18B20_Rst();
//  return DS18B20_Check();
//}  
   
//从ds18b20得到温度值
//返回值:温度值 (-55~125)
void DS18B20_Get_Temp(void)
{
    short i;
    byte j,k,Mask;
    byte temp;

    //DisableIrq();

    //System.Device.Usart1.Close;

    DS18B20_Start ();                    // ds1820 start convert
    //DisableIrq();
    DS18B20_Rst();
    DS18B20_Check();

   

   
         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert     将从RAM中读数据,读地址从地址0开始
   
    //EnableIrq();
    for(k=0;k<16;k++)
    {
        DS18B20_buff[k]= DS18B20_Read_Bit();
    }
   
     
    //OS the resoult of Temperature
    for(i=15;i>=0;i--)
    {
        Mask = 0x01;
        for(j=0;j<8;j++)
        {
            Outtemp[j] = Outtemp[j]<<1;
            if(DS18B20_buff&Mask) Outtemp[j]++;
            Mask = Mask<<1;
        }
    }

    for(i=0;i<6;i++)
    {
        if((Outtemp&0xf100)==0xf100)
        {
            Outtemp=~Outtemp;
            temp=1; //温度为负
        }
        else temp=0;//温度为正

        Outtemp>>=4;

        switch(i)
        {App.InterfaceData.SysDisplay[0].OutTemp
            case 0:
                    if(temp)  App.InterfaceData.SysDisplay[0].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[0].OutTemp=Outtemp;
                    break;
            case 1:
                    if(temp)  App.InterfaceData.SysDisplay[1].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[1].OutTemp=Outtemp;
                    break;
            case 2:
                    if(temp)  App.InterfaceData.SysDisplay[2].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[2].OutTemp=Outtemp;
                    break;
            case 3:
                    if(temp)  App.InterfaceData.SysDisplay[3].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[3].OutTemp=Outtemp;
                    break;
            case 4:
                    if(temp)  App.InterfaceData.SysDisplay[4].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[4].OutTemp=Outtemp;
                    break;
            case 5:
                    if(temp)  App.InterfaceData.SysDisplay[5].OutTemp=-Outtemp;
                    else      App.InterfaceData.SysDisplay[5].OutTemp=Outtemp;
                    break;
        }
    }

    //System.Device.Usart1.Open;
   
    //EnableIrq();  
}


void Init18b20(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    //Change_res(0x1f);  //设置传感器分辨率为9位,以0.5速度增长
}
回复

使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 128 天

    [LV.7]常住居民III

    32

    主题

    1万

    回帖

    3万

    积分

    三级逆天

    积分
    34414

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2020-11-24 08:16:59 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 78 天

    [LV.6]常住居民II

    4

    主题

    1544

    回帖

    1873

    积分

    二级逆天

    积分
    1873

    终身成就奖

    发表于 2020-11-24 08:25:02 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    难过
    3 天前
  • 签到天数: 81 天

    [LV.6]常住居民II

    0

    主题

    3710

    回帖

    7451

    积分

    二级逆天

    积分
    7451

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-11-24 08:47:31 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 107 天

    [LV.6]常住居民II

    5

    主题

    6751

    回帖

    1万

    积分

    三级逆天

    积分
    14185

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-11-24 08:52:13 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    11

    主题

    193

    回帖

    3

    积分

    二级逆天

    积分
    3

    终身成就奖特殊贡献奖

    发表于 2020-11-24 09:14:35 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-6-7 09:59
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    6215

    回帖

    1986

    积分

    二级逆天

    积分
    1986

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-11-24 09:52:13 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4703

    回帖

    5

    积分

    二级逆天

    积分
    5

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-11-24 17:06:15 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4166

    回帖

    0

    积分

    禁止发言

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-11-24 21:30:26 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 41 天

    [LV.5]常住居民I

    6

    主题

    1万

    回帖

    2万

    积分

    三级逆天

    积分
    20508

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-11-25 08:11:12 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表