资源简介
ds18b20单总线程序耗时较久,实际应用中局限较大,本程序采用10us定时中断方式,验证成功,采用程序放中断中,主程序中放到合适位置调用读取数据即可。

代码片段和文件信息
#include “DS18B20.h“
#define DS18B20_OUT_H() (GPIOB->BSRR=GPIO_Pin_5) //输出高
#define DS18B20_OUT_L() (GPIOB->BRR=GPIO_Pin_5) //输出低
//#define AM2305_IN_X (GPIOB->IDR&GPIO_Pin_5) // 对应端口输入寄存器
#define DS18B20_DQ_IN GPIO_ReadInputDataBit(GPIOBGPIO_Pin_5)
#define DisRequset_STU 0//收到通信请求
#define EnableRequest_STU 1//收到通信请求
#define StartRST_STU 2//起始+复位信号
#define StartWriteCC_STU 3//启动转换
#define WriteRST_STU 4//启动转换后复位信号
#define WriteCC_STU 5//读取命令
#define ReadTemp_STU 6// 读取2个字节数据
#define ReadOK_STU 7// 读取完毕
#define WriteData44_STU 1//
#define WriteDatabe_STU 2//
u8 R_DS18B20_WBCnt = 0;
u8 R_DS18B20_ComuTime = 0;
u8 R_DS18B20_TempL = 0;
u8 R_DS18B20_TempH = 0;
u8 R_DS18B20_Bytecnt = 0;
u8 R_DS18B20_Data = 0;
u8 R_DS18B20_State = 0;
u8 R_DS18B20_Request = 0;
u8 R_WriteDS18_State = 0;
u8 R_DS18B20_WDataBak = 0;
u8 R_GotTemp = 0;
static void DS18B20_IO_OUT(void)
{
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Init(GPIOE &GPIO_InitStructure);
GPIO_OutConfigInit(PortBPB5_AM2302_DATA); //推挽输出
}
static void DS18B20_IO_IN(void)
{
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_Init(GPIOE &GPIO_InitStructure);
GPIO_InConfigInit(PortBPB5_AM2302_DATA); //上拉输入
}
void Ds18B20_ReadDate_RT(void)
{
u8 i = 0;
if(!R_DS18B20_State )
return;
if(R_DS18B20_State == EnableRequest_STU)
{
R_DS18B20_State = StartRST_STU;
DS18B20_IO_OUT();
}
switch(R_DS18B20_State)
{
case StartRST_STU:
case WriteRST_STU:
{
R_DS18B20_ComuTime++;
if(R_DS18B20_ComuTime <65)
{
DS18B20_OUT_L(); //拉低DQ 拉低650us
}
else
{
DS18B20_IO_IN();
if(R_DS18B20_ComuTime > 75)
{
if(!(DS18B20_DQ_IN))
{
i= 0x55;
}
if(R_DS18B20_ComuTime > 90) //等待DS18B20响应
{
R_DS18B20_ComuTime = 0;
if(R_DS18B20_State == StartRST_STU)
R_DS18B20_State = StartWriteCC_STU;
if(R_DS18B20_State == WriteRST_STU)
R_DS18B20_State = WriteCC_STU;
}
}
}
break;
}
case StartWriteCC_STU: //写入 cc 44
case WriteCC_STU: //写入 cc be
{
u8 Wstate = 0;
if(R_WriteDS18_State == 0)
{
Wstate = DS18B20_Write_Byte(0xcc);
//if(DS18B20_Write_Byte(u8 0xcc))
if(Wstate)
{
if(R_DS18B20_State == StartWriteCC_STU)
R_WriteDS18_State = WriteData44_STU;
if(R_DS18B20_State == WriteCC_STU)
R_WriteDS18_State = WriteDatabe_STU;
}
}
else
{
if(R_WriteDS18_State == WriteData44_STU)
{
if(DS18B20_Write_Byte(0x44))
{
R_DS18B20_State = WriteRST_STU;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 640 2018-09-27 23:03 DS18B20.h
文件 6556 2018-09-27 23:03 DS18B20.c
- 上一篇:因果图.jpg
- 下一篇:电子时钟的设计显示时,分,秒
相关资源
- STC8951系列单片机中方指南
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- 51单片机PWM程序,占空比、周期可调整
- 单片机和adc0809数字电压表
- PIC单片机完成的电子密码锁
- 单片机、ADC0808809设计简易数字电压表
- 51单片机多功能自行车测速仪
- 单片机做的6位时分秒数字钟
- 单片机电子时钟 闹钟 日历
- 音乐代码转换软件 单片机编程时用
- 单片机课程设计 篮球计分器
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 单片机与温度传感器DS18B20的程序设计
- 毕业论文之温度传感器DS18B20(源码
- 51单片机基于protues的几个仿真实例
- 基于52单片机的直流电压测量
- 38k单片机红外发送代码、keil
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- stm32 ds18b20 温度传感器 测试通过
- 51单片机控制舵机程序
- 武汉理工大学 单片机课程设计 16*16点
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- 浙江工业大学2005-2006学年单片机习题
- 单片机与PC机串口通讯仿真
评论
共有 条评论