接口
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "stdio.h"
#define TN905_CLK_H() GPIOB->ODR|=1<<13
#define TN905_DOUT_H() GPIOB->ODR|=1<<14
#define TN905_TEST_H() GPIOB->ODR|=1<<1
#define TN905_CLK_L() GPIOB->ODR&= ~(1<<13)
#define TN905_DOUT_L() GPIOB->ODR&= ~(1<<14)
#define TN905_TEST_L() GPIOB->ODR&= ~(1<<1)
#define TN905_DOUT_IN() (GPIOB->IDR&(1<<14))
#define TN905_CLK_IN() (GPIOB->IDR&(1<<13))
void tn905_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL&=0Xffffff0f;
GPIOB->CRL|=0X00000030; //PB1 out
TN905_TEST_L();
// GPIOB->CRH&=0XFF0FFFFF;
// GPIOB->CRH|=0X00300000; //PB13
GPIOB->ODR|=3<<13; //PB13/14/15上拉 clk miso mosi
}
unsigned char tn905_GetByte(void)
{
unsigned char tmp = 0,i = 0;
for( i = 0; i < 8; i++)
{
tmp <<= 1;
//TN905_CLK_L();
//delay_us(250);
while(TN905_CLK_IN() != 0);
if(TN905_DOUT_IN() > 0)
tmp++;
while(TN905_CLK_IN() == 0);
//TN905_CLK_H();
//delay_us(250);
}
// printf("%x ",tmp);
return tmp;
}
float tn905_Get_temperature(void)
{
float t = 0.0;
unsigned char tmp[5] = {
0},sum;
tmp[0] = tn905_GetByte();
tmp[1] = tn905_GetByte();
tmp[2] = tn905_GetByte();
tmp[3] = tn905_GetByte();
tmp[4] = tn905_GetByte();
printf("%x %x %x %x %x\r\n",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4]);
//校验
sum = tmp[0]+ tmp[1] + tmp[2];
// printf("sum %x\r\n",sum);
if(tmp[3] != sum)
return 0;
//判断结尾
if(tmp[4] != 0x0d)
return 0;
//计算温度
t = tmp[1] * 256 + tmp[2];
t /= 16;
t = t - 273.5;
if(tmp[0] == 'L')
return t;
else
return 0;
}
int main(void)
{
float t = 0.0;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,115200); //串口初始化为9600
delay_init(72); //延时初始化
// LED_Init(); //初始化与LED连接的硬件接口
tn905_Init();
mlx_90164_init();
printf("初始化完成\r\n");
while(1)
{
TN905_TEST_H();
delay_ms(10);
TN905_TEST_L();
delay_ms(10);
t = tn905_Get_temperature();
printf("温度:%.1f\r\n",t);
delay_ms(100);
}
}