专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
SHT11读写(含露点计算)
2020-02-05 08:55
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6119
17
17
以前做12864电子万年历时在网上下载的一个SHT11读写参考程序,现奉献出来给有需要的做参考,希望大家喜欢,帮我线度过老大的审核关.
sht11 含露点计算读写程序
ourdev_680397OZRTB9.rar(文件大小:17K)
(原文件名:SHT11 RW.rar)
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
hbzxx
1楼-- · 2020-02-06 03:23
LZ用了浮点运算。
会占用很大的空间的。建议用整数来做。
加载中...
WinLiu
2楼-- · 2020-02-06 09:03
回复【7楼】hbzxx
-----------------------------------------------------------------------
用浮点运算主要是考虑测量精度,空间现在已经不是问题,大不了用一个的大一点的芯片(我现在用的是SST89E564RD),当然这里是自己搞作玩不用考虑,如果批量生产就必须考虑了,否则成本就会增加.
加载中...
flyunlimit
3楼-- · 2020-02-06 09:06
给楼主添个砖,这时就体会到32位的好处了。不是全部程序,需要的自己捡有用的吧。
#include "stm32f10x.h"
#include "STM32_Init.h"
#include "key.h"
#define SCK_0 GPIOB->BRR = SCK;delay();
#define SCK_1 GPIOB->BSRR = SCK;delay();
#define DATA_0 GPIOB->BRR = DATA;delay();
#define DATA_1 GPIOB->BSRR = DATA;delay();
u32 sys_time_10ms=0;
u32 sys_time_1s=0;
u32 sys_time_1min=0;
u32 sys_time_1hour=0;
u32 sys_time_1day=0;
u8 USART1_TX_Buf[20];
u8 USART1_RX_Buf[20];
u32 USART1_RX_index=0;
u32 USART1_RX_count=0;
u32 USART1_TX_index=0;
u32 USART1_TX_count=0;
u32 nokey_time=0;
u32 TM;//温度
u32 RH;//湿度
u8 number_g=0;
u8 number_s=0;
u8 number_b=0;
typedef union
{
unsigned int Bdata;
struct
{
unsigned char TBIT0 :1;
unsigned char TBIT1 :1;
unsigned char TBIT2 :1;
unsigned char TBIT3 :1;
unsigned char TBIT4 :1;
unsigned char TBIT5 :1;
unsigned char TBIT6 :1;
unsigned char TBIT7 :1;
unsigned char TBIT8 :1;
unsigned char TBIT9 :1;
unsigned char TBIT10 :1;
unsigned char TBIT11 :1;
unsigned char TBIT12 :1;
unsigned char TBIT13 :1;
unsigned char TBIT14 :1;
unsigned char TBIT15 :1;
} Bits;
} TEMP_BIT;
volatile TEMP_BIT _TEMP_FLAG;
#define TEMP_flag _TEMP_FLAG.Bdata
#define USART1_RXS_FLAG _TEMP_FLAG.Bits.TBIT0 // 用于串口接收到头标志
#define USART1_RXE_FLAG _TEMP_FLAG.Bits.TBIT1 // 接受完毕
#define USART1_TXS_FLAG _TEMP_FLAG.Bits.TBIT2 // 开始dma发送
#define USART1_TXE_FLAG _TEMP_FLAG.Bits.TBIT3 // 发送完毕
#define key_flag _TEMP_FLAG.Bits.TBIT4 //
#define SHT_read_flag _TEMP_FLAG.Bits.TBIT5 //
#define auto_send_flag _TEMP_FLAG.Bits.TBIT6 //
//------------------------------------------------------------------------------------
//函数名: void delay(void)
//功能描述:延时函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:固定延时几个周期
//------------------------------------------------------------------------------------
__asm void delay(void)
{
nop
nop
nop
nop
nop
nop
nop
nop
BX LR
}
//------------------------------------------------------------------------------------
//函数名: void KeyDo (void)
//功能描述:按键键值的处理函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明: 每10ms执行一次,根据按键程序输出的有效键值进行对应的处理
// 有按键处理,无按键够10秒灭背光
//------------------------------------------------------------------------------------
void KeyDo (void)
{
u32 key_vale;
if(key_flag==1)
{
key_flag=0;
GetKey(&key_vale);
if(key_vale==0)
{
nokey_time++;
LED1_0; //背光灭
if(nokey_time>1000) //10秒无操作
{
nokey_time=500;
LED1_0; //背光灭
}
}
else
{
nokey_time=0;
LED1_1; //背光亮
switch(key_vale)
{
case KEY_VALUE_1|KEY_UP: //按下抬起后才有效
SHT_read_flag=1; // 手动测量
LED2_1;
break;
case KEY_VALUE_2|KEY_UP:
auto_send_flag=1; // 自动测量发送
break;
default :
break ;
}
}
}
}
//------------------------------------------------------------------------------------
//函数名: u32 SHT_read (void)
//功能描述:传感器读取函数
//输入参数:u32 cmd 要读取的数据,3-温度 5-湿度
//输出参数:u32 *pr 返回读到的数据
//返回参数: u32 err 错误类型
//函数说明:按照标准顺序读取传感器的值,不做CRC
//------------------------------------------------------------------------------------
u32 SHT_read (u32 cmd,u32 *pr)
{
u32 i,err,TR;
GPIOB->CRL=0x51444444; //开漏输出
//启动传输
SCK_1;
DATA_0;
SCK_0;
SCK_1;
DATA_1;
SCK_0;
for(i=0;i<8;i++)
{
SCK_0;
if(cmd&0x80)
{ DATA_1;} //宏定义是2句,所以大括号要加
else
{ DATA_0;}
SCK_1;
cmd<<=1;
}
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==0) //传感器ACK
err=0;
else
{
SCK_0;
return 0x01;
}
SCK_0; //SCK下降沿,从机DATA释放
while(GPIO_ReadInputDataBit(GPIOB , DATA)==1) //等待完成测量
delay();
TR=0;
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
SCK_0;
GPIOB->CRL=0x51444444; //开漏输出
DATA_0; //主机ACK
SCK_1;
SCK_0;
DATA_1;
GPIOB->CRL=0x41444444; //浮空输入
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
TR>>=1; //最后一次不用左移
GPIOB->CRL=0x51444444; //开漏输出
DATA_1; //主机ACK
SCK_1;
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
*pr=TR;
return err;
}
//------------------------------------------------------------------------------------
//函数名: void hextobcd(u32 temp)
//功能描述:hex转bcd
//输入参数:u32 temp 要转换的数,小于99
//输出参数:无
//返回参数: 无
//函数说明:将普通的HEX值转为4个BCD值
//------------------------------------------------------------------------------------
void hextobcd(u32 temp)
{
u32 i=0;
if (temp>=800) {i=8; temp-=800;}
if (temp>=400) {i+=4;temp-=400;}
if (temp>=200) {i+=2;temp-=200;}
if (temp>=100) {i++; temp-=100;}
number_b=i;
i=0;
if (temp>=80) {i=8; temp-=80;}
if (temp>=40) {i+=4;temp-=40;}
if (temp>=20) {i+=2;temp-=20;}
if (temp>=10) {i++; temp-=10;}
number_s=i;
number_g=temp;
}
//------------------------------------------------------------------------------------
//函数名: int main (void)
//功能描述:主函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:程序的主函数。 11010010101000
//------------------------------------------------------------------------------------
int main(void)
{
u32 temp;
STM32_Init();
while (1)
{
KeyDo();
if(SHT_read_flag) //测量温湿度
{
SHT_read_flag=0;
SHT_read(3,&TM); //3-温度 5-湿度
TM-=3964;
TM/=10; //小数点以后只留1位
SHT_read(5,&RH); //3-温度 5-湿度
temp=RH;
RH=(405-temp*28/1000)*temp-40000;
RH/=1000; //小数点以后只留1位
USART1_TXS_FLAG=1;
}
if(USART1_TXS_FLAG)
{
USART1_TXS_FLAG=0;
hextobcd(TM);
USART1_TX_Buf[0]='T';
USART1_TX_Buf[1]='=';
USART1_TX_Buf[2]=number_b+'0';
USART1_TX_Buf[3]=number_s+'0';
USART1_TX_Buf[4]='.';
USART1_TX_Buf[5]=number_g+'0';
USART1_TX_Buf[6]=' ';
hextobcd(RH);
USART1_TX_Buf[7]='R';
USART1_TX_Buf[8]='=';
USART1_TX_Buf[9]=number_b+'0';
USART1_TX_Buf[10]=number_s+'0';
USART1_TX_Buf[11]='.';
USART1_TX_Buf[12]=number_g+'0';
USART1_TX_Buf[13]='%';
USART1_TX_Buf[14]=' ';
USART1_TX_index=14;
USART1_TX_count=0;
USART_ITConfig(USART1,USART_IT_TC,ENABLE); //启动
}
if(USART1_RXE_FLAG) //如果接收结束
{
USART1_RXE_FLAG=0;
}
}
}
加载中...
WinLiu
4楼-- · 2020-02-06 14:40
精彩回答 2 元偷偷看……
加载中...
725725y
5楼-- · 2020-02-06 18:46
3Q楼主
加载中...
zhangyunbo
6楼-- · 2020-02-06 20:09
mark!!!
加载中...
上一页
1
2
3
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
会占用很大的空间的。建议用整数来做。
-----------------------------------------------------------------------
用浮点运算主要是考虑测量精度,空间现在已经不是问题,大不了用一个的大一点的芯片(我现在用的是SST89E564RD),当然这里是自己搞作玩不用考虑,如果批量生产就必须考虑了,否则成本就会增加.
#include "stm32f10x.h"
#include "STM32_Init.h"
#include "key.h"
#define SCK_0 GPIOB->BRR = SCK;delay();
#define SCK_1 GPIOB->BSRR = SCK;delay();
#define DATA_0 GPIOB->BRR = DATA;delay();
#define DATA_1 GPIOB->BSRR = DATA;delay();
u32 sys_time_10ms=0;
u32 sys_time_1s=0;
u32 sys_time_1min=0;
u32 sys_time_1hour=0;
u32 sys_time_1day=0;
u8 USART1_TX_Buf[20];
u8 USART1_RX_Buf[20];
u32 USART1_RX_index=0;
u32 USART1_RX_count=0;
u32 USART1_TX_index=0;
u32 USART1_TX_count=0;
u32 nokey_time=0;
u32 TM;//温度
u32 RH;//湿度
u8 number_g=0;
u8 number_s=0;
u8 number_b=0;
typedef union
{
unsigned int Bdata;
struct
{
unsigned char TBIT0 :1;
unsigned char TBIT1 :1;
unsigned char TBIT2 :1;
unsigned char TBIT3 :1;
unsigned char TBIT4 :1;
unsigned char TBIT5 :1;
unsigned char TBIT6 :1;
unsigned char TBIT7 :1;
unsigned char TBIT8 :1;
unsigned char TBIT9 :1;
unsigned char TBIT10 :1;
unsigned char TBIT11 :1;
unsigned char TBIT12 :1;
unsigned char TBIT13 :1;
unsigned char TBIT14 :1;
unsigned char TBIT15 :1;
} Bits;
} TEMP_BIT;
volatile TEMP_BIT _TEMP_FLAG;
#define TEMP_flag _TEMP_FLAG.Bdata
#define USART1_RXS_FLAG _TEMP_FLAG.Bits.TBIT0 // 用于串口接收到头标志
#define USART1_RXE_FLAG _TEMP_FLAG.Bits.TBIT1 // 接受完毕
#define USART1_TXS_FLAG _TEMP_FLAG.Bits.TBIT2 // 开始dma发送
#define USART1_TXE_FLAG _TEMP_FLAG.Bits.TBIT3 // 发送完毕
#define key_flag _TEMP_FLAG.Bits.TBIT4 //
#define SHT_read_flag _TEMP_FLAG.Bits.TBIT5 //
#define auto_send_flag _TEMP_FLAG.Bits.TBIT6 //
//------------------------------------------------------------------------------------
//函数名: void delay(void)
//功能描述:延时函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:固定延时几个周期
//------------------------------------------------------------------------------------
__asm void delay(void)
{
nop
nop
nop
nop
nop
nop
nop
nop
BX LR
}
//------------------------------------------------------------------------------------
//函数名: void KeyDo (void)
//功能描述:按键键值的处理函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明: 每10ms执行一次,根据按键程序输出的有效键值进行对应的处理
// 有按键处理,无按键够10秒灭背光
//------------------------------------------------------------------------------------
void KeyDo (void)
{
u32 key_vale;
if(key_flag==1)
{
key_flag=0;
GetKey(&key_vale);
if(key_vale==0)
{
nokey_time++;
LED1_0; //背光灭
if(nokey_time>1000) //10秒无操作
{
nokey_time=500;
LED1_0; //背光灭
}
}
else
{
nokey_time=0;
LED1_1; //背光亮
switch(key_vale)
{
case KEY_VALUE_1|KEY_UP: //按下抬起后才有效
SHT_read_flag=1; // 手动测量
LED2_1;
break;
case KEY_VALUE_2|KEY_UP:
auto_send_flag=1; // 自动测量发送
break;
default :
break ;
}
}
}
}
//------------------------------------------------------------------------------------
//函数名: u32 SHT_read (void)
//功能描述:传感器读取函数
//输入参数:u32 cmd 要读取的数据,3-温度 5-湿度
//输出参数:u32 *pr 返回读到的数据
//返回参数: u32 err 错误类型
//函数说明:按照标准顺序读取传感器的值,不做CRC
//------------------------------------------------------------------------------------
u32 SHT_read (u32 cmd,u32 *pr)
{
u32 i,err,TR;
GPIOB->CRL=0x51444444; //开漏输出
//启动传输
SCK_1;
DATA_0;
SCK_0;
SCK_1;
DATA_1;
SCK_0;
for(i=0;i<8;i++)
{
SCK_0;
if(cmd&0x80)
{ DATA_1;} //宏定义是2句,所以大括号要加
else
{ DATA_0;}
SCK_1;
cmd<<=1;
}
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==0) //传感器ACK
err=0;
else
{
SCK_0;
return 0x01;
}
SCK_0; //SCK下降沿,从机DATA释放
while(GPIO_ReadInputDataBit(GPIOB , DATA)==1) //等待完成测量
delay();
TR=0;
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
SCK_0;
GPIOB->CRL=0x51444444; //开漏输出
DATA_0; //主机ACK
SCK_1;
SCK_0;
DATA_1;
GPIOB->CRL=0x41444444; //浮空输入
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
TR>>=1; //最后一次不用左移
GPIOB->CRL=0x51444444; //开漏输出
DATA_1; //主机ACK
SCK_1;
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
*pr=TR;
return err;
}
//------------------------------------------------------------------------------------
//函数名: void hextobcd(u32 temp)
//功能描述:hex转bcd
//输入参数:u32 temp 要转换的数,小于99
//输出参数:无
//返回参数: 无
//函数说明:将普通的HEX值转为4个BCD值
//------------------------------------------------------------------------------------
void hextobcd(u32 temp)
{
u32 i=0;
if (temp>=800) {i=8; temp-=800;}
if (temp>=400) {i+=4;temp-=400;}
if (temp>=200) {i+=2;temp-=200;}
if (temp>=100) {i++; temp-=100;}
number_b=i;
i=0;
if (temp>=80) {i=8; temp-=80;}
if (temp>=40) {i+=4;temp-=40;}
if (temp>=20) {i+=2;temp-=20;}
if (temp>=10) {i++; temp-=10;}
number_s=i;
number_g=temp;
}
//------------------------------------------------------------------------------------
//函数名: int main (void)
//功能描述:主函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:程序的主函数。 11010010101000
//------------------------------------------------------------------------------------
int main(void)
{
u32 temp;
STM32_Init();
while (1)
{
KeyDo();
if(SHT_read_flag) //测量温湿度
{
SHT_read_flag=0;
SHT_read(3,&TM); //3-温度 5-湿度
TM-=3964;
TM/=10; //小数点以后只留1位
SHT_read(5,&RH); //3-温度 5-湿度
temp=RH;
RH=(405-temp*28/1000)*temp-40000;
RH/=1000; //小数点以后只留1位
USART1_TXS_FLAG=1;
}
if(USART1_TXS_FLAG)
{
USART1_TXS_FLAG=0;
hextobcd(TM);
USART1_TX_Buf[0]='T';
USART1_TX_Buf[1]='=';
USART1_TX_Buf[2]=number_b+'0';
USART1_TX_Buf[3]=number_s+'0';
USART1_TX_Buf[4]='.';
USART1_TX_Buf[5]=number_g+'0';
USART1_TX_Buf[6]=' ';
hextobcd(RH);
USART1_TX_Buf[7]='R';
USART1_TX_Buf[8]='=';
USART1_TX_Buf[9]=number_b+'0';
USART1_TX_Buf[10]=number_s+'0';
USART1_TX_Buf[11]='.';
USART1_TX_Buf[12]=number_g+'0';
USART1_TX_Buf[13]='%';
USART1_TX_Buf[14]=' ';
USART1_TX_index=14;
USART1_TX_count=0;
USART_ITConfig(USART1,USART_IT_TC,ENABLE); //启动
}
if(USART1_RXE_FLAG) //如果接收结束
{
USART1_RXE_FLAG=0;
}
}
}
一周热门 更多>