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); }
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |