我用STM8开发板驱动红外温度模块TN9,温度老是不对。
代码如下:
#include "pbdata.h"
#define uchar unsigned char
#define uint unsigned int
void BSP_Configuration(void);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void ACK_0() { GPIO_WriteLow(GPIOI,GPIO_PIN_2);} //
void ACK_1() { GPIO_WriteHigh(GPIOI,GPIO_PIN_2);}
#define DATA GPIO_ReadInputPin(GPIOI,GPIO_PIN_0)
#define CLOCK GPIO_ReadInputPin(GPIOI,GPIO_PIN_1)
float Temp;
float Temp1,Temp2;
unsigned char ReadData[5];
void Delay(unsigned char us) //5,7,9
{
int i;
while(--us)
{
for(i=0;i<50;i++);
}
}
//-----------------------------------------------------------------------------------------
//????:Delayms()
//-----------------------------------------------------------------------------------------
void Delayms(unsigned int ims)
{
unsigned int i,j;
for(i=0;i<ims;i++)
for(j=0;j<65;j++)
{
Delay(1);
}
}
//=====================================================================
// C格式: void TN_IRACK_EN(void);
// 实现功能: 红外模块启动函数
// 入口参数: 无
// 出口参数: 无
//=====================================================================
void TN_IRACK_EN(void)
{
ACK_0();
Delay(10);
}
//=====================================================================
// C格式: void TN_IRACK_UN(void);
// 实现功能: 红外模块关闭函数
// 入口参数: 无
// 出口参数: 无
//=====================================================================
void TN_IRACK_UN(void)
{
ACK_1();
Delay(10);
}
//======================================================================
// C格式: int TN_ReadData(void);
// 实现功能: 读测得数据
//=====================================================================
void TN_ReadData(unsigned char Flag)
{
unsigned char i,j,k,BitState=0;
for(k=0;k<7;k++)
{
for(j=0;j<5;j++)
{
for(i=0;i<8;i++)
{
//Clk=1;
while(CLOCK)
{
//Clk=1;
}
//Data=1;
Delay(10);
BitState=DATA;
Delay(10);
ReadData[j]= ReadData[j]<<1;
ReadData[j]= ReadData[j]|BitState;
//Clk=1;
while(!CLOCK)
{
//Clk=1;
}
}
}
if(ReadData[0]==Flag)
k=8;
}
TN_IRACK_UN();
}
//======================================================================//
//Program:TN红外传感器目标数据测量子程序
//InPut:NULL
//OutPut:unsigned int returnData 测量结果的出错标识
//======================================================================//
float TN_GetData(unsigned char X)
{
//Ack_Clk_Data_init;
TN_ReadData(X);
Temp=(ReadData[1]<<8)|ReadData[2];
Temp=(float)Temp/16.00-273.15;
return Temp;
}
//=====================================================================
// C格式: float TN_GetTemp(unsigned char mode);
// 实现功能: 返回温度值
// 入口参数: mode 0:目标温度 1:环境温度
// 出口参数: 返回对应模式温度
//=====================================================================
float TN_GetTemp(unsigned char mode)
{
//int i=6,j;
//float Temp[6]={0.0};
float T;
//while(i)
{
TN_IRACK_UN();
TN_IRACK_EN();
if(mode==0)
{
T=TN_GetData(0x4c);
/* if((T>-33)&&(T<220))
{
i--;
Temp[i]=T;
}*/
}
else
{
T=TN_GetData(0x66);
/*if((T>-10)&&(T<50))
{
i--;
Temp[i]=T;
}*/
}
}
/*for(i=0;i<5;i++)
{
for(j=0;j<(5-i);j++)
{
if(Temp[i]>Temp[j+1])
{
T=Temp[j+1];
Temp[j+1]=Temp[i];
Temp[i]=T;
}
}
}*/
//T=(Temp[2]+Temp[3])/2;
return T;
}
void TN9_Init(void)
{
GPIO_Init(GPIOI,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW );//慢速开漏输出高阻态
GPIO_Init(GPIOI,GPIO_PIN_0,GPIO_MODE_IN_FL_NO_IT );//慢速开漏输出高阻态
GPIO_Init(GPIOI,GPIO_PIN_1,GPIO_MODE_IN_FL_NO_IT );//慢速开漏输出高阻态
}
/*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参:无
* 返 回 值: 错误代码(无需处理)
**********************************************************************************************************/
int main(void)
{
BSP_Configuration();//初始化硬件
while(1)
{
Temp1=TN_GetTemp(0);
Temp2=TN_GetTemp(1);
Delayms(500);
}
}
/**********************************************************************************************************
* 函 数 名: BSP_Configuration
* 功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
* 形 参:无
* 返 回 值: 无
**********************************************************************************************************/
void BSP_Configuration(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //配置内部高速振荡器(HSI)的分频器--1分频
TN9_Init();
//__enable_interrupt();//中断使能
//LED_Init();//LED GPIO 管脚初始化
//KEY_Init();//键盘控制 GPIO 管脚初始化
}
void assert_failed(u8* file, u32 line) //是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
{
while (1)
{
}
}
调试温度图片如下:
温度显然不对。
另外,用STC单片机开发板可以正常显示温度。
请高手指教,谢谢!
|