打印
[STM8]

STM8驱动TN9的问题

[复制链接]
303|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用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单片机开发板可以正常显示温度。
请高手指教,谢谢!

使用特权

评论回复
沙发
朝生| | 2022-10-4 12:19 | 只看该作者
时许图抓了吗?

使用特权

评论回复
板凳
朝生| | 2022-10-4 12:20 | 只看该作者
优先推荐抓通信图,这样容易找到问题。

使用特权

评论回复
地板
比神乐|  楼主 | 2022-10-5 03:29 | 只看该作者
朝生 发表于 2022-10-4 12:19
时许图抓了吗?

没法抓,没有示波器,我现在在家养病

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

436

主题

3415

帖子

7

粉丝