⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo8901_c.c

📁 此测试软件为ITU总线温湿度测试程序,基于LTM8901温湿度模块,可以组成一线温湿度环境检测,和DALLS的一线总线相仿
💻 C
字号:

//-----北京长英公司 LTM8901 ITU  KEIL C51 例程    2002.12.31

//-----本例程使用 12MHZ 晶振,51系列CPU--P1.1口,P1.1口上拉 1K 电阻至 5V.
//-----ITU 为LTM8901(温湿一体传感器),地址为: 05H. 

//-----本例程在南京伟福仿真器 ICExplorer 调试通过。针对不同品牌的仿真器,
//-----例程中所有延时部分的循环值可能需要作些调整,但延时时间长度需要满
//-----足相应的注释说明。

#include <intrins.h>
#include <reg51.h>

sbit   itu_dq = P1^1;           //---ITU 端口;
bit    has_itu = 0;            	//---ITU 存在标志, = 1 存在; = 0 不存在;

char idata ITU_BUF[4];  	//---ITU 数据缓冲区(4字节:TYPE-DATAL-DATAH-CHECKSUM);
char idata HUM_BUF[4];          //---湿度数据缓冲区;
char idata TEMP_BUF[4];         //---温度数据缓冲区;

unsigned char mask[8] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delay_5ms(void);           	//---延时 5MS 子程序;
void delay_1000(void);			//---延时 1 S 子程序;
void write_bit0(void);			//---写 BIT 0 子程序;
void write_bit1(void);			//---写 BIT 1 子程序;
void start_itu(void);			//---启动 ITU 转换及检测是否存在 ITU 子程序;
void write_byte(unsigned char da);	//---写BYTE(字节)子程序;
void read_4bytes(void);			//---读 4 个 BYTE(字节)子程序;

   //----主程序
   main(){
        char i;

        has_itu = 0;
	itu_dq  = 1;		//---初始化ITU总线,设为高电平;

        start_itu();		//---启动 ITU 转换及检测是否存在ITU;

        if(has_itu == 1)	//---存在ITU
        {
           delay_1000();	//---延时 1S ,等待 LTM8901 转换完毕; 

           //----连续发 3 字节数据读取命令(ADDR-COMMAND-CHECKSUM),
	   //----启动命令发送后第一次读到的是湿度数据
	
           write_byte(0x05);
           write_byte(0x00);
           write_byte(0x05);

	   //----立刻转入读取ITU数据部分	
           read_4bytes();  	//----读取ITU数据(4字节连续读);

           for(i=0;i<4;i++) HUM_BUF[i] = ITU_BUF[i];	//---数据转存
        
           delay_5ms();		//---延时 5 ms;
        
           //----连续发 3 字节数据读取命令(ADDR-COMMAND-CHECKSUM),
	   //----启动命令发送后第二次读到的是温度数据
	   //----当用户不确定次序时,需根据读到的 DATAH 数据高三位来判断
	   //----是温度数据还是湿度数据.	
           write_byte(0x05);
           write_byte(0x00);
           write_byte(0x05);

           read_4bytes();  	//----读取ITU数据(4字节连续读);

           for(i=0;i<4;i++) TEMP_BUF[i] = ITU_BUF[i];   //---数据转存     
        }
   }


void delay_5ms(void)
{
  char i,j;
  
  for(j=0;j<2;j++)        //---延时 2 * 2.5 = 5 ms
  {
      for(i=0;i<250;i++); //---延时 2.5 ms
  }
}


void delay_1000(void)
{
  unsigned char i,j,k;

  for(k=0;k<4;k++)         //---延时 4 * 250 = 1000 ms
  {
     for(j=0;j<100;j++)    //---延时 2.5 * 100 = 250 ms
     {
        for(i=0;i<250;i++); //---延时 2.5 ms
     }
  }
}


void read_4bytes(void)
{
 unsigned char dd=0x00;
 char i,j,k;

 for(i=0;i<4;i++)   //---4 字节循环
 {
    dd = 0;
    for(j=0;j<8;j++) //--- 1 字节 8 位(BIT) 循环
    {
       while(1)
       {
          if(itu_dq == 0) break;        //----检测到下降沿,退出检测循环!
       }

       for(k=0;k<5;k++);		//----延时 40 - 50 us

       if(itu_dq == 1) dd = dd | mask[j];  //---读取 ITU 总线状态并保存 

       for(k=0;k<2;k++);	       //----延时 20 - 30 us
    }

    ITU_BUF[i] = dd;		       //----保存 1 字节	
 }
}

void write_byte(unsigned char da)
{
  char i;

  for(i=0;i<8;i++)
  {
     if((da & mask[i]) == mask[i])
            write_bit1();
     else   write_bit0();
  }
  for(i=0;i<10;i++);    //---延时 < 100 us
}

void write_bit0(void)
{
 char i;

 itu_dq = 0;
 for(i=0;i<6;i++); //---延时 60-70 us
 itu_dq = 1;
 for(i=0;i<3;i++); //---延时 30-40 us
}


void write_bit1(void)
{
 char i;

 itu_dq = 0;
 for(i=0;i<2;i++); //---延时 20-30 us
 itu_dq = 1;
 for(i=0;i<7;i++); //---延时 70-80 us 
}

void start_itu(void)
{
 char i;

 itu_dq = 0;
 for(i=0;i<32;i++); //---延时 250-350 us
 itu_dq = 1;

 for(i=0;i<9;i++); //---delay 80-90us

 if(itu_dq == 0)	//---测试是否有ITU应答负脉冲?	
 {
        has_itu = 1;
  }
  else
  {
     has_itu = 0;
  }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -