MLX90614和STC12C5604AD通讯Word文档格式.docx
- 文档编号:20625248
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:43
- 大小:29.76KB
MLX90614和STC12C5604AD通讯Word文档格式.docx
《MLX90614和STC12C5604AD通讯Word文档格式.docx》由会员分享,可在线阅读,更多相关《MLX90614和STC12C5604AD通讯Word文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
描述:
该文件是基于单片机STC12C5604AD编写的C语言程序,可通过SMBus实现对MLX90614温度数据的读取,对MLX90614写入数据的功能。
实例给出了读取物体温度的程序,以及可根据十六进制数值计算温度数值并在数字LEDs上显示温度的程序,但是此为可选项,用户可根据自己的应用另行选择其他方式。
头文件
#include<
STC12C5410AD.H>
#include"
stdio.h"
intrins.h"
string.h"
SMBus_CM.h"
//引用SMBus_CM.h文件(包含起始状态,终止状态,发送,接收字节等)
SMBus_OP.h"
//引用SMBus_OP.h文件(包含由MLX90614中读取数据和写入数据)
digitalLED.h"
//引用digitalLED.h文件以在数字LEDs上显示温度读数
CalTem.h"
//引用CalTem.h文件来根据十六进制数值计算温度
dec2hex.h"
//引用dec2hex.h文件将十进制转换为十六进制
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通信的起始状态,终止状态,发送和接受字节等
//头文件中引用本身
宏定义I/O端口和SMBus信号的方向
//设置SCL为开漏式I/O端口
函数名:
start_bit
功能:
在SMBus总线上产生起始状态
注解:
参考“系统管理总线说明书-版本2.0”
voidstart_bit()
{
//设置SDA为输出
SDA=1;
//设置SDA线为高电平
_nop_();
_nop_();
//设置SCL线为高电平
Delay(5);
//在终止和起始状态之间产生总线空闲时间(Tbuf=4.7us最小值)
SDA=0;
//设置SDA线为低电平
//(重复)开始状态后的保持时间,在该时间后,产生第一个时钟信号
//Thd:
sta=4us最小值
//设置SCL线为低电平
}
stop_bit
在SMBus总线上产生终止状态
voidstop_bit()
//设置SDA为输出
//设置SCL线为低电平
//设置SDA线为低电平
//终止状态建立时间(Tsu:
sto=4.0us最小值)
//设置SDA线为高电平
send_bit
在SMBus总线上发送一位数据
voidsend_bit(unsignedcharbit_out)
//设置SDA为开漏输出以在总线上传送数据
if(bit_out==0)//核对字节的位
//如果bit_out=1,设置SDA线为高电平
else
//如果bit_out=0,设置SDA线为低电平
//Tsu:
dat=250ns最小值
Delay(4);
//时钟脉冲高电平脉宽(10.6us)
//时钟脉冲低电平脉宽
receive_bit
功能:
在SMBus总线上接收一位数据
unsignedcharreceive_bit()
unsignedcharbit_in;
_SDA_INPUT;
//设置SDA为高阻输入
//设置SCL线为高电平
Delay
(2);
if(SDA==1)//从总线上读取一位,赋给bit_in
bit_in=1;
else
bit_in=0;
returnbit_in;
//返回bit_in值
slave_ack
由受控器件MLX90614中读取确认位
返回值:
unsignedcharack
1-ACK
0-NACK
unsignedcharslave_ack()
unsignedcharack;
ack=0;
if(SDA==1)//从总线上读取一位,赋给ack
ack=1;
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;
if(receive_bit()==1)//由SDA线读取一位
{
RX_buffer<
//如果位为“1”,赋“1”给RX_buffer
RX_buffer|=0x01;
}
else//如果位为“0”,赋“0”给RX_buffer
RX_buffer&
=0xfe;
}
}
send_bit(ack_nack);
//发送确认位
returnRX_buffer;
//-----------------------------------------------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MLX90614 STC12C5604AD 通讯