MLX90614的SMbus协议通信
我把代码贴出来吧,程序代码是从网上改编过来的,数据通过串口打印到电脑上进行调试!
#include"reg52.h"
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定义**************
sbit SCL=P2^0;//时钟线
sbit SDA=P2^1;//数据线
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函数声明*****************************************
void start_bit(); //MLX90614发起始位子程序
void stop_bit(); //MLX90614发结束位子程序
uchar rx_byte(void); //MLX90614接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void tx_byte(uchar dat_byte); //MLX90614接收字节子程序
void receive_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
void display(uint Tem);
void uart_txd(char *a);
void init_uart();
void uart_txd1(char n) ;
uint memread(void); //读温度数据
char TemCode[6];
//*************主函数*******************************************
void main()
{
uint Tem;
//函数部分
init_uart();
SCL=1;
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
delay(1000);
SCL=1;
//init1602(); 这里写串口初始化程序
while(1) {
Tem=memread();
display(Tem); //函数里调用串口发送数据
delay(20);
}
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
/*1*///dis_cmd_wrt(0x01);//清屏
if(T>=27315){
T=T-27315;
a=T/100;
b=T-a*100;
TemCode[0]=a/100+'0'; //在这里增加了内容
TemCode[1]=a%100/10+'0'; /*1*/
TemCode[2]=a%10+'0';
TemCode[3]='.';
TemCode[4]=b/10+'0';
TemCode[5]=b%10+'0';
}
else{
TemCode[0]='-';
TemCode[1]=a/10+'0';
TemCode[2]=a%10+'0';
TemCode[3]='.';
TemCode[4]=b/10+'0';
TemCode[5]=b%10+'0';
}
uart_txd(TemCode); //在这里调用串口显示函数
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++){
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1){
uart_txd1(n);
stop_bit();
if(n!=0) {
n--;
goto Repeat;
}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++){
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
//SDA=1;
bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
/*1*/
/*下面是自己写的函数*/
void init_uart()
{
TMOD =0X20;
TH1=0Xfd;
TL1=0Xfd;
TR1=1;
REN=0;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void uart_txd(char * a){
uint i;
ES=0;
for(i=0;i<6;i++) {
SBUF=a[i];
while(!TI);
TI=0;
}
delay(100);
}
void uart_txd1(char n){
ES=0;
SBUF=n;
while(!TI);
TI=0;
delay(100);
}
#include"reg52.h"
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定义**************
sbit SCL=P2^0;//时钟线
sbit SDA=P2^1;//数据线
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函数声明*****************************************
void start_bit(); //MLX90614发起始位子程序
void stop_bit(); //MLX90614发结束位子程序
uchar rx_byte(void); //MLX90614接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void tx_byte(uchar dat_byte); //MLX90614接收字节子程序
void receive_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
void display(uint Tem);
void uart_txd(char *a);
void init_uart();
void uart_txd1(char n) ;
uint memread(void); //读温度数据
char TemCode[6];
//*************主函数*******************************************
void main()
{
uint Tem;
//函数部分
init_uart();
SCL=1;
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
delay(1000);
SCL=1;
//init1602(); 这里写串口初始化程序
while(1) {
Tem=memread();
display(Tem); //函数里调用串口发送数据
delay(20);
}
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
/*1*///dis_cmd_wrt(0x01);//清屏
if(T>=27315){
T=T-27315;
a=T/100;
b=T-a*100;
TemCode[0]=a/100+'0'; //在这里增加了内容
TemCode[1]=a%100/10+'0'; /*1*/
TemCode[2]=a%10+'0';
TemCode[3]='.';
TemCode[4]=b/10+'0';
TemCode[5]=b%10+'0';
}
else{
TemCode[0]='-';
TemCode[1]=a/10+'0';
TemCode[2]=a%10+'0';
TemCode[3]='.';
TemCode[4]=b/10+'0';
TemCode[5]=b%10+'0';
}
uart_txd(TemCode); //在这里调用串口显示函数
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++){
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1){
uart_txd1(n);
stop_bit();
if(n!=0) {
n--;
goto Repeat;
}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++){
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
//SDA=1;
bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
/*1*/
/*下面是自己写的函数*/
void init_uart()
{
TMOD =0X20;
TH1=0Xfd;
TL1=0Xfd;
TR1=1;
REN=0;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void uart_txd(char * a){
uint i;
ES=0;
for(i=0;i<6;i++) {
SBUF=a[i];
while(!TI);
TI=0;
}
delay(100);
}
void uart_txd1(char n){
ES=0;
SBUF=n;
while(!TI);
TI=0;
delay(100);
}
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金
