📄 demo8901_c.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 + -