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

📄 2402.c

📁 接收遥控器发出的指令并存储
💻 C
字号:
/************************************************************************************/
/*     程序名:AT24C02的读取操作                                                    */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */
/*                                                                                  */
/*     功能描述: 对单个AT24C02进行读和写的操作					                    */
/*                                                                                  */
/*     http://www.mculover.net                                                      */
/*     http://www.mculover.net/bbs                                                  */
/*   													 					    	*/
/*                                                                                  */
/*                                                湘灵电子工作室 版权所有           */     
/*                                                         2006-02-20               */
/************************************************************************************/ 

#include "ir_type.h"
//#include "24C02.h"
#define TRUE        1
#define FALSE       0
#define Delay_TIME  60  /*经实验,不要小于50!否则可能造成时序混乱*/

//unsigned char seg_tab[] = {0x41, 0xf5, 0x29, 0x31, 0x95, 0x13, 0x03, 0x75, 0x01, 0x11};//0-9数字
//static unsigned char DC=0x00;
/********** Function Definition 函数定义 ************/
void Delay2(unsigned int t) /*延时函数*/
{
	while(t!=0)
    	t--;
}

void I2C_Start(void)
{
  	/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    SDA=1;
    SCL=1;
    Delay2(Delay_TIME);
    SDA=0;
    Delay2(Delay_TIME);
    SCL=0;
    Delay2(Delay_TIME);
}

void I2C_Stop(void)
{
 	/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
   	SDA=0;
	SCL=1;
    Delay2(Delay_TIME);
    SDA=1;
    Delay2(Delay_TIME);
    SCL=0;
    Delay2(Delay_TIME);
}

void SEND_0(void)   /* SEND ACK */
{
   	/*发送0,在SCL为高电平时使SDA信号为低*/
    SDA=0;
    SCL=1;
    Delay2(Delay_TIME);
    SCL=0;
    Delay2(Delay_TIME);
}

void SEND_1(void)
{
	/*发送1,在SCL为高电平时使SDA信号为高*/
    SDA=1;
    SCL=1;
    Delay2(Delay_TIME);
    SCL=0;
    Delay2(Delay_TIME);
}

bit Check_Acknowledge(void)
{
	/*发送完一个字节后检验设备的应答信号*/
    SDA=1;
    SCL=1;
    Delay2(Delay_TIME/2);
    F0=SDA;
    Delay2(Delay_TIME/2);
    SCL=0;
    Delay2(Delay_TIME);
    if(F0==1)
    	return FALSE;
    return TRUE;
}

void WriteI2CByte(unsigned char b)reentrant
{
	/*向I2C总线写一个字节*/
    unsigned char i;
    for(i=0;i<8;i++)
   		if((b<<i)&0x80)
        	SEND_1();
        else
            SEND_0();
}

unsigned char ReadI2CByte(void)reentrant
{
	/*从I2C总线读一个字节*/
   	unsigned char b=0,i;
  	for(i=0;i<8;i++)
    {
   		SDA=1;    /*释放总线*/
      	SCL=1;    /*接受数据*/
        Delay2(10);
        F0=SDA;
        Delay2(10);
        SCL=0;
        if(F0==1)
        {
        	b=b<<1;
            b=b|0x01;
        }
        else
            b=b<<1;
    }
    return b;
}

/**********以下为读写24c02的函数******************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
	bit acktemp=1;
    /*write a byte to mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);                    /*address*/
    acktemp=Check_Acknowledge();
    WriteI2CByte(thedata);                 /*thedata*/
    acktemp=Check_Acknowledge();
    I2C_Stop();
}

/************************************************************/
unsigned char Read_One_Byte(unsigned char addr)
{         
	bit acktemp=1;
    unsigned char mydata;
    /*read a byte from mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);/*address*/
    acktemp=Check_Acknowledge();
    I2C_Start();
    WriteI2CByte(0xa1);
    acktemp=Check_Acknowledge();
    mydata=ReadI2CByte();
    acktemp=Check_Acknowledge();
    return mydata;
    I2C_Stop();
}

//调用方式如下:	
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/*************************************************
void main(void)
{
	unsigned char tmp;
	
LED= 0;//选择数码管的第一位显示

	while(1)
	{
		if(K2 == 0)//判断K5是否被按下
		{
			Delay(500);//延时消抖
			if(K2 == 0)
			{
				Write_One_Byte(DC,0x07);//往2402的0X04地址写如数值0X07
			}
		}

		if(K3 == 0)
		{
			Delay(500);
			if(K3 == 0)
			{
				tmp = Read_One_Byte(DC);//将读出来的数值给tmp
				//P0  = seg_tab[tmp];
				LED=tmp;
                   	Delay(50000);
			}
		}
	}
}
*****************************/

⌨️ 快捷键说明

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