⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_m.c

📁 8051模拟IIC总线读写24CXX原程序。
💻 C
字号:
#include "3552.h"
#include "i2cm.h"

unsigned char num = 0x00;
unsigned char DATA[6] ={0x3,0x4};
unsigned char doubleE[7] = {0x88, 0x60, 0x61, 0x62, 0x63, 0x77, 0x88};
unsigned char idata SDATA[10];
unsigned char trans_done;
unsigned char idata Slave_Adr;
unsigned char idata FReceive_Done;
unsigned char idata FTransmitted_Done;
bit read;

unsigned char IrCounter = 0;
unsigned short IrData = 0x0000;
unsigned short CustomCode = 0xffff;
unsigned char DataCode = 0xff;
unsigned char Ir0Index = 0xff;
unsigned char Ir1Index = 0xff;
unsigned char IrIndex;

#define IR_LEADER_MIN	54//50
#define IR_LEADER_MAX	87//81
#define IR_LOGIC0_MIN	3
#define IR_LOGIC0_MAX	9//	8
#define IR_LOGIC1_MIN	9//	8
#define IR_LOGIC1_MAX	30

unsigned char wait200us = 0;		//test
unsigned char wait20ms= 0;
unsigned char wait2sFlag= 0;

//------------------------------------------------------
//i2c interrupt service routine
//------------------------------------------------------
void i2c_isr(void) interrupt 5
{
    switch(S1STA)
	{
		case Bus_error:
        		transreg(Bus_error);
	       break;
		   
        //======master  transmitter mode=====
   		case M_START:				//0x08		
        		transreg(M_START);        
        		S1DAT = Slave_Adr;	 		//sla+R/W	
			num=0;
        		S1CON = RELEASE_BUS_ACK;    
		break;

		case MT_SLAVE_ACK:  		 //0x18
        		transreg(MT_SLAVE_ACK);
			S1DAT = doubleE[num]; 
       		num++;
			S1CON = RELEASE_BUS_NONACK;
		break;

		case MT_DATA:				//0x28
 	    		transreg(MT_DATA);
			if(!read) {
        			if(num<7)
				{ 
					S1DAT = doubleE[num];
					num++;
					S1CON = RELEASE_BUS_ACK;
				}
				else
				{
				 	S1CON = SEND_STOP_ACK;
					FTransmitted_Done=1;
				}		
			}
			else 
			{	//ly
				S1CON = SEND_START_ACK;
				Slave_Adr = SLA_R;
			}
	    	break;
			
		case MT_SLAVE_NONACK:		//0x20
			transreg(MT_SLAVE_NONACK);
			S1CON = SEND_STOP_ACK;
		break;

		case MT_DATA_NONACK:		//0x30
		transreg(MT_DATA_NONACK);
		S1CON = SEND_STOP_ACK;		
		break;

		case M_RESTART:				//0x10
		transreg(M_RESTART);
		S1DAT = Slave_Adr;
        	S1CON = RELEASE_BUS_ACK; 
		num = 0;
		break;


		//======master receiver mode================
		case MR_SLAVE_ACK:			//0x40
		transreg(MR_SLAVE_ACK);
		num=0;
		S1CON = RELEASE_BUS_ACK;    
		break;

		case MR_DATA_ACK:		    //0x50	
			transreg(MR_DATA_ACK);	
	       	SDATA[num]=S1DAT;	
			if(num<5)
			{			
        			S1CON = RELEASE_BUS_ACK;	
				transreg(SDATA[num]);
				num++;		
  			}
	      		else
			{
				S1CON = RELEASE_BUS_NONACK; 
				transreg(SDATA[num]);
				num++;
			}
		break;

		case MR_LDATA_ACK:			//0x58
			transreg(MR_LDATA_ACK);
        		S1CON=SEND_STOP_ACK;
			FReceive_Done =1;
		break;

		case MR_SLAVE_NONACK:		//0x48
		transreg(MR_SLAVE_NONACK);
		S1CON=SEND_STOP_ACK;
		break;

		//=====SLAVE RECEIVE mode===================
		case SR_SLAW_ACK:			//0x60
		transreg(SR_SLAW_ACK);
		num = 0;
		S1CON=RELEASE_BUS_ACK;
		break;

		case SR_SLAW_NONACK:		//0x68
		transreg(SR_SLAW_NONACK);
		num=0;
		S1CON=RELEASE_BUS_NONACK;

		case SR_DATA_ACK:			//0x80
		transreg(SR_DATA_ACK);
		SDATA[num]=S1DAT;
		num++;
		S1CON=RELEASE_BUS_ACK;
		break;

		case SR_DATA_NONACK:		//0x88		
		transreg(SR_DATA_NONACK);
		SDATA[num]=S1DAT;
		num++;
		S1CON=RELEASE_BUS_NONACK;
		break;

		case SR_STOP_ACK:			//0xA0	receive has done
		transreg(SR_STOP_ACK);	
		S1CON=RELEASE_BUS_ACK;
		FReceive_Done = 1;
		break;

		//=====SLAVE TRANSMITTER mode===============
		case ST_SLAR_ACK:			//0xA8
		transreg(ST_SLAR_ACK);
		num=0;
		S1DAT = DATA[num]; 
        num++;
		S1CON=RELEASE_BUS_ACK;
		break;

		case ST_DATA_ACK:			//0xB8
		transreg(ST_DATA_ACK);	
 		S1DAT=DATA[num];
		num++;
		S1CON = RELEASE_BUS_ACK;

		break;

		case ST_STOP_NONACK	:		//0xC0
		transreg(ST_STOP_NONACK);
		S1CON=RELEASE_BUS_ACK;
		FTransmitted_Done =1;
		break;

		default:
			transreg(0xFF);
		break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -