Proteus中MSP430与SHT11的IIC通信问题

发布者:石头12345最新更新时间:2020-04-02 来源: eefocus关键字:Proteus  MSP430  SHT11  IIC通信 手机看文章 扫描二维码
随时随地手机看文章

调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上。DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了。mark一下,顺便感谢那位作者,附上他的链接:http://blog.sina.com.cn/s/blog_52f5ded30100bf68.html


附上MSP430代码:


在main里调用:


s_connectionreset();

s_write_status();

for(;;)

{

  s_read_temp_and_humi();//读取温度、湿度

}


sht11.h:


enum {TEMP,HUMI};

 

#define S_DATA_OUT (P6DIR |= BIT3) //P6.5 OUT

#define S_DATA_IN (P6DIR &=~BIT3) //P6.5 IN

#define S_DATA (P6IN & BIT3) //P6.5 DATA

#define S_DATA_LOW (P6OUT &=~BIT3)

#define S_DATA_HIGH (P6OUT |= BIT3)

#define S_SCK_OUT (P6DIR |= BIT4)

#define S_SCK_LOW (P6OUT &=~BIT4)

#define S_SCK_HIGH (P6OUT |= BIT4)

 

#define noACK 0

#define ACK 1

//adr command r/w

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000 0010 1

#define MEASURE_STATUS 0x06 //000 0011 0

 

void delay(unsigned int k);

void s_transstart(void);

void s_connectionreset(void);

unsigned char s_write_byte(unsigned char value);

unsigned char s_read_byte(unsigned char ack);

void s_calc_sth11(void);

unsigned char s_measure(unsigned int *p_value, unsigned char mode);

void s_write_status();

void s_read_temp_and_humi(void);

unsigned int temperature,humidity;

float f_temperature,f_humidity;

unsigned char s_read_data(unsigned int *p_value);

unsigned char s_measure_cmd(unsigned char mode);

unsigned char s_error=0;

 

extern float humi;

/******************************************************************************/

/* Temperature and humidity sensor function start */

/******************************************************************************/

// generates a tran××ission start 

// _____ ________

// DATA: |_______|

// ___ ___

// SCK : ___| |___| |______ 

 

// calculates temperature [懊] and humidity [%RH] 

// input : humi [Ticks] (12 bit) 

// temp [Ticks] (14 bit)

// output: humi [%RH]

// temp [懊]

void s_calc_sth11(void)

  float rh; // rh: Humidity

  float t; // t: Temperature

  float ttt;

  if(temperature>7000) 

  ttt=temperature-7000;

  else

  ttt=7000-temperature;

  t=temperature*0.01 - 39.64-0.00000002*ttt*ttt; //calc. temperature from ticks to [℃]

  rh=(0.0405-0.0000028*humidity)*humidity -4.0; //calc. humidity from ticks to [%RH]

  rh=(t-25)*(0.01+0.00008*humidity)+rh; //calc. temperature compensated humidity [%RH]

  f_temperature=t;

  temperature=t; //return temperature [℃]

  f_humidity=rh;

  humidity=rh; //return humidity[%RH]

  if((t-temperature)>=0.5)

  temperature+=1;

  if((rh-humidity)>=0.5)

  humidity+=1;

  if(humidity>100) humidity=100; //cut if the value is outside of 

  if(humidity<1) humidity=1; //the physical possi××e range

  

  humi=0.123;

}

 

 

 

void s_transstart(void)

  S_DATA_OUT;

  S_SCK_OUT;

  S_DATA_HIGH; //Initial state

  S_SCK_LOW;

  S_SCK_HIGH;

  S_DATA_LOW;

  S_SCK_LOW;

  S_SCK_HIGH; 

  S_DATA_HIGH;

  S_SCK_LOW; 

}

// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart

// _____________________________________________________ ________

// DATA: |_______|

// _ _ _ _ _ _ _ _ _ ___ ___

// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______

void s_connectionreset(void)

  unsigned char i; 

  S_DATA_OUT;

  S_SCK_OUT;

  S_DATA_HIGH; //Initial state

  S_SCK_LOW; 

  for(i=0;i<9;i++) //9 SCK cycles

  { 

    S_SCK_HIGH;

    //_nop();

    S_SCK_LOW;

  }

  s_transstart(); //tran××ission start

}

// writes a byte on the Sensibus and checks the acknowledge 

unsigned char s_write_byte(unsigned char value)

  unsigned char i,error=0; 

  S_DATA_OUT;

  for (i=0x80;i>0;i/=2) //shift bit for masking

  { 

    if (i & value) S_DATA_HIGH; //masking value with i , write to SENSI-BUS

    else S_DATA_LOW; 

    S_SCK_HIGH; //clk for SENSI-BUS

    S_SCK_LOW;

  }

  S_DATA_IN; 

  S_SCK_HIGH; //clk #9 for ack 

  error=S_DATA; //check ack (DATA will be pulled down by SHT11)

  S_SCK_LOW; 

  S_DATA_OUT; //release DATA-line

  return error; //error=1 in case of no acknowledge

}

// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 

unsigned char s_read_byte(unsigned char ack)

  unsigned char i,val=0;

  S_DATA_IN;

  for (i=0x80;i>0;i/=2) //shift bit for masking

  { 

    S_SCK_HIGH; //clk for SENSI-BUS

    if (S_DATA) val=(val | i); //read bit 

    S_SCK_LOW; 

  }

  S_DATA_OUT;

  if(ack)

  S_DATA_LOW;

  else

  S_DATA_HIGH; //in case of "ack==1" pull down DATA-Line

  S_SCK_HIGH; //clk #9 for ack

  S_SCK_LOW; //release DATA-line

  return val;

/*Write status register:12bit humi,14bit temp*/

void s_write_status(void)

{

  s_connectionreset();

  s_write_byte(MEASURE_STATUS);

  s_write_byte(0x00); 

}

// makes a measurement (humidity/temperature)

unsigned char s_measure(unsigned int *p_value,unsigned char mode)

  unsigned char error=0;

  unsigned int i;

  

  s_transstart(); //tran××ission start

  if(mode==TEMP) //send command to sensor

  error+=s_write_byte(MEASURE_TEMP);

  else

  error+=s_write_byte(MEASURE_HUMI);

  S_DATA_IN;

  for (i=0;i<65535;i++) 

    if(S_DATA==0) break; //wait until sensor has finished the measurement

  if(S_DATA) error+=1; // or timeout (~1 sec.) is reached

  *p_value =s_read_byte(ACK); //read the first byte (MSB)

  *p_value = (*p_value)<<8;

  (*p_value) +=s_read_byte(noACK); //read the second byte (LSB)

  return error;

}

/***mode:TEMP,HUMI***/

unsigned char s_measure_cmd(unsigned char mode)

{

  unsigned char error=0;

  s_transstart();

  if(mode==TEMP) //send command to sensor

  error+=s_write_byte(MEASURE_TEMP);

  else

  error+=s_write_byte(MEASURE_HUMI);

  S_DATA_IN;

  return error;

}

unsigned char s_read_data(unsigned int *p_value)

{

  if(S_DATA)

  return 1;

  else

  {

    *p_value =s_read_byte(ACK); //read the first byte (MSB)

    *p_value = (*p_value)<<8;

    (*p_value) +=s_read_byte(noACK); //read the second byte (LSB)

    return 0;

  }

}

 

 

// measure humidity [%RH](8 bit) and temperature [℃](12 bit)

void s_read_temp_and_humi(void)

{

  unsigned char error=1;

  while(error)

  {

    error=0;

    error+=s_measure(&humidity,HUMI); //measure humidity

    error+=s_measure(&temperature,TEMP); //measure temperature

    if(error!=0) 

    s_connectionreset(); //in case of an error: connection reset

    else

    s_calc_sth11(); //calculate humidity, temperature

  }

}

