网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数: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
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 54回复贴,共2页
  • ,跳到 页  
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示