STM8L 151G6U6 驱动RW1820温度传感器
来源:互联网 发布:肝脏再造术的真假知乎 编辑:程序博客网 时间:2024/06/06 07:12
兼容DS18B20以及RW1820(VDD=2.8V)版本
#define RW1820_DQ_OUT GPIO_Init(GPIOC, GPIO_PIN_2,GPIO_Mode_Out_OD_HiZ_Slow); //输出
#define RW1820_DQ_IN GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT); //输入
#define RW1820_DQ_HIGH GPIO_SetBits(GPIOC, GPIO_PIN_2); //拉高
#define RW1820_DQ_LOW GPIO_ResetBits(GPIOC, GPIO_PIN_2); //拉低
#define RW1820_DQ_PULL_UP \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT); //上拉
#define RW1820_DQ_FLOATING \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_FL_No_IT); //浮空
#define RW1820_DQ_PUSH_PULL \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_Out_PP_Low_Fast); //推挽
#define RW1820_DQ_VALUE GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_2) //DQ值
void _delay_us(uint16_t nCount)
{
nCount *= 3;
while(--nCount);
}
/**
* @brief _delay_ms
* @param nCount
* @retval None
*/
void _delay_ms(uint16_t nCount)
{
while(nCount--)
{
_delay_us(1000);
}
}
//-----------------------------------------------------------------------------//
void RW1820_Init(void)
{
uint8_t retry=0;
RW1820_DQ_OUT; //置为输出口
RW1820_DQ_HIGH; //总线拉高
_delay_us(1);
RW1820_DQ_LOW; //总线产生下降沿,初始化开始
_delay_us(700); //复位脉冲 总线保持低电平在480 - 960微秒之间
RW1820_DQ_HIGH; //总线拉高
_delay_us(100); //100
RW1820_DQ_IN; //置为输入,主机释放总线,准备接收DS18B20的应答脉冲
while(RW1820_DQ_VALUE==1&& (retry<100) )//等待DS18B20发出应答脉冲
{
retry++;
_delay_us(1);
}
RW1820_DQ_HIGH; //总线拉高
_delay_us(400); //持续60-400us
}
//-------------从DS18B20写1个字节函数
void RW1820_WriteByte(unsigned char _data)
{
int i = 0;
RW1820_DQ_OUT; //置为输出口
delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_LOW; //总线拉低,启动“写时间片”
_delay_us(2); //大于1微妙
if (_data & 0x01)
{
RW1820_DQ_HIGH; //总线拉高
}
else RW1820_DQ_LOW; //总线拉低
_delay_us(60); //60
RW1820_DQ_HIGH; //总线拉高,释放总线,准备启动下一个“写时间片”
_data = _data >> 1;
}
}
//-------------从DS18B20读1个字节函数
unsigned char RW1820_ReadByte(void)
{
int i = 0, _data = 0;
delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_OUT; //置为输出口
RW1820_DQ_LOW; //总线拉低,启动读“时间片”
_data >>= 1;
_delay_us(2); //大于1微妙
RW1820_DQ_HIGH; //主机释放总线,接下来(2~15)us内读有效
RW1820_DQ_IN; //引脚设定为输入口,准备读取
if(RW1820_DQ_VALUE)
{
_data |= 0x80;
}
_delay_us(60); //60us后读完成
}
return _data;
}
int RW1820_ReadTemperature(void)//读取并计算要输出的温度
{
unsigned char temp;
unsigned int t;
RW1820_Init(); //复位
RW1820_WriteByte(0xcc);//发跳过序列号检测命令
RW1820_WriteByte(0x44);//命令Ds18b20开始转换温度
_delay_us(10);
RW1820_Init();
RW1820_WriteByte(0xcc);//发跳过序列号检测命令
RW1820_WriteByte(0xbe);//读暂存器
temp = RW1820_ReadByte();
t = (int)(((temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);
temp = RW1820_ReadByte();
t += ((temp & 0x0f) << 4);
return t;
}
#define RW1820_DQ_OUT GPIO_Init(GPIOC, GPIO_PIN_2,GPIO_Mode_Out_OD_HiZ_Slow); //输出
#define RW1820_DQ_IN GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT); //输入
#define RW1820_DQ_HIGH GPIO_SetBits(GPIOC, GPIO_PIN_2); //拉高
#define RW1820_DQ_LOW GPIO_ResetBits(GPIOC, GPIO_PIN_2); //拉低
#define RW1820_DQ_PULL_UP \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT); //上拉
#define RW1820_DQ_FLOATING \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_FL_No_IT); //浮空
#define RW1820_DQ_PUSH_PULL \
GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_Out_PP_Low_Fast); //推挽
#define RW1820_DQ_VALUE GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_2) //DQ值
void _delay_us(uint16_t nCount)
{
nCount *= 3;
while(--nCount);
}
/**
* @brief _delay_ms
* @param nCount
* @retval None
*/
void _delay_ms(uint16_t nCount)
{
while(nCount--)
{
_delay_us(1000);
}
}
//-----------------------------------------------------------------------------//
void RW1820_Init(void)
{
uint8_t retry=0;
RW1820_DQ_OUT; //置为输出口
RW1820_DQ_HIGH; //总线拉高
_delay_us(1);
RW1820_DQ_LOW; //总线产生下降沿,初始化开始
_delay_us(700); //复位脉冲 总线保持低电平在480 - 960微秒之间
RW1820_DQ_HIGH; //总线拉高
_delay_us(100); //100
RW1820_DQ_IN; //置为输入,主机释放总线,准备接收DS18B20的应答脉冲
while(RW1820_DQ_VALUE==1&& (retry<100) )//等待DS18B20发出应答脉冲
{
retry++;
_delay_us(1);
}
RW1820_DQ_HIGH; //总线拉高
_delay_us(400); //持续60-400us
}
//-------------从DS18B20写1个字节函数
void RW1820_WriteByte(unsigned char _data)
{
int i = 0;
RW1820_DQ_OUT; //置为输出口
delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_LOW; //总线拉低,启动“写时间片”
_delay_us(2); //大于1微妙
if (_data & 0x01)
{
RW1820_DQ_HIGH; //总线拉高
}
else RW1820_DQ_LOW; //总线拉低
_delay_us(60); //60
RW1820_DQ_HIGH; //总线拉高,释放总线,准备启动下一个“写时间片”
_data = _data >> 1;
}
}
//-------------从DS18B20读1个字节函数
unsigned char RW1820_ReadByte(void)
{
int i = 0, _data = 0;
delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_OUT; //置为输出口
RW1820_DQ_LOW; //总线拉低,启动读“时间片”
_data >>= 1;
_delay_us(2); //大于1微妙
RW1820_DQ_HIGH; //主机释放总线,接下来(2~15)us内读有效
RW1820_DQ_IN; //引脚设定为输入口,准备读取
if(RW1820_DQ_VALUE)
{
_data |= 0x80;
}
_delay_us(60); //60us后读完成
}
return _data;
}
int RW1820_ReadTemperature(void)//读取并计算要输出的温度
{
unsigned char temp;
unsigned int t;
RW1820_Init(); //复位
RW1820_WriteByte(0xcc);//发跳过序列号检测命令
RW1820_WriteByte(0x44);//命令Ds18b20开始转换温度
_delay_us(10);
RW1820_Init();
RW1820_WriteByte(0xcc);//发跳过序列号检测命令
RW1820_WriteByte(0xbe);//读暂存器
temp = RW1820_ReadByte();
t = (int)(((temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);
temp = RW1820_ReadByte();
t += ((temp & 0x0f) << 4);
return t;
}
阅读全文
0 0
- STM8L 151G6U6 驱动RW1820温度传感器
- STM8L 温度传感器DS18B20
- linux ds18b20 温度传感器驱动
- 详解温度传感器tmp275驱动
- stm32 驱动DS18B20温度传感器
- STM8L
- 总结:如何驱动DS18B20温度传感器
- 温度传感器
- 基于ARM-LINUX的温度传感器驱动-DS18B20
- 数值温度传感器18b20驱动分析
- zigbee网关 cc2530裸机驱动温度传感器LM75A
- S3C6410 DS18B20温度传感器驱动(三) --- 驱动源代码
- 基于ARM-LINUX的温度传感器驱动(一)
- 基于ARM-LINUX的温度传感器驱动(DS18B20)
- tiny6410温度传感器驱动学习1(测试通过)
- s3c6410 DS18B20温度传感器驱动(一) --- 原理分析
- S3C6410 DS18B20温度传感器驱动(二) --- 时序分析
- S3C6410 DS18B20温度传感器驱动(四) --- 读取温度的应用程序
- 关于Django的TIME_ZONE时区问题的若干总结
- 我的第一个个人网站-建站全程记录
- C语言基础练习之数组
- JavaScript获取光标位置、定位光标位置
- App的启动过程
- STM8L 151G6U6 驱动RW1820温度传感器
- 安卓隐藏输入法键盘以及去除光标方法
- cookie 和session 的区别详解
- c语言基础(五)
- rabitMQ windows安装
- CSS实现单行、多行文本溢出显示省略号(…)
- Nginx反向代理
- 条形码组件Spire.Barcode 教程:如何在C#中创建EAN-13条码
- SpringBoot2.x参考指南(中文版) 第二部分 开始入门