网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月30日
漏签
0
天
单片机吧
关注:
212,109
贴子:
1,047,627
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
54
回复贴,共
2
页
,跳到
页
确定
<<返回单片机吧
>0< 加载中...
求大神指导 单片机读SHT20传感器
只看楼主
收藏
回复
TinaRain
少将
14
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我用单片机 使用I2C协议读取SHT20传感器
发了一条写指令 传感器没有回ack
示波器如图所示 图中也没有ack 后面直接进入停止状态 然后重新开始写入
请问大神有做过的吗 从图中看我做的时序有问题吗 谢谢了
萨佛131
少将
14
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
波形上看,从机应该已经对0X81的首地址响应了。
如果确实对I2C不熟悉,最好先找24系列的EEPROM进行读写训练,把通信过程搞清楚。
2025-08-30 12:32:38
广告
不感兴趣
开通SVIP免广告
萨佛131
少将
14
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
在第8个SCL拉低之后,主机的SDA必须先放开(变高),才能读到从机的ACK。
主楼的照片没有这个放开的意思。
TinaRain
少将
14
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我试了一下 在第8个下降沿 立刻把 sda拉上去 然后延时 又拉上scl 结果还是没有sda,
是不是我遗漏了什么 因为我换过sht20了,按理说 硬件不应该有问题 我又试了几次不同的延时,还是没什么效果 感觉1.是硬件问题(已经换过传感器) 2.要不就是没写进去 所以 对方无应答 时序从示波器上看 应该没问题了 我也在思索 哪被遗漏了 没想到
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我想问问楼主读出来的数据稳定吗,我读出来的温度一直在波动,而且范围很大,当我向传感器哈气时湿度超过55%以后就都变成0了,有没这种情况发生
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include <stdio.h>
#include <ioCC2530.h>
#include "OnBoard.h"
#define st(x) do { x } while (__LINE__ == -1)
#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )
#define HAL_IO_GET(port, pin) HAL_IO_GET_PREP( port,pin)
#define HAL_IO_GET_PREP(port, pin) ( P##port##_##pin)
#define LIGHT_SCK_0() HAL_IO_SET(1,4,0)
#define LIGHT_SCK_1() HAL_IO_SET(1,4,1)
#define LIGHT_DTA_0() HAL_IO_SET(1,3,0)
#define LIGHT_DTA_1() HAL_IO_SET(1,3,1)
#define LIGHT_DTA() HAL_IO_GET(1,3)
#define LIGHT_SCK() HAL_IO_GET(1,4)
#define SDA_W() (P1DIR |=BV(3) )
#define SDA_R() (P1DIR &=~BV(3) )
#define delay() {asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}
#define SHT20ADDR 0x80
void delay_nus(void);
void delay_nms(int n);
void start_i2c(void);
void stop_i2c(void);
unsigned char i2c_send(unsigned char val);
unsigned char i2c_read(char ack);
unsigned char get_light(void);
void SET_Resolution(void) ;
float get_sht20(char whatdo);
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
void delay_nus(void)
{
int i;
int n=100;
for(i=0;i<n;i++)//延迟32NOP为1US
{
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
}
}
void delay_nms(int n)
{
while(n--)
{
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
}
}
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/****************************
启动I2C
数据在时钟高电平的时候从高往低跃变
*****************************/
void start_i2c(void)
{
SDA_W() ;
//LIGHT_SCK_0() ;
//delay_nus(20);
LIGHT_DTA_1();
//delay_nus() ;
LIGHT_SCK_1() ;
delay_nus() ;
LIGHT_DTA_0() ;
delay_nus() ;
LIGHT_SCK_0() ;
delay_nus() ;
//delay() ;
}
/********************************
结束I2C
数据在时钟高电平的时候从低往高跃变
********************************/
void stop_i2c(void)
{
SDA_W() ;
LIGHT_DTA_0() ;
delay_nus();
LIGHT_SCK_1() ;
delay_nus();
LIGHT_DTA_1() ;
delay_nus();
LIGHT_SCK_0() ;
delay_nus();
}
/******************************
发送字节并且判断是否收到ACK
当收到ACK返回为0,否则返回为1
******************************/
unsigned char i2c_send(unsigned char val)
{
int i;
int ack;
char error=0;
SDA_W();
for(i=0x80;i>0;i/=2)
{
if(val&i)
LIGHT_DTA_1();
else
LIGHT_DTA_0();
delay_nus();
LIGHT_SCK_1() ;
delay_nus();
LIGHT_SCK_0() ;
delay_nus();
}
LIGHT_DTA_1();
SDA_R();
//delay_nus();
LIGHT_SCK_1() ;
delay_nus();
if(LIGHT_DTA())
error=1;
delay_nus();
LIGHT_SCK_0() ;
return error;
}
/***************************
读取I2C的字节,并且发送ACK
当参数为1的时候发送一个ACK(低电平)
***************************/
unsigned char i2c_read(char ack)
{
int i;
char val=0;
LIGHT_DTA_1();
//SDA_R();
for(i=0x80;i>0;i/=2)
{
LIGHT_SCK_1() ;
delay_nus();
SDA_R();
if(LIGHT_DTA())
val=(val|i);
delay_nus();
LIGHT_SCK_0() ;
delay_nus();
}
SDA_W();
if(ack)
LIGHT_DTA_0();
else
LIGHT_DTA_1();
delay_nus();
LIGHT_SCK_1() ;
delay_nus();
LIGHT_SCK_0() ;
LIGHT_DTA_1();
return val;
}
2025-08-30 12:26:38
广告
不感兴趣
开通SVIP免广告
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/*================================================================
void SET_Resolution(void)
写寄存器,设置分辨率
================================================================*/
void SET_Resolution(void)
{
start_i2c(); //Start I2C
unsigned char tttt=i2c_send(SHT20ADDR&0xfe);
if(tttt==0) //I2C address + write + ACK
{
if(i2c_send(0xe6)==0) //写用户寄存器
{
if(i2c_send(0x83)==0); //设置分辨率 11bit RH% 测量时间:12ms(typ.) & 11bit T℃ 测量时间:9ms(typ.)
}
}
stop_i2c(); //Stop I2C
}
/****测量温度和湿度 SHT20
whatdo: 0xf3 非主机模式 测量温度
0xf5 非主机模式 测量湿度
******/
float get_sht20(char whatdo){
float temp;
unsigned char MSB,LSB;
float wendu,shidu;
P1DIR|=BV(4);
SET_Resolution();
start_i2c();
if(i2c_send(SHT20ADDR&0xfe)==0) //I2C address + write + ACK
{
if(i2c_send(whatdo)==0)
{
do
{
delay_nms(6);
start_i2c();
}while(i2c_send(SHT20ADDR|0x01)==1); //I2C address + read + NACK
MSB=i2c_read(0); //Data(MSB)
LSB=i2c_read(0); //Data(LSB)
i2c_read(1); //Checksum + NACK
stop_i2c();
LSB &= 0xfc; //Data (LSB) 的后两位在进行物理计算前前须置‘0’
temp = (MSB<<8) + LSB;
if (whatdo==((char)0xf5)) //No Hold Master Mode,read humidity
{
/*-- calculate relative humidity [%RH] --*/
shidu=(temp*125)/65536-6; //公式: RH%= -6 + 125 * SRH/2^16
return shidu;
}
else if(whatdo==((char)0xf3)) //No Hold Master Mode,read temperature
{
/*-- calculate temperature [°C] --*/
wendu=(temp*175.72)/65536-46.85; //公式:T= -46.85 + 175.72 * ST/2^16
return wendu;
}
}
}
return 0;
}
兔斯基小弟
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我用的是cc2530芯片,之前这个模拟的iic程序用在测试光照强度测量是可以的,帮忙分析分析为啥会出现温度不稳定,当湿度大于55%时会变0的情况
lzh771055370
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
一年前用过,注意事项都忘了,那个温湿度传感器吧,仔细看看手册,需要的话可以把程序发你参考下
对方法噶
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
大家有没有遇到过只能读取高8位,低八位全是1的情况。如图:从检测到SCL被释放开始读取高八位,第九个时钟主机把SDA拉低响应ACK,之后低八位就读到11111111了。
hz77776666
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
lz有没有stm8s驱动SHT2x的程序。现在怎么也调不出来。
菩提菩提提
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
楼主这是什么示波器,这么高档,上面还有SCL,SDA
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示