📄 smbuslistener.c
字号:
/******************************************************************************************************
完美SMBUS监听程序集合;
******************************************************************************************************/
#include <p89c51rx.h>
//bit ACK;
sbit SCL=P1^2;
sbit SDA=P1^1;
sbit Acc_0= B^0;
sbit Acc_1= B^1;
sbit Acc_2= B^2;
sbit Acc_3= B^3;
sbit Acc_4= B^4;
sbit Acc_5= B^5;
sbit Acc_6= B^6;
sbit Acc_7= B^7;
/*****************************************************************************************************
初始化串口
***************************************************************************************************/
void INITUART() //初始化串行口baud115200
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x22; //TMOD: timer 1, mode 2, 8-bit reload ;
// timer 0, mode 2, 8-bit,reload ;
PCON = 0x80; //SMOD=1;
TH1 = 0xFF; //Baud:9600 fosc=22.1184MHz
IE = 0x00;//Enable Serial Interrupt //EA=1;ES=1; 90
PS=1;
TR1 = 1; // timer 1 run
}
main()
{
bit SDA_old;
bit rec_restart;
int i;
unsigned char rec[128];
unsigned char num;
INITUART();
SDA=1;
SCL=1;
start:
if(num!=0)
{
for(i=1;i<=num;i++)
{
SBUF=rec[i];
while(TI==0);
TI=0;
}
}
num=0;
B=0;
P1_7=0;
while(SDA);
while(SCL);
P1_7=1;
//-------------------------------byte1
while(!SCL);
Acc_7=SDA;
while(SCL);
while(!SCL);
Acc_6=SDA;
while(SCL);
while(!SCL);
Acc_5=SDA;
while(SCL);
while(!SCL);
Acc_4=SDA;
while(SCL);
while(!SCL);
Acc_3=SDA;
while(SCL);
while(!SCL);
Acc_2=SDA;
while(SCL);
while(!SCL);
Acc_1=SDA;
while(SCL);
while(!SCL);
Acc_0=SDA;
while(SCL);
while(!SCL);
while(SCL);
num++;
rec[num]=B;
//------------------------------------------- byte2
//----------------------------------------------
while(!SCL);
Acc_7=SDA;
while(SCL);
while(!SCL);
Acc_6=SDA;
while(SCL);
while(!SCL);
Acc_5=SDA;
while(SCL);
while(!SCL);
Acc_4=SDA;
while(SCL);
while(!SCL);
Acc_3=SDA;
while(SCL);
while(!SCL);
Acc_2=SDA;
while(SCL);
while(!SCL);
Acc_1=SDA;
while(SCL);
while(!SCL);
Acc_0=SDA;
while(SCL);
while(!SCL);
while(SCL);
num++;
rec[num]=B;
//---------------------------------------------byte3
//---------------------------------------------
rec_restart=0;
while(!SCL)
{SDA_old=SDA;}
while(SCL)
{
if(SDA_old!=SDA)
{
if(SDA==0)
{
rec_restart=1;
while(SCL);
}
}
else
{
Acc_7=SDA;
rec_restart=0;
}
}
if(rec_restart==1)
{
while(!SCL);
Acc_7=SDA;
while(SCL);
}
while(!SCL);
Acc_6=SDA;
while(SCL);
while(!SCL);
Acc_5=SDA;
while(SCL);
while(!SCL);
Acc_4=SDA;
while(SCL);
while(!SCL);
Acc_3=SDA;
while(SCL);
while(!SCL);
Acc_2=SDA;
while(SCL);
while(!SCL);
Acc_1=SDA;
while(SCL);
while(!SCL);
Acc_0=SDA;
while(SCL);
while(!SCL);//ack
while(SCL);
num++;
rec[num]=B;
//--------------------------------------------------byte4 ....
//----------------------------------------------------
while(1)
{
while(!SCL)
{SDA_old=SDA;}
while(SCL)
{
if(SDA_old!=SDA)
{
goto start;
}
else
{
Acc_7=SDA;
}
}
while(!SCL);
Acc_6=SDA;
while(SCL);
while(!SCL);
Acc_5=SDA;
while(SCL);
while(!SCL);
Acc_4=SDA;
while(SCL);
while(!SCL);
Acc_3=SDA;
while(SCL);
while(!SCL);
Acc_2=SDA;
while(SCL);
while(!SCL);
Acc_1=SDA;
while(SCL);
while(!SCL);
Acc_0=SDA;
while(SCL);
while(!SCL);//ack
while(SCL);
num++;
rec[num]=B;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -