本帖最后由 芯圣电子官方QQ 于 2023-7-20 09:30 编辑
今天搞了一下TN9模块,测量体温的。
ACK接P3.6,CLOCK接P3.4,DATA接P3.2.
代码:
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"
#define uchar unsigned char
#define uint unsigned int
/** @addtogroup 425_GPIO_led_toggle GPIO_led_toggle
* @{
*/
void ACK_0() { P3_6=0;}
void ACK_1() { P3_6=1;}
#define DATA P3_2
#define CLOCK P3_4
float Temp;
float Temp1,Temp2;
unsigned char ReadData[5];
//float a,b;
//-----------------------------------------------------------------------------------------
//????:Delay()
//? ?:?????
//-----------------------------------------------------------------------------------------
void Delay(unsigned char us) //5,7,9
{
uchar i;
while(--us)
{
for(i=0;i<10;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);
}
}
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)
{
//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;
}
/***************************************************************************************
* @实现效果 设置各个IO口的工作状态
***************************************************************************************/
void main(void)
{
/********************************系统初始化*******************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKCON = 0x02; //选择内部高频RC为系统时钟, Fosc=32MHz
CLKDIV = 0x02; //Fosc 2分频得到Fcpu,Fcpu=16MHz
/***********************************设置IO口模式***************************************/
P3M1 = 0xF0; //带上拉输入(无SMT)
P3M2 = 0xF0; //带上拉输入(无SMT)
P3M3 = 0xF8; //P34设置为推挽输出
while(1)
{
Temp1=TN_GetTemp(0);
Temp2=TN_GetTemp(1);
Delayms(500);
}
}
效果图:
上面显示的是体温,下面显示的是环境温度。
|