/******************************************************************************/

/* Temperature and humidity sensor function END */

/******************************************************************************/

void delay(unsigned int k)

{

  unsigned int ktemp;

  for(ktemp=0;ktemp

关键字:Proteus  MSP430  SHT11  IIC通信 引用地址:Proteus中MSP430与SHT11的IIC通信问题

上一篇:MSP430 Launchpad MSP430g2452 SHT10 温湿度传感器
下一篇:【MSP430】ADC12_init

推荐阅读最新更新时间:2024-11-07 23:41

基于MSP430行驶车辆检测器的设计
引言 近年来,车辆检测器作为交通信息采集的重要前端部分,越来越受到业内人士的关注。鉴于公路交通现代化管理和城市交通现代化管理的发展需要,对于行驶车辆的动态检测技术——车辆检测器的研制在国内外均已引起较大重视。车辆检测器以机动车辆为检测目标,检测车辆的通过或存在状况,其作用是为智能交通控制系统提供足够的信息以便进行最优的控制。 目前,常用的行驶车辆检测器主要有磁感应式检测器,超声波式检测器,压力开关检测器,雷达检测器,光电检测器以及视频检测器等,而环形线圈电磁感应式车辆检测器具有性能稳定、结构简单、检测电路易于实现、成本低、维护量少、适应面广等优点,市场应用范围最广。目前我国实际用于高速公路和城市道路的车辆检测
[测试测量]
基于<font color='red'>MSP430</font>行驶车辆检测器的设计
基于MSP430的直流宽带放大器设计
摘要:以压控增益宽带放大器VCA810为主,配合低噪声高速运放OPA820ID和高输出电压低失真运放THS3091D,设计并制作一个基于超低功耗单片机MSP430F155的5 V单电源供电的宽带低噪声放大器。由单片机软件实现VCA810增益控制及输出波形幅值显示。电压增益为-20~+60 dB可调,在最大增益下,通频带为10 Hz~10 MHz,负载50 Ω情况下可输出峰峰值29 V的电压。为解决宽带放大器的自激问题及减小输出噪声,采用了多种形式的抗干扰措施,抑制噪声,改善放大器的稳定性。 随着社会生产力的发展,人们迫切地要求能够远距离随时随地迅速而准确地传送多媒体信息。于是,无线通信技术得到了迅猛的发展,技术也越来越成熟。而宽
[单片机]
基于<font color='red'>MSP430</font>的直流宽带放大器设计
MSP430单片机的3种时钟信号
(1)MCLK 系统主时钟。除了CPU 运算使用此时钟信号外,外围模块也可以使用。MCLK 可以选择任何一个振荡器产生的时钟信号并进行1、2、4、8 分频作为其信号源。 (2)SMCLK 系统子时钟。外围模块可以使用,并且在使用之前可以通过各模块的寄存器实现分频。SMCLK 可以选择任何一个振荡器产生的时钟信号并进行1、2、4、8 分频作为其信号源。 (3)ACLK 辅助时钟。外围模块可以使用,并且在使用之前可以通过各模块的寄存器实现分频。ACLK 只能由LFXT1 进行1、2、4、8 分频作为其信号源。PUC 结束时,MCLK 和SMCLK 的信号源为DCO,DCO 的振荡频率约为800kHz(详见相关手册)。ACLK 的信
[单片机]
基于MSP430的智能仪表与组态王的通讯设计
1 引言   目前组态王与单片机的通信多是通过动态数据交换或自己开发通讯驱动程序的方式进行的 。动态数据交换(DDE)是Windows平台上一个完整的通讯协议,通过DDE使应用程序之间彼此能交换数据和发送指令。但使用DDE会带来一些额外的开销,如会降低系统实时性、增加系统的不可靠性,特别在多参数传送时不太稳定,易出现数据丢失现象。而自己开发通讯驱动程序又有一定的难度,且开发周期较长。最近,在为九江石化燃运输煤皮带监控系统的设计中,基于MSP430单片机的智能仪表作为下位机,研华公司的工控机作为上位机,采用ADAM-5000的协议,实现了数据的实时采集、处理和显示。 2 系统结构   燃运皮带监控系统整体结构如图1所示。现场的
[单片机]
基于MSP430的电机功率因数测量系统
MSP430系列单片机是一种超低功耗的混合信号处理器(Mixed Signal Processor),它具有低电压、超低功耗、强大的处理能力、系统工作稳定、丰富的片内外设、方便开发等优点,具有很高的性价比,在工程控制等领域有着极其广泛的应用范围。使用MSP430实现对电机功率因数等电力参数的测量,不但提高了测量的精度和自动化水平,而且降低了系统的功耗。 1 功率因数与相位 电机的功率因数cosΦ值是相电压与相电流的余弦值。设三相的电压分别为UA,UB,UC,电流分别为IA,IB,IC,则它们的表达式如下: 上式中:UM表示每相电压幅值;IM表示每相电流幅值;ω表示角频率;Φ表示相电流滞后相电压的相位差角。图1给出了三相输电
[单片机]
基于<font color='red'>MSP430</font>的电机功率因数测量系统
MSP430关键硬件电路设计要诀
众所周知,MSP430以其超低功耗而著称。但是很多用户反应,在实际应用中,测量MSP430的功耗时,测量结果和MSP430数据手册相差甚远。其实这里主要涉及到两方面的内容:   1. 如何使用MSP430合理的设计硬件和软件,使整个应用最大限度的达到低功耗?   2. 如何测量MSP430的功耗?   就如何测量MSP430功耗,我来分享一下我个人的经验。    一、未使用的GPIO的处理   为了使MSP430最大限度的达到低功耗,对于MSP430未使用的GPIO而言,应该将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。
[模拟电子]
<font color='red'>MSP430</font>关键硬件电路设计要诀
MSP430--时钟模块
1.时钟:用低频晶体和含有倍频器的振荡器可以满足时钟系统速度与低功耗这两个要求。 2.基础时钟模块有三个时钟输入源: LTXTICLK,低频时钟源(32768HZ) XT2CLK,高频时钟源 DCOCLK,数字控制RC振荡器 这些模块可提供三种时钟信号: ACLK辅助系统时钟:由LFXTICLK经分频得到的。一般用于低速外设,可以用软件选择各个外围模块的时钟信号。 MCLK系统主时钟:主要用于CPU和系统。可由上述三种任意来源提供。 SMCLK子系统时钟:可选择LTXICLK+DCOCLK,或者XT2CLK+DCOCLK,主要用于高速外围模块。 3.低频晶体振荡器默认工作在低频模式,
[单片机]
<font color='red'>MSP430</font>--时钟模块
基于STM32的甲醛浓度检测报警proteus仿真设计
仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0083 1.主要功能 功能说明: 1、以STM32单片机和控制核心设计甲醛浓度检测报警设计; 2、通过液晶屏LCD1602和串口上位机显示甲醛浓度,MV表示检测值,ALM表示报警值; 3、可以通过按键设置甲醛浓度ALM报警值大小。 4、监测甲醛浓度大于报警值时蜂鸣器报警电路导通,蜂鸣器报警。 5、默认监测到甲醛浓度高于0.100mg/m3蜂鸣器报警。 主要硬件设备:STM32F103单片机 资料下载链接: https://docs.qq.com/doc/DS0FkcGdVRlFGcVhN 以下为本设计资料展示: 2.仿真设计 本实验利用ST
[单片机]
基于STM32的甲醛浓度检测报警<font color='red'>proteus</font>仿真设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved