历史上的今天
今天是: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
史海拾趣
|
三星2009上半年推出的2416芯片相比2440具有压倒性的优势,是完美替代2440的首要选择 1. 性能以及对视频播放能力的支持:2416 主频400MHz和2440持平,但是2416是ARM926JES内核,是ARM920T的增强版本,治理运行速度方面 ...… 查看全部问答> |
|
本人只有C语言基础,现在要利用实验室现有博创公司UP-NETARM2410-S嵌入式开发平台(包括GPRS/GPS模块、电机控制模块、摄像头模块等),设计一套能够实现对现场数据的远程无线传输和实时监控功能的远程监控雏形系统。还望大家不吝赐教!!!… 查看全部问答> |
|
我是电气工程与自动化的本科生 我想考嵌入式的研究生 不知道可行吗 我如果从事嵌入式优势是什么 劣势是什么(我的意思是我本科是电气工程与自动化 我该重点自学一些什么方面的知识 ) 还有 那个学校的嵌入式比较好 先谢过了… 查看全部问答> |
|
int rc = _sqlite3_open(_T(\"存储卡\\\\123.db\"), &m_db); if ( rc != SQLITE_OK ) { ASSERT(FALSE); } 打开不成功,如果是英文目录就没有问题!… 查看全部问答> |
|
我的6410裸奔已经起来了 牛人给的的一个简单的BOOT 代码已经可以在DDR里面运行 但是我没有设置变量创建的地址在哪 那6410是自动在内部8K的SRAM创建变量呢 等到满了8K ...… 查看全部问答> |
|
求助!!!!!12864液晶显示有问题,大侠们来帮我看一下~~~ 我用的是OCM12864-3,程序是显示“欢迎使用”四个字在液晶正中。 程序烧入单片机以后都没问题,当我把电源拔下再插,多试几次,也没有问题。但是!过了3~5分钟,我再上电,“欢迎”这两个字就往上移动了一行,真不知道为什么,郁闷啊!   ...… 查看全部问答> |
|
LaunchPad打横短接J3txd、rxd为何电脑没有找到端口? 如题;需要另外接一个串口转usb(如PL2303之类的)么? 听说这个板子很强大,可以直接连USB线,但是一直没有端口(COM口),是不是程序上面需要设置什么呢? 接法如https://bbs.eeworld.com.cn/thread-371773-1-1.html 二楼的图接法是一样的。 ...… 查看全部问答> |




