版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.1 目的 该文档的主要目的是描述怎样实现单片机和红外温度计MLX90614的SMBus通信,并简略介绍利用单片机对MLX90614的PWM输出脉冲进行测量并计算相关温度。代码是基于STC12C5604AD单片机的。实例给出了由C语言实现MLX90614读取物体温度,写入数据到MLX90614、以及对PWM脉冲的测量和计算等功能。 2 C 代码2.1 由MLX90614读取温度部分 实例给出了应用C语言来实现从MLX90614中读取物体温度的程序。为了使程序操作和运行简单起见,整个项目被分为几个子项目。在该文档中整个C程序分为主文件SMBus.c (用来实现对物体温度的读取、改变SMBus地址
2、、改变发射率、以及改变PWMCTRL配置参数功能);子文件SMBus_CM.c(具体描述SMBus通信的起始状态,终止状态,发送和接受数据); 子文件SMBus_OP.c(包含了利用SMBus通信由MLX90614读取数据,对MLX90614写入数据和PEC校验码计算的程序);子文件Delay.c(调用延迟函数);子文件dec2hex.c(将十进制转换为十六进制);子文件CalTem.c(根据十六进制数值计算温度读数);子文件digitalLED.c(在数字LEDs上显示温度读数)。在主文件的头文件中引用相应的子文件.h文件,以将所有功能综合、链接起来。/-/-/主文件SMBus.c/-/-/
3、红外温度计MLX90614中读取物体温度描述:该文件是基于单片机STC12C5604AD编写的C语言程序,可通过SMBus实现对MLX90614温度数据的读取,对MLX90614写入数据的功能。实例给出了读取物体温度的程序,以及可根据十六进制数值计算温度数值并在数字LEDs上显示温度的程序,但是此为可选项,用户可根据自己的应用另行选择其他方式。/-/头文件/-/#include #include stdio.h #include intrins.h #include string.h#include SMBus_CM.h /引用SMBus_CM.h文件(包含起始状态,终止状态,发送,接收字节等
4、)#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_OUTPUT P1M0=0x10; P1M1=0x10
5、; /设置SDA为开漏输出#define _SDA_INPUT P1M0=0x10; P1M1=0x00;/设置SDA为高阻输入#define _SCL_IO P1M0=0x08; P1M1=0x08;/设置SCL为开漏输出的I/O端口 sbit SDA = P14; /指定SDA线给P14sbit SCL = P13; /指定SCL线给P13/-/主函数功能作用:读取物体温度/-/void main() unsigned char slaveaddress; unsigned long int DATA; unsigned int *mahm; _SCL_IO; /引用宏定义-设置SCL为开
6、漏式I/O口 _SDA_OUTPUT; /引用宏定义-设置SDA为开漏式输出 SCL=0;/ Delay(1200);/SMBus请求时间,将PWM模式转换为SMBus模式(至少为2ms) SCL=1;/ while(1) slaveaddress=MEM_READ(0x00,0x2E); /读取存于MLX90614 EEPROM 0Eh地址中的SMBus地址 DATA=MEM_READ(slaveaddress,0x07); /基于上述地址由MLX90614的内存07h中读取物体温度 mahm=CALTEMP(DATA); /基于所得的十六进制温度格式计算实际温度 show(mahm,5);
7、 /在数字LEDs上显示计算所得温度 /-/-/子文件SMBus_CM.c/-/-/该文档包含了SMBus通信的起始状态,终止状态,发送和接受字节等/-/头文件/-/#include #include SMBus_CM.h /头文件中引用本身#include intrins.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_I
8、O P1M0=0x08; P1M1=0x08; /设置SCL为开漏式I/O端口sbit SDA = P14; /指定SDA线给P14sbit SCL = P13; /指定SCL线给P13/-/函数名: 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
9、; /设置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); /终止状态建
10、立时间(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_(); / SCL=1; /设置SC
11、L线为高电平 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线为低电
12、平 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线为低电平 De
13、lay(4); return ack;/-/发送一个字节函数名: TX_byte功能: 在SMBus总线上发送一个字节参数: unsigned char TX_buffer (将要在总线上发送的字节)注解: 先发送字节的高位/-/void TX_byte(unsigned char TX_buffer) unsigned char Bit_counter; unsigned char bit_out; for(Bit_counter=8;Bit_counter;Bit_counter-) if(TX_buffer&0x80) bit_out=1; /如果TX_buffer的当前位是1,设置bi
14、t_out为1else bit_out=0; /否则,设置bit_out为0 send_bit(bit_out); /发送SMBus总线上的当前位 TX_buffer=1; /核对下一位 /-/接收一个字节函数名: RX_byte功能: 在SMBus总线上接收一个字节参数: unsigned char ack_nack (确认位)0 - 主控器件发送 ACK1 - 主控器件发送 NACK返回值: unsigned char RX_buffer (总线接收的字节)注解: 先接收字节的高位/-/unsigned char RX_byte(unsigned char ack_nack) unsign
15、ed char RX_buffer; unsigned char Bit_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); /发送确认位 return RX_buffer;/-/-/子文件SMBus_OP.c/-/-/
16、该文档包含了SMBus通信时从MLX90614读取数据,写入数据和PEC校验码计算的程序/-/头文件/-/#include #include SMBus_CM.h /引用SMBus_CM.h文件 #include intrins.h#include SMBus_OP.h /头文件中引用本身#include Delay.h/-/sbit SDA = P14; /指定MLX90614的SDA线给单片机P14引脚sbit SCL = P13; /指定MLX90614的SCL线给单片机P13引脚/-/计算PEC包裹校验码函数名: PEC_cal功能: 根据接收的字节计算PEC码参数: unsigned
17、 char pec, int n返回值: pec0 - 该字节包含计算所得crc数值注解:参考“系统管理总线说明书-版本2.0”和应用指南“MCU和MLX90614的SMBus通信/-/unsigned char PEC_cal(unsigned char pec,int n) unsigned char crc6; unsigned char Bitposition=47; unsigned char shift; unsigned char i; unsigned char j; unsigned char temp; do crc5=0; /载入 CRC数值 0x000000000107
18、 crc4=0; crc3=0; crc2=0; crc1=0x01; crc0=0x07; Bitposition=47; /设置Bitposition的最大值为47 shift=0; /在传送的字节中找出第一个“1” i=5; /设置最高标志位 (包裹字节标志) j=0; /字节位标志,从最低位开始 while(peci&(0x80j)=0 & (i0) Bitposition-; if(j7) j+; else j=0x00; i-; /while语句结束,并找出Bitposition中为“1”的最高位位置 shift=Bitposition-8; /得到CRC数值将要左移/右移的数值“
19、shift” /对CRC数据左移“shift”位 while(shift) for(i=5;i0) /核对字节的最高位的下一位是否为1 /是 - 当前字节 + 1 temp=1; /否 - 当前字节 + 0 /实现字节之间移动“1” else temp=0; crci=1; crci+=temp; shift-; /pec和crc之间进行异或计算 for(i=0;i8); return pec0; /返回计算所得的crc数值 /-/由MLX90614 RAM/EEPROM 读取的数据函数名: MEM_READ功能: 给定受控地址和命令时由MLX90614读取数据参数: unsigned cha
20、r slave_addR (受控地址) unsigned char cmdR (命令)返回值: unsigned long int Data/-/unsigned long int MEM_READ(unsigned char slave_addR, unsigned char cmdR) unsigned char DataL; / unsigned char DataH; /由MLX90614读取的数据包 unsigned char PEC; / unsigned long int Data; /由MLX90614返回的寄存器数值 unsigned char Pecreg; /存储计算所得
21、PEC字节 unsigned char arr6; /存储已发送字节的缓冲器 unsigned char ack_nack; unsigned char SLA; SLA=(slave_addR1); begin: start_bit(); /发送起始位 TX_byte(SLA); /发送受控器件地址,写命令 if(slave_ack()=0) stop_bit(); goto begin; /发送命令 TX_byte(cmdR); if(slave_ack()=0) stop_bit(); goto begin; start_bit(); /发送重复起始位 TX_byte(SLA+1); /
22、发送受控器件地址,读命令 if(slave_ack()=0) stop_bit(); goto begin; DataL=RX_byte(0); / /读取两个字节数据 DataH=RX_byte(0); / PEC=RX_byte(ack_nack); /读取MLX90614的PEC码 if(ack_nack=1) /主控器件发送ack 或是 nack /取决于pec计算,如果PEC是不正确的,发送nack并返回到goto begin stop_bit(); goto begin; stop_bit(); /发送终止位 arr5=(SLA); arr4=cmdR; arr3=(SLA+1);
23、 arr2=DataL; arr1=DataH; arr0=0; Pecreg=PEC_cal(arr,6); /调用计算 CRC 的函数 if(PEC=Pecreg) ack_nack=0; else ack_nack=1; Data=(DataH*256)+DataL; return Data;/-/MLX90614 EEPROM中写入数据函数名: EEPROM_WRITE功能: 根据命令写入相关数据到给定受控器件地址的MLX90614参数: unsigned char slave_addW (受控器件地址)unsigned char cmdW (命令)unsigned char DataL unsigned char DataH/-/void EEPROM_WRITE(unsigned char slave_addW,unsigned char cmdW,unsigned char DataL,unsigned char DataH) unsigned char Pecreg; /存储计算所得PEC字节 unsigned char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 近五年高考英语真题词:753个阅读核心词+185个写作提分词
- 第12课 大画家王冕教学设计小学地方、校本课程浙教版人·自然·社会
- 2025-2026学年阅读课教学设计英语初中
- 第6课 鸟和家禽 教学设计-四年级下册小学美术同步备课资源包(苏少版)
- 第3课 学会反思 第一课时 教学设计道德与法治六年级下册统编版
- 2025-2026学年珍珠泉教学设计图册制作
- 2025年煤矿智能支护机器人应用实践
- 第5课 言葉の意味 第三课时教案 2025-2026学年初中日语人教版八年级第二册
- 2025-2026学年知识与过程教学目标设计
- 2025-2026学年运球教学设计数学小学
- 2026春季苏教版(新教材)小学科学三年级下册(全册)各单元知识点复习要点梳理
- 2026年材料微观结构与力学性能的关系
- 2026年及未来5年中国长江内河港口建设行业全景评估及投资规划建议报告
- 2026江西裕民银行招聘笔试参考题库及答案解析
- 2025年浙江省基层法律服务工作者试题库(附含参考答案)
- 2025版 全套200MW800MWh独立储能项目EPC工程概算表
- GB/T 9791-2025金属及其他无机覆盖层锌、镉、铝-锌合金和锌-铝合金的铬酸盐转化膜试验方法
- 2025至2030中国麻辣烫行业市场深度研究与战略咨询分析报告
- 征兵智力测试题目集与详解
- 代扣代缴个税协议书
- 灯具实验室管理制度(3篇)
评论
0/150
提交评论