tag 标签: 24c02

相关博文
  • 热度 26
    2013-9-26 12:07
    1546 次阅读|
    1 个评论
      ZHX1502单片机可烧录义隆单片机EM78P153+24C02开发的程序,就不需要外挂24C02了.ZHX1502有SOP8及SOP14封装.价格有绝对优势!欢迎来电18664227881或加QQ:24919311详谈,王R!  
  • 热度 24
    2013-7-31 01:30
    1862 次阅读|
    1 个评论
          今天学习了用51单片机对24C02的操作。资料是在同学那里找的,有关于24C02的介绍,也有C代码。原理和介绍以前也看过。看时序图的时候始终觉得很麻烦,不知具体的代码该怎么写,可以看了别人写的代码又觉得这么简单就实现了想要的功能。可以还是对原理理解得不够深入,有些代码不太懂,但大概思路没问题。       首先,24C02是IIC的方式进行通信的,所以先来看看IIC。IIC通信,涉及到的主要操作有:启动总线、停止总线、应答、非应答、写字节、读字节。下面是关于这些操作的代码. #include #include "intrins.h" #include "iic.h" void delay(void) {  _nop_(); _nop_(); _nop_();  _nop_(); _nop_(); _nop_();  _nop_(); _nop_(); _nop_(); } /************************************** Function:   void iic_start(void) Description: 启动iic总线 Calls:   无 Input:   无 Output;   无 Return:   无 Others:   涉及到总线地址 scl sda ****************************************/ void iic_start(void) //iic总线启动 {   scl = 1;  delay();  sda = 1;  delay();  sda = 0;  delay(); } /************************************** Function:   void iic_stop(void) Description: 停止iic总线 Calls:   无 Input:   无 Output;   无 Return:   无 Others:   涉及到总线地址 scl sda ****************************************/ void iic_stop(void)  //iic总线停止 {  sda = 0;  delay();  scl = 1;  delay();  sda = 1;  delay(); } /*************************************** Function:   void iic_ack(void) Description: 应答信号 Calls:   无 Input:   无 Output;   无 Return:   无 Others:    ****************************************/ void iic_ack(void)  //iic总线应答 {  uint i;  scl = 1;  delay();  while((sda==1)(i200))  {   i++;  }  scl = 0;  delay();   } /************************************** Function:   void iic_noack(void) Description: 无应答信号 Calls:   无 Input:   无 Output;   无 Return:   无 Others:    ***************************************/ void iic_noack(void) //iic总线非应答 {  sda = 1;  delay();  scl = 1;  delay();  scl = 0;  delay(); } /*************************************** Function:   void iicwr_byte(void) Description: iic总线写一位(8bit)数据 Calls:   void delay(void) Input:   dat Output;   无 Return:   无 Others:   涉及到总线地址 scl sda *****************************************/ void iicwr_byte(uchar dat) {       //iic总线写一位(8bit)数据  uchar i;  scl = 0;  for(i=0;i8;i++)  {   if(dat0x80)   {    sda = 1;     }   else   {    sda = 0;   }   dat=dat1;   delay();   scl = 1;   delay();   scl = 0;   delay();   }  sda = 1;  delay();  } /*************************************** Function:   void iicre_byte(void) Description: iic总线写一位(8bit)数据 Calls:   void delay(void) Input:   无 Output;   无 Return:   dat Others:   涉及到总线地址 scl sda *****************************************/ uchar iicre_byte()  //iic总线读一位(8bit)数据    {  uchar i;  uchar dat;  scl = 0;  delay();  sda = 1;  delay();  for(i=0;i8;i++)  {   scl = 1;   delay();   dat=dat1;   if(sda)  dat++;   scl = 0;   delay();  }  sda = 1;   return dat;   //数据返回 } 在读以上代码时,有这样一些问题:1、while((sda==1)(i200))  {   i++;  }这句不太懂。2、非应答信号有什么用?      然后是24C02操作的一些代码: #include #include "iic.h" #include "24c02.h" /************************************** Function:   void write_byte(uchar add,uchar dat) Description: 在24c02某一地址写一位数据 Calls:   iic_star(),iic_ack(),iicwr_byte(),iic_stop() Input:   add,dat Output;   无 Return:   无 Others:    ****************************************/ void write_byte(uchar add,uchar dat) {  scl = 1;     //初始化iic总线  sda = 1;  iic_start();  iicwr_byte(0xa0);  iic_ack();  iicwr_byte(add);  //写地址上  iic_ack();  iicwr_byte(dat);  //要写的数据  iic_ack();  iic_stop(); } /************************************** Function:   write_page(uchar *buff,uchar n,uchar add) Description: 在24c02某一地址开始,连续写一数组 Calls:   iic_star(),iic_ack(),iicwr_byte(),iic_stop() Input:   *buff(数组名),n(要写数组的个数),add(开始写的地址) Output;   无 Return:   无 Others:   采用指针进行数组的读操作 ****************************************/ void write_page(uchar *buff,uchar n,uchar add) {   uint i;      iic_start();  iicwr_byte(0xa0);  iic_ack();  iicwr_byte(add);  iic_ack();  for(i=0;i  {   iicwr_byte(buff );  //要写的数据   iic_ack();   }     iic_stop(); };i++)  /************************************** Function:   uchar read_byte(uchar add) Description: 从24c02中任一地址读取一位数据(随机读) Calls:   iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop() Input:   add(读数据的地址) Output;   无 Return:   i Others:   使用随机读的方式,可对芯片内任一地址直接读操作 ****************************************/ uchar read_byte(uchar add)   //随机读 {  uchar i;  scl = 1;       //初始化iic总线  sda = 1;  iic_start();  iicwr_byte(0xa0);  iic_ack();  iicwr_byte(add);  iic_ack();  iic_start();  iicwr_byte(0xa1);  iic_ack();  i = iicre_byte();  iic_noack();  iic_stop();  return i; } /************************************** Function:   uchar read_page(uchar *buff,uchar n,uchar add) Description: 从24c02中任一地址开始连续读操作 Calls:   iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop() Input:   *buff(数组名),n(要读数组的个数),add(开始读的地址) Output;   buff Return:   无 Others:   此函数之前需要定义一个合适大小的数组,调用本函数后,将24c02中数据读进数组中 ****************************************/ void read_page(uchar *buff,uchar n,uchar add) {  uint i;  iic_start();  iicwr_byte(0xa0);  iic_ack();  iicwr_byte(add);  iic_ack();  iic_start();  iicwr_byte(0xa1);  iic_ack();  for(i=0;i  {   buff = iicre_byte();   if(i!=n-1)   {    iic_ack();      }   else   {       iic_noack();   }  }  iic_stop();  };i++)  问题:iicwr_byte(0xa0);              iicwr_byte(0xa1);这两句不太懂。 哎,写到这儿,突然感觉自己完全没懂。          
  • 热度 14
    2013-4-15 08:43
    2140 次阅读|
    0 个评论
      #include 16F877A.h #device adc=8   #FUSES NOWDT                    //No Watch Dog Timer #FUSES HS                       //High speed Osc ( 4mhz) #FUSES NOPUT                    //No Power Up Timer #FUSES NOPROTECT                //Code not protected from reading #FUSES NODEBUG                  //No Debug mode for ICD #FUSES NOBROWNOUT               //No brownout reset #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD                    //No EE protection #FUSES NOWRT                    //Program memory not write protected   #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)   #define OP_WRITE  0xa0 #define OP_READ   0xa1   #define EEPROM_SCL  PIN_C0 #define EEPROM_SDA  PIN_C1   #bit SCL= 0x07.0 #bit SDA= 0x07.1   #bit SCLIO=0x87.0 #bit SDAIO=0x87.1   void start() {    SCLIO=0;delay_us(15);    SDA=1;delay_us(15);    SCL=1;delay_us(15);    SDA=0;delay_us(15);    SCL=0;delay_us(15); } void stop() {    delay_us(15);    SDA=0;delay_us(15);    SCL=1;delay_us(15);    SDA=1;delay_us(15); }   /* 函数功能:读取数据 出口参数:read_data */ unsigned char shin() {    unsigned char i, read_data;    //设数据脚为输入     SDAIO=1;    delay_us(15);        for(i=0;i8;i++)    {       delay_us(15);       SCL=1;       delay_us(15);       read_data=1;       if(SDA==1)       read_data=read_data+1;       delay_us(15);       SCL=0;    }    //设数据脚为输出     SDAIO=0;    return(read_data); } /* 函数功能:写入数据 入口参数:write_data */ unsigned char shout(unsigned char write_data) {    unsigned char i;    unsigned char ack;    //设数据脚为输出     SDAIO=0;        for(i=0;i8;i++)    {       if(write_data 0x80)  SDA=1;       else                   SDA=0;       delay_us(15);       SCL=1;       delay_us(15);       SCL=0;       delay_us(15);       write_data =1;    }    delay_us(15);    SDA=1;    delay_us(15);    SCL=1;        //设数据脚为输入     SDAIO=1;    delay_us(15);    ack=SDA;    SCL=0;    delay_us(15);    //设数据脚为输出     SDAIO=0;    return ack; }   /* 函数功能:向指定地址读数据 入口参数: random_addr */ unsigned char read_random(unsigned char random_addr) {    unsigned char read_data;    start();    shout(OP_WRITE);    //shout(0);    shout(random_addr);    start();    shout(OP_READ);    read_data=shin();    stop();    return(read_data); }     /* 函数功能:向指定地址写数据 入口参数: addr , write_data */ void write_byte(unsigned char addr,unsigned char write_data) {       start();    shout(OP_WRITE);    //shout(0);    shout(addr);    shout(write_data);    stop();    delay_ms(15); }     void init_ext_eeprom()  {    output_float(EEPROM_SCL);    output_float(EEPROM_SDA); } char BUFER; #int_rda                    //RS232 接收到的数据有用, 指定下面的函数是一个中断函数  void serial_isr()  {        BUFER=getc();    //putc(BUFER);    write_byte(0x01,BUFER);    //delay_ms(50);    putc (read_random(0x01) );   }      #INT_RTCC void clock_isr() {    SET_RTCC(1500);//20MHz  32分频,初值 0,刚好 1.64 mS 中断一次    //SET_RTCC(500);//20MHz  32分频,初值 0,刚好 166  uS 中断一次    //SET_RTCC(1500);//20MHz  32分频,初值 0,刚好 236  uS 中断一次    //output_toggle(PIN_B0); } void main() {    setup_adc_ports(NO_ANALOGS);    setup_adc(ADC_OFF);    setup_psp(PSP_DISABLED);    setup_spi(FALSE);    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32 |RTCC_8_BIT);    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32 );                          //设置Timer0 的时钟源为内部时钟源                          //每隔256 个脉冲,TMR0 计数 1 次                          //RTCC_8_BIT 设置Timer0 为8 位定时器方式;                          //RTCC_DIV_1 为 288 uS                          //RTCC_DIV_2 为 544 uS                          //RTCC_DIV_4 为 1.056 mS                          //RTCC_DIV_8 为 2.080 mS                          //RTCC_DIV_16 为 4.10 mS                          //RTCC_DIV_32 为 8.20 mS                              SET_RTCC(0);        setup_timer_1(T1_DISABLED);    setup_timer_2(T2_DISABLED,0,1);    setup_comparator(NC_NC_NC_NC);    setup_vref(FALSE);    enable_interrupts(int_rda);     //enable_interrupts(INT_RTCC);    enable_interrupts(GLOBAL);    // TODO: USER CODE!!    //set_tris_c(0);            //init_ext_eeprom();    write_byte(0x00,'0');delay_ms(10);    write_byte(0x01,'1');delay_ms(10);    write_byte(0x02,'2');delay_ms(10);    write_byte(0x03,'3');delay_ms(10);    write_byte(0x04,'4');delay_ms(10);    write_byte(0x05,'5');delay_ms(10);    write_byte(0x06,'6');delay_ms(10);    write_byte(0x07,'7');delay_ms(10);    write_byte(0x08,'8');delay_ms(10);    putc (read_random(0x01) );delay_ms(10);    putc (read_random(0x02) );delay_ms(10);    putc (read_random(0x03) );delay_ms(10);    putc (read_random(0x04) );delay_ms(10);    putc (read_random(0x05) );delay_ms(10);    putc (read_random(0x06) );delay_ms(10);    putc (read_random(0x07) );delay_ms(10);    putc (read_random(0x08) );delay_ms(10);    while(1)    {        //printf("Freemark!\r\n");delay_ms(1000);        //write_byte(0x02,0xaa);    } }
  • 热度 20
    2012-12-20 21:03
    2770 次阅读|
    1 个评论
    本例是用针对标准I2C接口EEPROM存储器24C02进行读写操作,只要对例程做适当修改,就可以用到大部分控制I2C接口设备的场合。   //----------------------------------------- //应广单片机软件I2C接口例程(MASTER模式) //本例仅供参考,欢迎指正程序中的问题 //2012年12月20日 // //作者:戴上举 //邮箱:daishangju@163.com //博客:forum.eet-cn.com/BLOG_daishangju_334.HTM //电话:13509678051 //Q  Q:1514292225 //----------------------------------------- .chip p201cs14a //{{PADAUK_CODE_OPTION  .Code_Option Bootup  Slow  // 1024 ILRC  .Code_Option LVD  2.79V  // Maximum performance = 4 MIPS  .Code_Option Security Enable  // Security 3/4 words Enable //}}PADAUK_CODE_OPTION //定义I2C接口 I2C_SDA equ pa.7 I2C_SCL equ pa.6 I2C_SDA_DIR equ pac.7 I2C_SCL_DIR equ pac.6 I2C_LONG_DLY equ 50 I2C_SHORT_DLY equ 20 I2C_SDA_HIGH equ set1 I2C_SDA  I2C_SDA_LOW equ set0 I2C_SDA I2C_SCL_HIGH equ set1 I2C_SCL I2C_SCL_LOW equ set0 I2C_SCL I2C_SDA_OUTPUT equ set1 I2C_SDA_DIR I2C_SDA_INPUT equ set0 I2C_SDA_DIR I2C_SCL_OUTPUT equ set1 I2C_SCL_DIR I2C_SCL_INPUT equ set0 I2C_SCL_DIR //定义I2C变量 byte i2c_rw_addr //读写地址 byte i2c_rw_byte //读写数据 byte i2c_rw_cmd //读写的器件地址 byte i2c_rw_temp //读写过程中间变量 byte i2c_rw_cnt //读写过程中间变量 // byte Xms byte ms_cnt // byte test_addr byte test_data .romadr 0x000  goto main0  goto main1 .romadr 0x010 isr_entry:  pushaf  intrq = 0  popaf  reti //---------------------------- //产生START信号 //---------------------------- i2c_start:  I2C_SDA_OUTPUT  I2C_SCL_OUTPUT  I2C_SDA_HIGH  delay I2C_LONG_DLY  I2C_SCL_HIGH  delay I2C_LONG_DLY  I2C_SDA_LOW  delay I2C_LONG_DLY  I2C_SCL_LOW  delay I2C_LONG_DLY  ret //---------------------------- //产生STOP信号 //---------------------------- i2c_stop:  I2C_SCL_LOW  delay I2C_LONG_DLY  I2C_SDA_LOW  delay I2C_LONG_DLY  I2C_SCL_HIGH  delay I2C_LONG_DLY  I2C_SDA_HIGH  delay I2C_LONG_DLY  //  I2C_SCL_INPUT  I2C_SDA_INPUT  ret //---------------------------- //检查SALVE ACK信号 //---------------------------- i2c_slave_ack:  //don't check ACK  I2C_SDA_INPUT  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  I2C_SDA_OUTPUT  I2C_SDA_LOW  delay I2C_SHORT_DLY  ret //---------------------------- //输出MASTER ACK信号 //---------------------------- i2c_master_ack:  I2C_SDA_OUTPUT  I2C_SDA_LOW  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  ret //---------------------------- //输出MASTER NACK信号 //---------------------------- i2c_master_nack:  I2C_SDA_OUTPUT  I2C_SDA_HIGH  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  ret //------------------------------ //写一个字节 //Input: i2c_rw_temp //Used:  i2c_rw_cnt //------------------------------ i2c_write_8bit:  i2c_rw_cnt = 8 i2c_write_8bit_loop:  slc i2c_rw_temp  swapc I2C_SDA  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  dzsn i2c_rw_cnt  goto i2c_write_8bit_loop  ret //------------------------------ //读一个字节 //Used:   i2c_rw_cnt //Output: i2c_rw_temp //------------------------------ i2c_read_8bit:  i2c_rw_temp = 0  i2c_rw_cnt = 8  delay I2C_SHORT_DLY i2c_read_8bit_loop:  I2C_SCL_HIGH  delay I2C_SHORT_DLY  swapc I2C_SDA  slc i2c_rw_temp  I2C_SCL_LOW  delay I2C_SHORT_DLY  dzsn i2c_rw_cnt  goto i2c_read_8bit_loop  ret //------------------------------ //Input:  i2c_rw_addr //        i2c_rw_cmd //Used:   i2c_rw_cnt //        i2c_rw_temp //Output: i2c_rw_byte //------------------------------ i2c_read_byte:  //start  call i2c_start  //write device address(write)  i2c_rw_temp = i2c_rw_cmd  call i2c_write_8bit  //slave ack  call i2c_slave_ack  //write register address  i2c_rw_temp = i2c_rw_addr  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //start repeat  call i2c_start  //write device address(read)  i2c_rw_temp = i2c_rw_cmd  i2c_rw_temp.0 = 1  call i2c_write_8bit  //slave ack  //don't check ACK  I2C_SDA_INPUT  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY //这里为特殊情况I2C_SDA不用转为输出  //read data  i2c_rw_temp = 0  call i2c_read_8bit  i2c_rw_byte = i2c_rw_temp //store data  //master nack  call i2c_master_nack  //stop  call i2c_stop  //retune  delay I2C_LONG_DLY  wdreset  ret //------------------------------ //Input:  i2c_rw_addr //        i2c_rw_byte //        i2c_rw_cmd //Used:   i2c_rw_cnt //        i2c_rw_temp //------------------------------ i2c_write_byte:  //start  call i2c_start  //write device address  i2c_rw_temp = i2c_rw_cmd  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //write register address  i2c_rw_temp = i2c_rw_addr  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //write data  i2c_rw_temp = i2c_rw_byte  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //stop  call i2c_stop  //retune  delay I2C_LONG_DLY  wdreset  ret EEPROM_RW_CMD equ 0xA0 //------------------------------ //函数名: eeprom_read_byte //Input:  i2c_rw_addr //Used:   i2c_rw_cnt //        i2c_rw_temp //Output: i2c_rw_byte //------------------------------ eeprom_read_byte:  i2c_rw_cmd = EEPROM_RW_CMD  goto i2c_read_byte //注意这里用的是跳转 //------------------------------ //函数名: eeprom_write_byte //Input:  i2c_rw_addr //        i2c_rw_byte //Used:   i2c_rw_cnt //        i2c_rw_temp //注意:  调用完后需要等待一段时间以保证写操作完成 //------------------------------ eeprom_write_byte:  i2c_rw_cmd = EEPROM_RW_CMD  goto i2c_write_byte //注意这里用的是跳转   //---------------------------------------- //input: ms //该函数以4M频率为基准时钟实现延时 //---------------------------------------- delayXms:  while(Xms)  {   wdreset   ms_cnt = 20   while(ms_cnt)   {    delay 195     ms_cnt--   }   Xms--  }  ret   main0:  .ADJUST_OTP_IHRCR 8MIPS  // IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used  sp = 0x30  disgint  inten = 0  pa = 0b0000_0000  paph = 0b1101_0000  pac = 0b0000_0001   pb = 0b0000_0000  pbph = 0b0000_0000  pbc = 0b1111_1111  I2C_SDA_INPUT  I2C_SCL_INPUT  delay 200  mov a,0b100_11_111  mov t16m,a  clkmd.1 = 1 //enable watch dog  wdreset  Xms = 100  call delayXms    test_data = 0  test_addr = 0 main0_loop:  wdreset  //写E2EPROM  i2c_rw_addr = test_addr  i2c_rw_byte = test_data  call eeprom_write_byte  //调用EEPROM写操作函数后要等待一段时间,以保证数据写操作完成  Xms = 20  call delayXms  //读E2EPROM  i2c_rw_addr = test_addr  call eeprom_read_byte  if(i2c_rw_byte != test_data)  {   //读回的数据比较出错,判断为读写E2PROM出错   nop  }  test_addr ++  test_data --    goto main0_loop //----------------FPPA1------------------- main1:   sp = 52 main1_loop:  goto main1_loop   本例代码是从实际程序中移植而来,已编译,未做最终调试
  • 热度 26
    2012-9-6 00:43
    4451 次阅读|
    1 个评论
        I2C、24C02的读写,这是个老掉牙了的问题,还有必要浪费时间来讨论吗?事情是这样,笔者在移植一个已经过验证、正确的24C32程序到《HDQ-51E》单片机学习板上、读写板上的24C02时,发现读写的过程总是很不稳定,一时无法判断是程序代码问题,还是电路故障问题,还是24C02芯片问题。经过了2天时间,最终确定是24C02芯片质量问题。更换了进口的ATMEL 24C02后,读写正常了。在此过程中,笔者编写了一些测试24C02的程序,发现这些代码也许适合单片机初学者用来学习I2C总线原理,并用来读写24C02存储器,因为这些代码更简单易用。     大家已经见过了很多有关I2C、24C02的单片机程序,为了实现对24C02的读写,一般都需要7、8个函数,甚至更多。其实,只需要4个函数(加上一个延时函数),就能很容易地实现I2C读写,见下: sbit SDA = P2^6;     //管脚定义 sbit SCL = P2^7; //SCL时钟的频率对于正确操作E2很重要;一般地,频率要求100KHz。 void i2c_dly(void) {  DelayNms(1);     //ok } //IIC最基本的操作可以归结为下面4个函数:启始、停止、写、读 //IIC start void i2c_start(void) {   SDA = 1;             // i2c start bit sequence   i2c_dly();   SCL = 1;   i2c_dly();   SDA = 0;   i2c_dly();   SCL = 0;   i2c_dly(); } //IIC stop void i2c_stop(void) {   SDA = 0;             // i2c stop bit sequence   i2c_dly();   SCL = 1;   i2c_dly();   SDA = 1;   i2c_dly(); } //IIC read //ack: 主机发送ACK位 unsigned char i2c_rx(char ack) {   char x, d=0;     SDA = 1;   for(x=0; x8; x++) //读8个bit,高bit在前  {     d = 1;     //存储中间结果     do   {       SCL = 1;     }     while(SCL==0);    //如果SCL被IIC设备拉低,则等待       i2c_dly();     if(SDA) d |= 1;  //读取数据线     SCL = 0;   }    //发送ACK/NACK   if(ack) SDA = 1;   else SDA = 0;     SCL = 1;   i2c_dly();             // send (N)ACK bit   SCL = 0;   SDA = 1;   return d; } //IIC write //d: 待发送字节,高位先发送 //返回:0 -- ACK, 1 -- NACK bit i2c_tx(unsigned char d) {   char x;   static bit b;    for(x=8; x; x--) //发送8个bit  {     if(d0x80) SDA = 1;     else SDA = 0;     i2c_dly();       SCL = 1;     i2c_dly();     d = 1;     SCL = 0;     i2c_dly();   }     SDA = 1;   SCL = 1;   i2c_dly();   b = SDA;          //读取ACK bit   SCL = 0;   i2c_dly();   return b; }     这4个函数完成最基本的I2C时序:起始、停止、写8bit、读8bit。通过对这4个函数合理组合,即可实现24C02的单字节读写,见附件例程。这是一个测试24C02是否有正确的ACK响应的程序,例子中的24C02设备地址为A0。     24C02读写时序图:   《HDQ-51E》51学习板: http://item.taobao.com/item.htm?spm=a1z10.1.11.5id=15769166730 。 欢迎加入单片机技术讨论QQ群:231033072,互相帮助、共同提高。 (待续) (本文最初发表于ENDCHINA,转载请注明出处,谢谢!)        
