MLX90614和STC12C5604AD通讯.docx

上传人:b****6 文档编号:7513510 上传时间:2023-01-24 格式:DOCX 页数:43 大小:29.76KB
下载 相关 举报
MLX90614和STC12C5604AD通讯.docx_第1页
第1页 / 共43页
MLX90614和STC12C5604AD通讯.docx_第2页
第2页 / 共43页
MLX90614和STC12C5604AD通讯.docx_第3页
第3页 / 共43页
MLX90614和STC12C5604AD通讯.docx_第4页
第4页 / 共43页
MLX90614和STC12C5604AD通讯.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

MLX90614和STC12C5604AD通讯.docx

《MLX90614和STC12C5604AD通讯.docx》由会员分享,可在线阅读,更多相关《MLX90614和STC12C5604AD通讯.docx(43页珍藏版)》请在冰豆网上搜索。

MLX90614和STC12C5604AD通讯.docx

MLX90614和STC12C5604AD通讯

1目的

该文档的主要目的是描述怎样实现单片机和红外温度计MLX90614的SMBus通信,并简略介绍利用单片机对MLX90614的PWM输出脉冲进行测量并计算相关温度。

代码是基于STC12C5604AD单片机的。

实例给出了由C语言实现MLX90614读取物体温度,写入数据到MLX90614、以及对PWM脉冲的测量和计算等功能。

2C代码

由MLX90614读取温度部分

实例给出了应用C语言来实现从MLX90614中读取物体温度的程序。

为了使程序操作和运行简单起见,整个项目被分为几个子项目。

在该文档中整个C程序分为主文件SMBus.c(用来实现对物体温度的读取、改变SMBus地址、改变发射率、以及改变PWMCTRL配置参数功能);子文件SMBus_CM.c(具体描述SMBus通信的起始状态,终止状态,发送和接受数据);子文件SMBus_OP.c(包含了利用SMBus通信由MLX90614读取数据,对MLX90614写入数据和PEC校验码计算的程序);子文件Delay.c(调用延迟函数);子文件dec2hex.c(将十进制转换为十六进制);子文件CalTem.c(根据十六进制数值计算温度读数);子文件digitalLED.c(在数字LEDs上显示温度读数)。

在主文件的头文件中引用相应的子文件.h文件,以将所有功能综合、链接起来。

//----------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------------------------------------------------------------------------------------------------------//

主文件SMBus.c

//----------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------------------------------------------------------------------------------------------------------//

红外温度计—MLX90614中读取物体温度

描述:

该文件是基于单片机STC12C5604AD编写的C语言程序,可通过SMBus实现对MLX90614温度数据的读取,对MLX90614写入数据的功能。

实例给出了读取物体温度的程序,以及可根据十六进制数值计算温度数值并在数字LEDs上显示温度的程序,但是此为可选项,用户可根据自己的应用另行选择其他方式。

//----------------------------------------------------------------------------------------------------------------------------------------//

头文件

//----------------------------------------------------------------------------------------------------------------------------------------//

#include

#include"stdio.h"

#include"intrins.h"

#include"string.h"

#include"SMBus_CM.h"//引用SMBus_CM.h文件(包含起始状态,终止状态,发送,接收字节等)

#include"SMBus_OP.h"//引用SMBus_OP.h文件(包含由MLX90614中读取数据和写入数据)

#include"digitalLED.h"//引用digitalLED.h文件以在数字LEDs上显示温度读数

#include"CalTem.h"//引用CalTem.h文件来根据十六进制数值计算温度

#include"dec2hex.h"//引用dec2hex.h文件将十进制转换为十六进制

#include"Delay.h"//引用Delay.h文件

//----------------------------------------------------------------------------------------------------------------------------------------//

宏定义I/O端口和SMBus信号输入输出方向

//----------------------------------------------------------------------------------------------------------------------------------------//

#define_SDA_OUTPUTP1M0=0x10;P1M1=0x10;//设置SDA为开漏输出

#define_SDA_INPUTP1M0=0x10;P1M1=0x00;//设置SDA为高阻输入

#define_SCL_IOP1M0=0x08;P1M1=0x08;//设置SCL为开漏输出的I/O端口

sbitSDA=P1^4;//指定SDA线给P14

sbitSCL=P1^3;//指定SCL线给P13

//----------------------------------------------------------------------------------------------------------------------------------------//

主函数功能

作用:

读取物体温度

//----------------------------------------------------------------------------------------------------------------------------------------//

voidmain()

{

unsignedcharslaveaddress;

unsignedlongintDATA;

unsignedint*mahm;

_SCL_IO;//引用宏定义-设置SCL为开漏式I/O口

_SDA_OUTPUT;//引用宏定义-设置SDA为开漏式输出

SCL=0;//

Delay(1200);//SMBus请求时间,将PWM模式转换为SMBus模式(至少为2ms)

SCL=1;//

while

(1)

{

slaveaddress=MEM_READ(0x00,0x2E);

//读取存于MLX90614EEPROM"0Eh"地址中的SMBus地址

DATA=MEM_READ(slaveaddress,0x07);

//基于上述地址由MLX90614的内存07h中读取物体温度

mahm=CALTEMP(DATA);

//基于所得的十六进制温度格式计算实际温度

show(mahm,5);

//在数字LEDs上显示计算所得温度

}

}

//----------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------------------------------------------------------------------------------------------------------//

子文件SMBus_CM.c

//----------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------------------------------------------------------------------------------------------------------//

该文档包含了SMBus通信的起始状态,终止状态,发送和接受字节等

//----------------------------------------------------------------------------------------------------------------------------------------//

头文件

//----------------------------------------------------------------------------------------------------------------------------------------//

#include

#include"SMBus_CM.h"//头文件中引用本身

#include"intrins.h"

#include"Delay.h"

//----------------------------------------------------------------------------------------------------------------------------------------//

宏定义I/O端口和SMBus信号的方向

//----------------------------------------------------------------------------------------------------------------------------------------//

#define_SDA_OUTPUTP1M0=0x10;P1M1=0x10;//设置SDA为开漏输出

#define_SDA_INPUTP1M0=0x10;P1M1=0x00;//设置SDA为高阻输入

#define_SCL_IOP1M0=0x08;P1M1=0x08;//设置SCL为开漏式I/O端口

sbitSDA=P1^4;//指定SDA线给P14

sbitSCL=P1^3;//指定SCL线给P13

//----------------------------------------------------------------------------------------------------------------------------------------//

函数名:

start_bit

功能:

在SMBus总线上产生起始状态

注解:

参考“系统管理总线说明书-版本2.0”

//----------------------------------------------------------------------------------------------------------------------------------------//

voidstart_bit()

{

_SDA_OUTPUT;//设置SDA为输出

SDA=1;//设置SDA线为高电平

_nop_();_nop_();

SCL=1;//设置SCL线为高电平

Delay(5);//在终止和起始状态之间产生总线空闲时间(Tbuf=4.7us最小值)

SDA=0;//设置SDA线为低电平

Delay(5);

//(重复)开始状态后的保持时间,在该时间后,产生第一个时钟信号

//Thd:

sta=4us最小值

SCL=0;//设置SCL线为低电平

_nop_();_nop_();

}

//----------------------------------------------------------------------------------------------------------------------------------------//

函数名:

stop_bit

功能:

在SMBus总线上产生终止状态

注解:

参考“系统管理总线说明书-版本2.0”

//----------------------------------------------------------------------------------------------------------------------------------------//

voidstop_bit()

{

_SDA_OUTPUT;//设置SDA为输出

SCL=0;//设置SCL线为低电平

Delay(5);

SDA=0;//设置SDA线为低电平

Delay(5);

SCL=1;//设置SCL线为高电平

Delay(5);//终止状态建立时间(Tsu:

sto=4.0us最小值)

SDA=1;//设置SDA线为高电平

}

//----------------------------------------------------------------------------------------------------------------------------------------//

函数名:

send_bit

功能:

在SMBus总线上发送一位数据

//----------------------------------------------------------------------------------------------------------------------------------------//

voidsend_bit(unsignedcharbit_out)

{

_SDA_OUTPUT;//设置SDA为开漏输出以在总线上传送数据

if(bit_out==0)//核对字节的位

//如果bit_out=1,设置SDA线为高电平

SDA=0;

else

SDA=1;//如果bit_out=0,设置SDA线为低电平

_nop_();//

_nop_();//Tsu:

dat=250ns最小值

_nop_();//

SCL=1;//设置SCL线为高电平

Delay(4);//时钟脉冲高电平脉宽(10.6us)

SCL=0;//设置SCL线为低电平

Delay(4);//时钟脉冲低电平脉宽

}

//----------------------------------------------------------------------------------------------------------------------------------------//

函数名:

receive_bit

功能:

在SMBus总线上接收一位数据

//----------------------------------------------------------------------------------------------------------------------------------------//

unsignedcharreceive_bit()

{

unsignedcharbit_in;

_SDA_INPUT;//设置SDA为高阻输入

SCL=1;//设置SCL线为高电平

Delay

(2);

if(SDA==1)//从总线上读取一位,赋给bit_in

bit_in=1;

else

bit_in=0;

Delay

(2);

SCL=0;//设置SCL线为低电平

Delay(4);

returnbit_in;//返回bit_in值

}

//----------------------------------------------------------------------------------------------------------------------------------------//

函数名:

slave_ack

功能:

由受控器件MLX90614中读取确认位

返回值:

unsignedcharack

1-ACK

0-NACK

//----------------------------------------------------------------------------------------------------------------------------------------//

unsignedcharslave_ack()

{

unsignedcharack;

ack=0;

_SDA_INPUT;//设置SDA为高阻输入

SCL=1;//设置SCL线为高电平

Delay

(2);

if(SDA==1)//从总线上读取一位,赋给ack

ack=0;

else

ack=1;

Delay

(2);

SCL=0;//设置SCL线为低电平

Delay(4);

returnack;

}

//----------------------------------------------------------------------------------------------------------------------------------------//

发送一个字节

函数名:

TX_byte

功能:

在SMBus总线上发送一个字节

参数:

unsignedcharTX_buffer(将要在总线上发送的字节)

注解:

先发送字节的高位

//----------------------------------------------------------------------------------------------------------------------------------------//

voidTX_byte(unsignedcharTX_buffer)

{

unsignedcharBit_counter;

unsignedcharbit_out;

for(Bit_counter=8;Bit_counter;Bit_counter--)

{

if(TX_buffer&0x80)

bit_out=1;//如果TX_buffer的当前位是1,设置bit_out为1

else

bit_out=0;//否则,设置bit_out为0

send_bit(bit_out);//发送SMBus总线上的当前位

TX_buffer<<=1;//核对下一位

}

}

//----------------------------------------------------------------------------------------------------------------------------------------//

接收一个字节

函数名:

RX_byte

功能:

在SMBus总线上接收一个字节

参数:

unsignedcharack_nack(确认位)

0-主控器件发送ACK

1-主控器件发送NACK

返回值:

unsignedcharRX_buffer(总线接收的字节)

注解:

先接收字节的高位

//----------------------------------------------------------------------------------------------------------------------------------------//

unsignedcharRX_byte(unsignedcharack_nack)

{

unsignedcharRX_buffer;

unsignedcharBit_counter;

for(Bit_counter=8;Bit_counter;Bit_counter--)

{

if(receive_bit()==1)//由SDA线读取一位

{

RX_buffer<<=1;//如果位为“1”,赋“1”给RX_buffer

RX_buffer|=0x01;

}

else//如果位为“0”,赋“0”给RX_buffer

{

RX_buffer<<=1;

RX_buffer&=0xfe;

}

}

send_bit(ack_nack);//发送确认位

returnRX_buffer;

}

//----------------------------------------------------------------------------------------------------------------------------------------//

//-----------------------------------------------------------------------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1