微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于SHT71数字温湿度传感器的采集实现

基于SHT71数字温湿度传感器的采集实现

时间:10-02 整理:3721RD 点击:

//头文件
#include <reg52.h>
#include <intrins.h>
//测量命令
#define  TEMPERATURE    0x03
#define  HUMINITY       0x05
//定义SHT71与单片机的通信引脚
sbit SCL = P3^1;        //时钟线
sbit SDA = P3^2;        //数据线
//函数预定义
unsigned char MCU_receive_byte(void);
void Sent_command(unsigned char command);
void MCU_receive_word(void);
void SHT_ACK();
void SHT_end(void);
void SHT_ini(void);
void SHT_reset(void);
void SHT_start();
void SHT_measurement(unsigned char measure);
void UART_ini(void);
void USART_RX_interrupt(void);
void UART_Send_Byte(unsigned char Data);
void Delay(unsigned char time);
//
//------------------------------
//
//      主函数
//   
//------------------------------
//  
void main(void)
{   
     EA = 0;
     UART_ini();
     SHT_ini();
     EA = 1;
     for(;;)
     {
        Delay(10);                //延时0.75S
        SHT_measurement(TEMPERATURE);   //温度测量
        MCU_receive_word();
        Delay(10);
        SHT_measurement(HUMINITY);      //湿度测量
        MCU_receive_word();
     }
}
//
//------------------------------
//
//      SHT71初始化
//   
//------------------------------
//  
void SHT_ini(void)
{   
    SHT_reset();                  //SHT71软复位
    Delay(1);
}
//
//------------------------------
//
//      SHT71 复位
//   
//------------------------------
//  
void SHT_reset(void)
{
    unsigned char i;
     
    SDA = 1;
    SCL = 0;
   
    for (i=0;i<20 ;i++ )                //至少9个Clock
    {
        SCL = 1;
        _nop_();
        SCL = 0;
    }
}
//
//------------------------------
//
//      SHT71 启动一次测量
//   
//------------------------------
//  
void SHT_measurement(unsigned char measure)
{
     SHT_start();              //启动
     Sent_command(measure);             //发送命令
     SHT_ACK();                      //等待转换结束
     MCU_receive_word();                //接收测量结果
     SHT_end();                      //结束一次测量
}
//
//------------------------------
//
//      SHT71启动信号
//
//------------------------------
//
void SHT_start()
{   
     SCL = 0;
     SDA = 1;
     _nop_();
     _nop_();
     SCL = 1;
     _nop_();
     _nop_();
     SDA = 0;
     _nop_();
     _nop_();
     SCL = 0;
     _nop_();
     _nop_();
     SCL = 1;
     _nop_();
     _nop_();
     SDA = 1;
     _nop_();
     _nop_();
     SCL = 0;
}
//
//------------------------------
//
//      SHT71 控制命令发送
//      command =   0x03---温度
//                  0x05---湿度
//
//------------------------------
//  
void Sent_command(unsigned char command)
{
    unsigned char model = 0x80;
    unsigned char i;   
   
    for(i=0;i<7;i++)           
    {
        SCL = 0;
        if((command & model) == 0)
     {
            SDA = 0;
     }
        else
     {
            SDA = 1;
     }
        SCL = 1;
        model = model>>1;   
    }
   
    SCL = 0;
   
    if((command & model) == 0)
    {
        SDA = 0;
    }
    else
    {
        SDA = 1;
    }
   
    SCL = 1;
    _nop_();
    SCL = 0;   
   
    while(SDA == 1)
    {
    }
   
    SCL = 1;
    _nop_();
    SCL = 0;
    _nop_();
}   
//
//------------------------------
//
//      SHT71 等待应答信号
//
//------------------------------
//  
void SHT_ACK()
{   
    while(SDA == 1)
    {
    }
}
//
//------------------------------
//
//      SHT71 接收一个字节
//   
//------------------------------
//  
unsigned char MCU_receive_byte(void)
{   
    unsigned char i;
    unsigned char model = 0x00;
    unsigned char temp;
         
    SCL = 0;
    _nop_();
    for(i=0;i<8;i++)
    {
        SCL = 1;
        if(SDA == 0)
     {
            temp = 0;
     }
        else
     {
            temp = 1;
     }
     
        model = model|(temp<<(7-i));
        SCL = 0;
     }
     SDA = 0;    //
     _nop_();
     SCL = 1;
     _nop_();
     SCL = 0;
     return model;
}
//
//------------------------------
//
//      SHT71 结束一次测量
//   
//------------------------------
//  
void SHT_end(void)
{
     SCL = 0;
     SDA = 1;
}
//
//------------------------------
//
//      SHT71 接收结果
//   
//------------------------------
//  
void MCU_receive_word(void)
{
      unsigned char temp;
      temp = MCU_receive_byte();        //将测量结果通过串口发送
      UART_Send_Byte(temp);   
      temp = MCU_receive_byte();
      UART_Send_Byte(temp);
}
//-----------------------------
//
//      软件延时(非精确)
//
//-----------------------------
void Delay(unsigned char time)
{
    unsigned char i;
    unsigned int j;
   
    for (i = 0;i < time;i++)
    {
        for (j=0;j<30000;j++)
     {
     }
    }
}
//---------------------------------
//  
//  单片机晶振 22.1184MHZ
//  串行口初始化设置
//  方式1,8数据位,一个停止位,无奇偶校验
//  串口中断允许,波特率9600bps
//   
//------------------------------------
void UART_ini(void)
{
    SCON = 0x50;        //方式1,波特率可变,8bits,接受允许
    PCON&= 0x7F;        //SMOD = 0                           
    TMOD |= 0x20;       //timer1 mode 2                     
   
    TL1 = 0xfa;         //|              f               
                        //| 波特率=----------------------   
    TH1 = 0xfa;         //|         32*2^smod*12*(256-TL1)   
    TCON |= 0x40;       //start                              
                                                                                                                    
    TI = 0;                                             
}
//---------------------------------------------------------------
//
//      串口发送单字节程序
//
//----------------------------------------------------------------
void UART_Send_Byte(unsigned char Data)
{         
    SBUF = Data;
    while (TI == 0)                 //等待发送完毕
    {
    }
    TI = 0;
}
//---------------------------------------------------------------
//
//      串口中断服务程序
//
//      ----只有接收使用   
//
//----------------------------------------------------------------
void RX_INT(void) interrupt 4 using 3
{
    if (RI==1)
    {
        do
     {
            RI = 0;
     }
        while (RI != 0);
        //未指定
    }
    else
    {
    }
}

小编还是分享整个程序的文件夹吧,这样看的有点不习惯

我谢小编提供宝贵资料分享.

这个可以下载下来看看

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top