相关资源
  • 所需E币: 1
    时间: 2022-8-3 22:41
    大小: 18.63KB
    上传者: xyzzyxaaa
    【实验65】24c02存储器.zip
  • 所需E币: 1
    时间: 2022-8-3 22:41
    大小: 18.67KB
    上传者: xyzzyxaaa
    【实验66】24c02存储器读写基本驱动2.zip
  • 所需E币: 1
    时间: 2022-8-3 22:42
    大小: 18.27KB
    上传者: xyzzyxaaa
    【实验68】24c02存储多个数据.zip
  • 所需E币: 1
    时间: 2022-8-3 22:42
    大小: 15.12KB
    上传者: xyzzyxaaa
    【实验69】24C02格式化.zip
  • 所需E币: 1
    时间: 2022-8-3 22:42
    大小: 19.19KB
    上传者: xyzzyxaaa
    【实验70】24c02记录按键次数.zip
  • 所需E币: 1
    时间: 2022-8-3 22:42
    大小: 21.33KB
    上传者: xyzzyxaaa
    【实验71】24c02记忆大于255的数值.zip
  • 所需E币: 1
    时间: 2021-4-14 21:17
    大小: 1.38MB
    上传者: xgp416
    24C022K4K8K,16K,32K位和64K位串行IC总线EEPROM芯片中文资料
  • 所需E币: 0
    时间: 2021-4-13 18:46
    大小: 1.3MB
    上传者: wxlai1998
    24C022K4K8K,16K,32K位和64K位串行IC总线EEPROM芯片中文资料.rar
  • 所需E币: 1
    时间: 2021-4-7 16:43
    大小: 21.42KB
    上传者: zendy_731593397
    24c02是一个非挥发eeprom存储器器件,采用的IIC总线技术。24c02在许多试验中都有出现。24c02的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。该资料包括说明文档和源代码,主要功能是实现24c02写入一个字节
  • 所需E币: 1
    时间: 2021-4-7 16:46
    大小: 45.51KB
    上传者: zendy_731593397
    在主程序中,我们将写入的0x02位置的数据读出来放在c1中,新写了一个数据0x99在0x03位置中,并立即将它读出来放在c2中。编译,运行,等P10灯亮后查看结果包括说明文档,源代码
  • 所需E币: 1
    时间: 2021-4-7 16:47
    大小: 27.57KB
    上传者: zendy_731593397
    我们用24c02完成一个实际应用的场合,在24c02中记录按键次数并用二机制显示在4个LED上。下次开机时,将继续显示上次的按键次数。这些工作在工控领域有十分广泛的应用。我们将在第一次运行过后,再断点,学习DX516的脱机运行,并看运行结果。包括功能实现的源代码和说明文档
  • 所需E币: 0
    时间: 2020-5-25 15:18
    大小: 2.59KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 4
    时间: 2019-12-25 06:17
    大小: 67.24KB
    上传者: 16245458_qq.com
    FPGA模拟I2C协议读写24C02……
  • 所需E币: 3
    时间: 2019-12-24 22:20
    大小: 7.6KB
    上传者: wsu_w_hotmail.com
    STM32F103ZET6读写24C02,超级终端显示……
  • 所需E币: 4
    时间: 2020-1-15 16:24
    大小: 53.5KB
    上传者: rdg1993
    ATMEL24c02使用详解ATMEL24c02使用详解I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。CPU不仅能通过指令将某个功能单元电路挂*或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。I2C总线接口电路结构如图1所示。2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作于发送或接收方式。当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在总线上,既没有中心机,也没有优先机。总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。3.I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑“与”完成……
  • 所需E币: 4
    时间: 2019-12-19 14:01
    大小: 484.85KB
    上传者: quw431979_163.com
    AT24C02……