久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 常用芯片 >> 瀏覽文章

24C01讀寫的c51源程序

作者:佚名   來源:本站原創(chuàng)   點擊數:  更新時間:2007年08月12日   【字體:

1.iic 方式

/*--------------------------24C01的IIC 讀寫的c51程序----------------------------------------------------
程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經過驗證。
        Atmel 24C01 比較特殊,為簡約型.
        51晶振為11.0592MHz
-----------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"

sbit SCL= P1^5;
sbit SDA= P1^4;

delay()
{
unsigned int i=1200;
while(i--);
}
/*----------------------------------------------------------------------------
調用方式:write_8bit(unsigned char ch)  ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
-------------------------------------------------------------------------------
*/
void  write_8bit(unsigned char ch)
{
    unsigned char i=8;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    while (i--)
    {
        SDA=(bit)(ch&0x80);
        _nop_();_nop_();_nop_();_nop_();_nop_();
        ch<<=1;
        SCL=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();
        SCL=0;
        _nop_();_nop_();_nop_();_nop_();_nop_();
    }
    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

/*------------------------------------------------------------------------------
調用方式:void ACK(void)  ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
-------------------------------------------------------------------------------
*/
void ACK(void)
{
   unsigned char time_1;
    SDA=1;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL=1;
    time_1=5;
    while(SDA) {if (!time_1) break;} //ACK
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
}


unsigned char ReadIIC_24C01(unsigned char address)
{
      unsigned char ddata=0;
      unsigned char i=8;

    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;             //START

    write_8bit( (address<<1) | 0x01);   //寫頁地址和操作方式
    ACK();

    while (i--)
    {
        SDA=1;
        ddata<<=1;
        SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
        if (SDA) ddata|=0x01;
    }

    SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        SDA=1;   //STOP
    delay();
    return ddata;

}


void WriteIIC_24C01(unsigned char address,unsigned char ddata)
{

    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;             //START

    write_8bit( (address<<1) & 0xfe);   //寫頁地址和操作方式,對于24C32-
24C256,page不起作用
    ACK();
    write_8bit(ddata);      //發(fā)送數據
    ACK();
    SDA=0;
        _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        SDA=1;   //STOP
        delay();
}


2.這是一個讀寫24C系列EEPROM的程序,已經經過本人親自測試,通過!!!!!

//*************************************
//**  M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256
//**  21c01,24c02:1010A2A1A0R/W; 24C04:1010A2A1P0R/W; 24C08:1010A2P1P0R/W
//**  24C16:1010P2P1P0R/W; //**  以上6種芯片的讀寫格式為:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop
//**  進行讀寫的字節(jié)數,EEPROM首址,EEPROM控制字節(jié),
//**  以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多:  
//**  以上5種芯片的讀寫格式為:start-device addr-ack-word addr-ack-data-ack-stop
//**  24c32-24c512:1010A2A1A0R/W; 24C1024:1010A2A1P0R/W; 24c1024:1010A2A1P0R/W //**  通用的24C01-24C1024共11種EEPROM的字節(jié)讀寫操作程序, 

//**************************24C01讀寫的c51源程序***********************************
#i nclude <reg51.h>
#i nclude <string.h>
#i nclude <stdio.h>
#i nclude <intrins.h>

sbit SDA =P1^1;
sbit SCL =P1^4;
sbit WP =P1^7;
sbit  light =P1^0;
sbit  power =P1^6;

#define   uchar   unsigned char
#define   uint    unsigned int

void iic_delay10ms();
void iic_delay(void);
void iic_start(void);
void iic_stop(void);
void iic_ack(void);
void read_byte(void);
void send_byte(void);
void initial(void);
void ok(void);
void error(void);
void read_eeprom(void);
void write_eeprom(void);
void init(void);

uchar  ack_flag,send_data,receive_data[32];
uchar  rw,type,device_addr,addr[3],num;

void main(void)
{
 initial();
 power =0;
 light =0;

 while(1)
 {
  ES =1;
  rw =0x55;
   WP =0;
  while(rw ==0x55);
  ES =0;
  switch(type)
   {
    case 0x01:
    case 0x02:
    case 0x04:
    case 0x08:
    case 0x16: 
     type =0x02;
     addr[1] |=0xa0;
     device_addr <<=1;
     addr[1] |=device_addr;
     break;
    default:
     type =0x03;
     addr[2] |=0xa0;
     device_addr <<=1;
     addr[2] |=device_addr;    
   }
  if(rw ==0x01)  //讀EEPROM
  {
   read_eeprom();
  }
  else if(rw ==0x00) //寫EEPROM
  {
   write_eeprom();
  }
  else        //error command
  {  
   error();
   ACC =0x01;
   SBUF =ACC;
   while(!TI);
   TI =0; 
  }  
 }
}

void read_eeprom(void)
{
 uchar i;
 WP =1;
 iic_start();
 for(i=1;i<=type;i++)
  {
   send_data =addr[type-i];
   send_byte();
   iic_ack();
   if(ack_flag ==0x01)
    break;
  }
 if(ack_flag ==0x00)
  {
   iic_start();
   addr[type-1] |=0x01;
   send_data =addr[type-1];
   send_byte();
   iic_ack();
   if(ack_flag ==0x00)
   {   
    for(i=0;i<num;i++)
     {
      read_byte();
      SBUF =send_data;
      while(!TI);
      TI =0;
      SDA =0;
      SCL =1;
      iic_delay();
      SCL =0;
     }
    iic_stop();
    rw =0x55;
   }
   else
   {
    error();
    ACC =0x03;
    SBUF =ACC;
    while(!TI);
    TI =0;
   }
  }
 else
  { 
   error();
   ACC =0x02;
   SBUF =ACC;
   while(!TI);
   TI =0;
  }
}

//如果你對本程序或者24C01讀寫還有什么疑問,歡迎到http://www.zg4o1577.cn的論壇去交流。

void write_eeprom(void)
{
 uchar i;
 WP =0;
 iic_start();
 for(i=1;i<=type;i++)
  {
   send_data =addr[type-i];
   send_byte();
   iic_ack();
   if(ack_flag ==0x01)
    break;
  }
 if(ack_flag ==0x00)
 {
  for(i=0;i<num;i++)
  {
  send_data =receive_data[i];
  send_byte();
  iic_ack();
  iic_delay10ms(); 
  }
   iic_stop();
   rw =0x55;
 }
 else
 {
  error();
  ACC =0x04;
  SBUF =ACC;
  while(!TI);
  TI =0;
 }
}


void read_byte(void)
{
 uchar  i,temp=0x80;
 send_data =0x00;
 SCL =0;
  for(i=0;i<8;i++)
  {
  SDA =1;
  SCL =1;
    if(SDA)
   send_data |=temp;
    temp/=2;   
    SCL =0;
    iic_delay();
  }
}

void send_byte(void)
{
  uchar  i,temp=0x80;
  for(i=0;i<8;i++)
  {
    if((send_data&temp)==temp)
    {
      SDA =1;      //sda=1
    }
  else
    {
      SDA =0;     //sda=0
    }
     temp /=2;
     iic_delay();
     SCL =1;
     iic_delay();
     SCL =0;
     iic_delay();
  }
}

void iic_start(void)
{
 SDA =1;
 SCL =1;
 WP =0;
 iic_delay();
 SDA =0;
 iic_delay();
 SCL =0;
}

void iic_stop(void)
{
 SDA =0;
 SCL =1;
 iic_delay();
 SDA =1;
 //WP =1;
}

void    iic_ack(void)
{
 ack_flag =0x00;       //ack_flag等于0x00時有應答
 SDA =1;     
   iic_delay();
  SCL =1;
    iic_delay();
    if(SDA)
    {
      ack_flag =0x01;
    }
    SCL =0;
}

void    iic_delay(void)
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}

