云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > MLX90614和STC12C5604AD的SMBus&PWM 通信

MLX90614和STC12C5604AD的SMBus&PWM 通信

  • 62 次阅读
  • 3 次下载
  • 2025/6/8 22:17:10

C语言代码

MLX90614和单片机STC12C5604AD的SMBus,PWM通信 1 目的

该文档的主要目的是描述怎样实现单片机和红外温度计MLX90614的SMBus通信,并简略介绍利用单片机对MLX90614的PWM输出脉冲进行测量并计算相关温度。代码是基于STC12C5604AD单片机的。实例给出了由C语言实现MLX90614读取物体温度,写入数据到MLX90614、以及对PWM脉冲的测量和计算等功能。

2 C 代码

2.1 由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 \#include \#include \

#include \引用SMBus_CM.h文件(包含起始状态,终止状态,发送,接收字节等) #include \ //引用SMBus_OP.h文件(包含由MLX90614中读取数据和写入数据) #include \ //引用digitalLED.h文件以在数字LEDs上显示温度读数 #include \ //引用CalTem.h文件来根据十六进制数值计算温度 #include \ //引用dec2hex.h文件将十进制转换为十六进制 #include \引用Delay.h文件

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

//----------------------------------------------------------------------------------------------------------------------------------------// #define _SDA_OUTPUT P1M0=0x10; P1M1=0x10; //设置SDA为开漏输出 #define _SDA_INPUT P1M0=0x10; P1M1=0x00; //设置SDA为高阻输入 #define _SCL_IO P1M0=0x08; P1M1=0x08; //设置SCL为开漏输出的I/O端口

1 / 23

C语言代码

sbit SDA = P1^4; //指定SDA线给P14 sbit SCL = P1^3; //指定SCL线给P13

//----------------------------------------------------------------------------------------------------------------------------------------// 主函数功能

作用:读取物体温度

//----------------------------------------------------------------------------------------------------------------------------------------// void main() { unsigned char slaveaddress; unsigned long int DATA; unsigned int *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); //读取存于MLX90614 EEPROM \地址中的SMBus地址 DATA=MEM_READ(slaveaddress,0x07); //基于上述地址由MLX90614的内存07h中读取物体温度 mahm=CALTEMP(DATA); //基于所得的十六进制温度格式计算实际温度 show(mahm,5); //在数字LEDs上显示计算所得温度 } }

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

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

MLX90614和单片机STC12C5604AD的SMBus,PWM通信

子文件SMBus_CM.c

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

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

//----------------------------------------------------------------------------------------------------------------------------------------// 头文件

//----------------------------------------------------------------------------------------------------------------------------------------// #include

#include \头文件中引用本身 #include \#include \

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

//----------------------------------------------------------------------------------------------------------------------------------------// #define _SDA_OUTPUT P1M0=0x10; P1M1=0x10; //设置SDA为开漏输出 #define _SDA_INPUT P1M0=0x10; P1M1=0x00; //设置SDA为高阻输入 #define _SCL_IO P1M0=0x08; P1M1=0x08; //设置SCL为开漏式I/O端口 sbit SDA = P1^4; //指定SDA线给P14 sbit SCL = P1^3; //指定SCL线给P13

2 / 23

C语言代码

//----------------------------------------------------------------------------------------------------------------------------------------// 函数名: start_bit

功能: 在SMBus总线上产生起始状态

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

//----------------------------------------------------------------------------------------------------------------------------------------// void start_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” //----------------------------------------------------------------------------------------------------------------------------------------// void stop_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总线上发送一位数据

//----------------------------------------------------------------------------------------------------------------------------------------// void send_bit(unsigned char bit_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_(); //

MLX90614和单片机STC12C5604AD的SMBus,PWM通信

3 / 23

C语言代码

SCL=1; //设置SCL线为高电平 Delay(4); //时钟脉冲高电平脉宽(10.6us) SCL=0; //设置SCL线为低电平 Delay(4); //时钟脉冲低电平脉宽 }

//----------------------------------------------------------------------------------------------------------------------------------------// 函数名: receive_bit

功能:在SMBus总线上接收一位数据

//----------------------------------------------------------------------------------------------------------------------------------------// unsigned char receive_bit() {

unsigned char bit_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);

return bit_in; //返回bit_in值 }

//----------------------------------------------------------------------------------------------------------------------------------------// 函数名: slave_ack 功能: 由受控器件MLX90614中读取确认位 返回值: unsigned char ack 1 - ACK 0 - NACK

//----------------------------------------------------------------------------------------------------------------------------------------// unsigned char slave_ack() {

unsigned char ack; 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); return ack; }

//----------------------------------------------------------------------------------------------------------------------------------------// 发送一个字节 函数名: TX_byte

功能: 在SMBus总线上发送一个字节

参数: unsigned char TX_buffer (将要在总线上发送的字节) 注解: 先发送字节的高位

MLX90614和单片机STC12C5604AD的SMBus,PWM通信

4 / 23

搜索更多关于: MLX90614和STC12C5604AD的SMBus&PW 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

C语言代码 MLX90614和单片机STC12C5604AD的SMBus,PWM通信 1 目的 该文档的主要目的是描述怎样实现单片机和红外温度计MLX90614的SMBus通信,并简略介绍利用单片机对MLX90614的PWM输出脉冲进行测量并计算相关温度。代码是基于STC12C5604AD单片机的。实例给出了由C语言实现MLX90614读取物体温度,写入数据到MLX90614、以及对PWM脉冲的测量和计算等功能。 2 C 代码 2.1 由MLX90614读取温度部分 实例给出了应

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com