C语言代码MLX90615和单片机STC12C5604AD的SMBus通信1/171目的该文档的主要目的是描述怎样实现单片机和红外温度计MLX90615的SMBus通信。代码是基于STC12C5604AD单片机的。实例给出了由C语言实现MLX90615读取物体温度,写入数据到MLX90615的功能。2C代码2.1由MLX90615读取温度部分实例给出了应用C语言来实现从MLX90615中读取物体温度的程序。为了使程序操作和运行简单起见,整个项目被分为几个子项目。在该文档中整个C程序分为主文件SMBus.c(用来实现对物体温度的读取、改变SMBus地址、改变发射率参数功能);子文件SMBus_CM.c(具体描述SMBus通信的起始状态,终止状态,发送和接受数据);子文件SMBus_OP.c(包含了利用SMBus通信由MLX90615读取数据,对MLX90615写入数据和PEC校验码计算的程序);子文件Delay.c(调用延迟函数);子文件dec2hex.c(将十进制转换为十六进制);子文件CalTem.c(根据十六进制数值计算温度读数);子文件digitalLED.c(在数字LEDs上显示温度读数)。在主文件的头文件中引用相应的子文件.h文件,以将所有功能综合、链接起来。//----------------------------------------------------------------------------------------------------------------------------------------////----------------------------------------------------------------------------------------------------------------------------------------//主文件SMBus.c//----------------------------------------------------------------------------------------------------------------------------------------////----------------------------------------------------------------------------------------------------------------------------------------//红外温度计—MLX90615中读取物体温度描述:该文件是基于单片机STC12C5604AD编写的C语言程序,可通过SMBus实现对MLX90615温度数据的读取,对MLX90615写入数据的功能。实例给出了读取物体温度的程序,以及可根据十六进制数值计算温度数值并在数字LEDs上显示温度的程序,但是此为可选项,用户可根据自己的应用另行选择其他方式。//----------------------------------------------------------------------------------------------------------------------------------------//头文件//----------------------------------------------------------------------------------------------------------------------------------------//#includeSTC12C5410AD.H#includestdio.h#includeintrins.h#includestring.h#includeSMBus_CM.h//引用SMBus_CM.h文件(包含起始状态,终止状态,发送,接收字节等)#includeSMBus_OP.h//引用SMBus_OP.h文件(包含由MLX90615中读取数据和写入数据)#includedigitalLED.h//引用digitalLED.h文件以在数字LEDs上显示温度读数#includeCalTem.h//引用CalTem.h文件来根据十六进制数值计算温度#includedec2hex.h//引用dec2hex.h文件将十进制转换为十六进制#includeDelay.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线给P14C语言代码MLX90615和单片机STC12C5604AD的SMBus通信2/17sbitSCL=P1^3;//指定SCL线给P13//----------------------------------------------------------------------------------------------------------------------------------------//主函数功能作用:读取物体温度//----------------------------------------------------------------------------------------------------------------------------------------//voidmain(){unsignedcharslaveaddress;unsignedlongintDATA;unsignedint*mahm;_SCL_IO;//引用宏定义-设置SCL为开漏式I/O口_SDA_OUTPUT;//引用宏定义-设置SDA为开漏式输出SCL=0;//Delay(30000);//SMBus请求时间,将PWM模式转换为SMBus模式(21ms–39ms)SCL=1;//while(1){slaveaddress=MEM_READ(0x00,0x10);//读取存于MLX90615EEPROM00h地址中的SMBus地址DATA=MEM_READ(slaveaddress,0x27);//基于上述地址由MLX90615的内存07h中读取物体温度mahm=CALTEMP(DATA);//基于所得的十六进制温度格式计算实际温度show(mahm,5);//在数字LEDs上显示计算所得温度}}//----------------------------------------------------------------------------------------------------------------------------------------////----------------------------------------------------------------------------------------------------------------------------------------//子文件SMBus_CM.c//----------------------------------------------------------------------------------------------------------------------------------------////----------------------------------------------------------------------------------------------------------------------------------------//该文档包含了SMBus通信的起始状态,终止状态,发送和接受字节等//----------------------------------------------------------------------------------------------------------------------------------------//头文件//----------------------------------------------------------------------------------------------------------------------------------------//#includeSTC12C5410AD.H#includeSMBus_CM.h//头文件中引用本身#includeintrins.h#includeDelay.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线给P14sbitSCL=P1^3;//指定SCL线给P13//----------------------------------------------------------------------------------------------------------------------------------------//C语言代码MLX90615和单片机STC12C5604AD的SMBus通信3/17函数名:start_bit功能:在SMBus总线上产生起始状态注解:参考“系统管理总线说明书-版本2.0”//-------------------------------------------------------------------------------------------------------------------------