void   iic_delay10ms(void)
{
#pragma ASM
 mov  r6,#200
 mov  r7,#10
delay:
 nop
 nop
 nop
 djnz r6,delay
 mov  r6,#200
 djnz r7,delay
#pragma ENDASM
}

void initial(void)
{
 TMOD =0x21;
 TH1 =0xfd;
 TL1 =0xfd;
 TH0 =0xfd;
 TL0 =0xfd;
 SCON =0x50;
 TR1 =1;
 EA =1;
 ES =1;
 ET0 =1;
 PT0 =1;
}

void ok(void)
{
 ACC =0x55;
 SBUF =ACC;
 while(!TI);
 TI =0;
 ACC =0xaa;
 SBUF =ACC;
 while(!TI);
 TI =0;
}

void error(void)
{
 ACC =0xaa;
 SBUF =ACC;
 while(!TI);
 TI =0;
 ACC =0x55;
 SBUF =ACC;
 while(!TI);
 TI =0;
 rw =0x55;
}
void es_int(void)interrupt 4
{
 uchar i;
 RI =0;
  type =SBUF;      //型號
  while(!RI);
  RI =0;
  device_addr =SBUF;  //器件地址
  for(i=0;i<3;i++)
  {
   while(!RI);
   RI =0;
   addr[2-i] =SBUF;  //地址高、中、低位字節(jié)
  } 
  while(!RI);
  RI =0;
  num =SBUF;      //要操作的字節(jié)數
  while(!RI);
  RI =0;
  rw =SBUF;
  if(rw ==1)      //接收到要讀的命令
  {
   ok();
  }
  else         //接收到要寫的命令
  {  
   for(i=0;i<num;i++)
   {
    while(!RI);
    RI =0;
    receive_data[i]=SBUF;
   }  
   ok();
  }
  //else
  //{
  // error();
  //}
}

關閉窗口

相關文章

主站蜘蛛池模板: 国产免费观看久久黄av片涩av | 欧美黄页 | 国产精品久久久久久久久久久免费看 | 久久免费精品 | 黄色一级电影在线观看 | 欧美国产日韩在线观看 | 毛片大全| 日日操夜夜操天天操 | 欧美性video 精品亚洲一区二区 | 日韩成年人视频在线 | 日韩免费毛片视频 | 国产成人精品亚洲日本在线观看 | 91中文字幕在线观看 | 国产精品1区 | 超碰成人免费 | 深爱激情综合 | 91高清视频| 久久9视频| 国产高清一区二区三区 | 丝袜 亚洲 另类 欧美 综合 | 久久久久久久久久久高潮一区二区 | 欧美一区二区三区大片 | 精品一区二区三区免费视频 | 91社区在线观看播放 | 一区二区三区高清在线观看 | 日韩三级| 欧美视频免费在线观看 | 国产一区二 | 国产在线播 | 日韩精品一区中文字幕 | 成人免费网站视频 | 欧美一级免费看 | 国产成人精品高清久久 | 国产精品一区在线观看 | 日韩激情视频一区 | 久久亚洲一区二区三区四区 | 亚洲品质自拍视频 | 国产亚洲一区二区三区 | www.色53色.com| 综合久久99| 男女污网站 |