今晚写了个TN9的读取程序,开发环境是IAR。
代码:
/******************************************************************************
* Include files
******************************************************************************/
#include "gpio.h"
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
typedef unsigned char uchar;
void ACK_0() { Gpio_ClrIO(GpioPortB, GpioPin8);} //
void ACK_1() { Gpio_SetIO(GpioPortB, GpioPin8);}
#define DATA Gpio_GetInputIO(GpioPortC, GpioPin10)
#define CLOCK Gpio_GetInputIO(GpioPortC, GpioPin12)
float Temp;
float Temp1,Temp2;
unsigned char ReadData[5];
unsigned int a,b;
//-----------------------------------------------------------------------------------------
//函数名称:Delay()
//功 能:延时子程序
//-----------------------------------------------------------------------------------------
void Delay(unsigned char us) //5,7,9
{
while(--us);
}
//-----------------------------------------------------------------------------------------
//函数名称:Delayms()
//-----------------------------------------------------------------------------------------
void Delayms(unsigned int ims)
{
unsigned int i,j;
for(i=0;i<ims;i++)
for(j=0;j<65;j++) { Delay(1); }
}
void InitIO(void)
{
stc_gpio_config_t pstcGpioCfg;
//stc_gpio_config_t stcGpioCfg;
///< 打开GPIO外设时钟门控
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
///< 端口方向配置->输出
pstcGpioCfg.enDir = GpioDirOut;
///< 端口驱动能力配置->高驱动能力
pstcGpioCfg.enDrv = GpioDrvH;
///< 端口上下拉配置->无上下拉
pstcGpioCfg.enPuPd = GpioNoPuPd;
///< 端口开漏输出配置->开漏输出关闭
pstcGpioCfg.enOD = GpioOdDisable;
///< 端口输入/输出值寄存器总线控制模式配置->AHB
pstcGpioCfg.enCtrlMode = GpioAHB;
///< GPIO IO PD05初始化(PD05在STK上外接LED)
Gpio_Init(GpioPortD, GpioPin5, &pstcGpioCfg);
Gpio_Init(GpioPortB, GpioPin8, &pstcGpioCfg);
///< 端口方向配置->输入
pstcGpioCfg.enDir = GpioDirIn;
///< 端口驱动能力配置->高驱动能力
pstcGpioCfg.enDrv = GpioDrvL;
///< 端口上下拉配置->上拉
pstcGpioCfg.enPuPd = GpioPu;
///< 端口开漏输出配置->开漏输出关闭
pstcGpioCfg.enOD = GpioOdDisable;
///< 端口输入/输出值寄存器总线控制模式配置->AHB
pstcGpioCfg.enCtrlMode = GpioAHB;
///< GPIO IO PD04初始化(PD04在STK上外接KEY(USER))
Gpio_Init(GpioPortC, GpioPin10, &pstcGpioCfg);
Gpio_Init(GpioPortC, GpioPin12, &pstcGpioCfg);
}
void TN_IRACK_EN(void)
{
ACK_0();
Delay(1);
}
void TN_IRACK_UN(void)
{
ACK_1();
Delay(1);
}
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++)
{
while(1)
{
if(CLOCK==0)
break;
Delay(1);
}
Delay(1);
if(DATA==1)
BitState=1;
else
BitState=0;
ReadData[j]= ReadData[j]<<1;
ReadData[j]= ReadData[j]|BitState;
Delay(1);
while(1)
{
if(CLOCK==1)
break;
Delay(1);
}
}
}
if(ReadData[0]==Flag)
k=8;
}
TN_IRACK_UN();
}
float TN_GetData(unsigned char X)
{
//Ack_Clk_Data_init;
InitIO();
TN_ReadData(X);
Temp=(ReadData[1]<<8)|ReadData[2];
Temp=(float)Temp/16.00-273.15;
return Temp;
}
float TN_GetTemp(unsigned char mode)
{
float T;
{
TN_IRACK_UN();
TN_IRACK_EN();
if(mode==0)
{
T=TN_GetData(0x4c);
}
else
{
T=TN_GetData(0x66);
}
}
return T;
}
/**
******************************************************************************
** \brief Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/
int32_t main(void)
{
InitIO();
while(1)
{
Temp1=TN_GetTemp(0);
Temp2=TN_GetTemp(1);
a=((unsigned int)(Temp1*10));
b=((unsigned int)(Temp2*10));
Delayms(1500);
}
}
效果图:
图中289表示28.9度,290表示29度。
a是体温,b是环境温度。
其中Data脚接PC10,Clock接PC12。有个问题不明白,一开始Data脚接PB5,Clock接PB7则读取不对。
有高手知道,望告知。谢谢!
|