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

cwbandyifei 2012-09-03 02:25:07
#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);
SCLL;
delay_us(1);
SDAH;
return val;
}
char WriteByte(unsigned char value)//从高位开始发送
{
unsigned char i,error=0;
for(i=0x80;0<i;i/=2)
{
if(i&value)
SDAH;
else
SDAL;
SCLH;
delay_us(1);
SCLL;
}
SDAH;//release DATA-line
SCLH;//clk #9 for ack
delay_us(1);
ReadState();
error=DATA();//DATA在第9个上升沿将被SHT10自动下拉为低电平
WriteState();
delay_us(1);
SCLL;
SDAH;//release DATA-line
return error;
}
char Measure(unsigned char *pCheckSum,unsigned char mode)
{
unsigned char error=0;
TransStart();
switch(mode)
{
case 0:
error+=WriteByte(MEASURE_TEMP);
break;
case 1:
error+=WriteByte(MEASURE_HUMI);
break;
default:
break;
}
ReadState();
delay_us(320000);//320ms等待数据准备好
if(DATA())// 或超时 (约2 sec.)
error+=1;
WriteState();
t[0]=ReadByte(noACK);
t[1]=ReadByte(noACK);
*pCheckSum=ReadByte(noACK);
return error;
}

int main()
{
unsigned char temp;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
delay_init(72);
delay_us(11000);
ConnectionReset();
while(1)
{
ConnectionReset();
delay_us(500000);
Measure(&temp,0);
Temperature=(unsigned char)(((t[0]<<8)+t[1])*0.01-40);//计算温度,这里只是实现了温度
USART_SendData(USART1,Temperature);//没问题,能成功传送Temperature的函数

}
}

void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;

/* 复位系统时钟设置*/
RCC_DeInit();
/* 开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE起振并稳定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置FLASH延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能FLASH预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择SYSCLK时钟源为PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待PLL成为SYSCLK时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}

/* 开启USART1和GPIOA时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
}



/*******************************************************************************
* 函数名 : GPIO_Configuration
* 函数描述 : 设置各GPIO端口功能
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/

void GPIO_Configuration(void)
{
/* 定义GPIO初始化结构体 GPIO_InitStructure */
GPIO_InitTypeDef GPIO_InitStructure;

/* 设置USART1的Tx脚(PA.9)为第二功能推挽输出功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);

/* 设置USART1的Rx脚(PA.10)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}



/*******************************************************************************
* 函数名 : USART_Configuration
* 函数描述 : 设置USART1
* 输入参数 : None
* 输出结果 : None
* 返回值 : None
*******************************************************************************/

void USART_Configuration(void)
{
/* 定义USART初始化结构体 USART_InitStructure */
USART_InitTypeDef USART_InitStructure;
/* 定义USART初始化结构体 USART_ClockInitStructure */
USART_ClockInitTypeDef USART_ClockInitStructure;

/* 波特率为115200bps;
* 8位数据长度;
* 1个停止位,无校验;
* 禁用硬件流控制;
* 禁止USART时钟;
* 时钟极性低;
* 在第2个边沿捕获数据
* 最后一位数据的时钟脉冲不从 SCLK 输出;
*/

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1 , &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate =57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode =USART_Mode_Tx;
USART_Init(USART1 , &USART_InitStructure);

/* 使能USART1 */
USART_Cmd(USART1 , ENABLE);
}

传感器sht10的data连接到PB-11,scl连接到PB-10,串口助手总显示67,请教大神错误出在哪里。谢谢!


...全文
903 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
琵琶破东风 2013-10-23
  • 打赏
  • 举报
回复
貌似原来也遇见过这种问题,好像把波特率降低点应该可以。
fanli520807 2013-10-20
  • 打赏
  • 举报
回复
楼主 您这个问题解决了吗

27,507

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