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

📄 24c02.c

📁 24C02模拟I2C串行通信,C51编程
💻 C
字号:
#include    <reg51.h>                   //51系列单片机定义文件
#include    <absacc.h> 
#include    <string.h>
#include    <intrins.h>

#define     uchar   unsigned char       //定义无符号字符
#define     uint    unsigned int        //定义无符号整数

#define WriteDeviceAddress 0xa0  //写入的地址
#define ReadDviceAddress 0xa1    //读出的地址
#define WAIT _nop_()
#define WAIT2 WAIT;WAIT
#define WAIT3 WAIT2;WAIT
#define WAIT4 WAIT2;WAIT2

sbit    MNSDA=P3^0;
sbit    MNCLK=P3^1;   
sbit IIC_SCL=P3^3;	  //串行时钟口
sbit IIC_SDA=P3^2;    //串行数据口
void Write24c02(unsigned char Wdata,unsigned char RomAddress,unsigned char number);
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);

code char  jtled[18]=
{ 
        0x09,/*0*/
        0x7D,/*1*/
        0x07,/*2*/
        0x15,/*3*/
        0x71,/*4*/
        0x91,/*5*/
        0x81,/*6*/
        0x3D,/*7*/
        0x01,/*8*/
        0x11,/*9*/
        0x21,/*A*/
        0xC1,/*b*/
        0x8B,/*C*/
        0x45,/*d*/
        0x83,/*E*/
        0xA3,/*F*/

//  0x0A,0x7E,0x92,0x16,0x66,0x07,0x03,0x3E,0x02,0x26,0x22,0x43,0x8B,0x52,0x83,0xA3
//   0    1     2    3    4    5    6    7    8    9    A    b    C    d   E    F
};



void delay(uint t)   //定义延时函数
{
    register uint bt;
    for(;t;t--)
    for(bt=0;bt<100;bt++);
}

void     MN_Send_Byte(uchar d){
    uchar i = 8;
    while( i-- ){
        MNCLK = 0;
        MNSDA = (bit)(d&0x01); 
        d = d>>1; 
        MNCLK = 1; 
       }
   

    }

/******************************************************************** 

函 数 名:Start_24c02()
功    能:24C02的启动函数
说    明:24c02的启动信号
入口参数:无 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Start_24C02(void) 
{
	IIC_SDA=1;    //时钟线保持高,数据线从高到低一次跳变,通信开始
	IIC_SCL=1;    WAIT4;
	IIC_SDA=0;    WAIT4; 
	IIC_SCL=0;	  WAIT4;
}

/******************************************************************** 

函 数 名:Stop_24C02_()
功    能:24C02的停止函数
说    明:24c02的停止信号
入口参数:无 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Stop_24C02(void )
{                
	IIC_SCL=0;  IIC_SDA=0;  WAIT4; //时钟线保持高,数据线从低到高一次跳变,通信停止
    IIC_SCL=1;	WAIT4;
	IIC_SDA=1;  WAIT4;
//	WP=0;
}

/******************************************************************** 

函 数 名:Ack_24C02()
功    能:24C02的发送应答函数
说    明:24c02的发送应答信号
入口参数:无 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Ack_24C02(void ) 
{
	IIC_SDA=0;    WAIT4;  //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
	IIC_SCL=1;    WAIT4;
	IIC_SCL=0;	  WAIT4;
	
}

/******************************************************************** 

函 数 名:24C02_NoAck()
功    能:24C02的反应答函数
说    明:24c02的反应答信号
入口参数:无 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void NoAck_24C02(void)
{
	IIC_SDA=1;  WAIT4; //数据线保持高,时钟线发生一次从高低的跳变 没有应答
	IIC_SCL=1;  WAIT4;
	IIC_SCL=0;  WAIT4;
}

/******************************************************************** 

函 数 名:24C02_TextAck(void)
功    能:24C02的检测应答函数
说    明:24c02的检测应答信号
入口参数:无 
返 回 值:bit 0或1  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************
bit TestAck_24C02(void)
{
	bit ErrorBit;
	SDA=1;
	SCL=1;   WAIT4;
	ErrorBit=SDA;
	SCL=0;
	return(ErrorBit);
}

/******************************************************************** 

函 数 名:Write8Bit_24C02(void)
功    能:写入8bit数据
说    明:向24c02写入一字节数据 
入口参数:要写的数据 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Write8Bit_24C02(unsigned char input)
{
	unsigned char temp=8;    
	while(temp!=0)
	{ 
	    IIC_SCL=0;	WAIT4;	    
		IIC_SDA=(bit)(input&0x80);     //时钟保持低可以发送数据  
	    input=input<<1;
		WAIT4;		
        IIC_SCL=1;
	    WAIT4;
	   	temp--; 	
	}
	IIC_SCL=0;
}

/******************************************************************** 

函 数 名:Write24c02(void)
功    能:写入数据
说    明:向24c02写入数据
入口参数:*Wdata      要写入的数据指针
          RomAddress  要写入到24C02的地址
		  number      要写入的数据长度
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Write24c02(unsigned char Wdata,unsigned char RomAddress,unsigned char number) 
{   
		Start_24C02();
		Write8Bit_24C02(WriteDeviceAddress);  //写入器件的地址
		Ack_24C02();  
		Write8Bit_24C02(RomAddress);          //写入要存储到24C02的地址
		Ack_24C02();	
		Write8Bit_24C02(Wdata);
		Ack_24C02();		
		Stop_24C02();
		delay(20);
}


/******************************************************************** 

函 数 名:Read8_Bit24C02(void)
功    能:读出8bit数据
说    明:向24c02读出8bit的数据
入口参数:无 
返 回 值:读出的数据值
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
unsigned char Read8Bit_24C02(void)
{
	unsigned char temp,rbyte=0;
	IIC_SDA=1;
	for(temp=8;temp!=0;temp--) 
	{
		IIC_SCL=0;  WAIT4;       //时钟做一次从低到高的跳变 可以接收数据
		IIC_SCL=1;  WAIT4;
		rbyte=rbyte<<1;
		rbyte=rbyte|((unsigned char)(IIC_SDA)); 
	}
	IIC_SCL=0;
	return(rbyte);
}

/******************************************************************** 

函 数 名:24C02_Read24c02()
功    能:读出多字节数据函数
说    明:向24c02读出多字节数据
入口参数:*RamAddress     存储读出数据的指针
          RomAddress      要读出数据的24C02地址
		  bytes           要读出的数据长度 
返 回 值:无  
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期: 
***********************************************************************/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) 
{
		Start_24C02();
		Write8Bit_24C02(WriteDeviceAddress);    //写入器件的地址
		Ack_24C02(); 
		Write8Bit_24C02(RomAddress);            //写入要存储到24C02的地址
		Ack_24C02(); 
		Start_24C02();
		Write8Bit_24C02(ReadDviceAddress);     //写入读器件的地址
		Ack_24C02();	
		*RamAddress=Read8Bit_24C02();
		NoAck_24C02();
		Stop_24C02();
	
}




void main(void){
    
    uchar input = 0x25,*output;	 
      
    delay(10);     
    Write24c02(input,0,1);
    delay(10);
	Read24c02(output,0,1);
	MN_Send_Byte(jtled[*output/16]); 
    MN_Send_Byte(jtled[*output%16]); 
	while(1);
    
}

⌨️ 快捷键说明

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