当前位置: 代码迷 >> 单片机 >> 用stm32统制sht10,将测量的温度显示到串口助手
  详细解决方案

用stm32统制sht10,将测量的温度显示到串口助手

热度:52   发布时间:2016-04-28 15:02:41.0
用stm32控制sht10,将测量的温度显示到串口助手
#include<stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"


#define noACK 0 //用于判断是否结束SHT10通讯
#define ACK 1 //结束数据传输 
#define STATUS_REG_W 0x06 // 0  写状态寄存器
#define STATUS_REG_R 0x07 // 1  读状态寄存器
#define MEASURE_TEMP 0x03 // 1  温度测量
#define MEASURE_HUMI 0x05 // 1  湿度测量
#define RESET 0x1E        // 0  复位
#define SCLL GPIOB->ODR&=~(1<<11)//时钟线输出低电平..........................
#define SCLH GPIOB->ODR|=1<<11//时钟线输出低电平
#define SDAL GPIOB->ODR&=~(1<<12)//数据线输出低电平
#define SDAH GPIOB->ODR|=1<<12//数据线输出高电平
#define ReadState() {GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00008000; GPIOB->ODR&=~(1<<11);}//数据线改为读
#define WriteState() {GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00003000;}//数据线改为写
#define DATA() (GPIOB->IDR>>11)&1//读出数据线数据
//enum{TEMP,HUMI};//温度和湿度
unsigned int Temperature,Humidity;
u8 t[2];//读取的两个字节,用于保存温度或湿度

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

//启动传输
//       _____         ________ 
// DATA:      |_______| 
//           ___     ___ 
// SCK : ___|   |___|   |______ 
void TransStart()
{
     SDAH;
     SCLL;
     delay_us(1);
     SCLH;
     delay_us(1);
     SDAL;
     delay_us(1);
     SCLL;
     delay_us(1);
     SCLH;
     delay_us(1);
     SDAH;
     delay_us(1);
     SCLL;
     delay_us(1);
}
// 通讯复位: DATA-line=1 and at least 9 SCK cycles followed by transstart 
//       _____________________________________________________         ________ 
// DATA:                                                      |_______| 
//          _    _    _    _    _    _    _    _    _        ___     ___ 
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______ 
void ConnectionReset()
{
     unsigned char i;
     SDAH;
     SCLL;
     delay_us(1);
     for(i=0;i<9;i++)
     {
          SCLH;
          delay_us(1);
          SCLL;
          delay_us(1);
     }
     TransStart();
}
char ReadByte(unsigned char ack)//读取温度或湿度
{
       unsigned char i,val=0;
       SDAH;
       ReadState();
       for(i=0x80;0<i;i/=2)//先读取的是高位
       {
            SCLH;
            delay_us(1);
            if(DATA())
             val=(val|i);
            delay_us(1);
            SCLL; 
            delay_us(1);
       }
       WriteState();
       if(ack==1)//发送确认
        SDAL;
       else//不确认
        SDAH;
       delay_us(1);
       SCLH;
       delay_us(1);