IIC读写AT24C02代码1——通过串口命令控制R/W

发布者:CrystalSparkle最新更新时间:2019-05-21 来源: eefocus关键字:IIC读写  AT24C02  串口命令  控制R 手机看文章 扫描二维码
随时随地手机看文章

IIC读写AT24C02代码1——通过串口命令控制R/W,并显示到串口!


主函数


/*-----------------------------------------------

  IIC编程 1

  编写:Louis 

  邮箱:kaly.liu@163.com

  日期:2015.05.25

  修改:通过串口命令,控制EEPROM的读写。并从串口提示。

  晶振:11.0592MHZ

------------------------------------------------*/

#include

 

#include

#include"uart.h"

#include "iic.h"

 

sbit WP=P1^0;

unsigned char idata temp[8];

unsigned char rxnum;

unsigned char flag2;

unsigned char EEPROM_WR_FLAG=0;

 

code const char str1[] = "The string is 来自单片机!rn";

code const char str2[] = "Author: louis rn";

 

//const  限定一个变量不允许被改变。在一定程度上提高程序安全性和可靠性

//code 存储区间为 程序存储区

/***************函数声明*******************/

void InitUART(void);

void SendOneByte(uint8);

void SendrStr(uint8 *ptr);

 

 

 

void main(void)

{

  unsigned char Control,*p1,*p2;

  unsigned char buf1[]="hello321"; /* 发送缓冲区 */

  unsigned char buf2[9]; /* 接收缓冲区 */

 

 

  unsigned char Length;

  unsigned int addr ,i=0; /* 24Cxx片内地址 */

       WP=0;

//    P4SW|= 0x10;

 

    InitUART();

 

    while(str2[i]!='')

    {

SendOneByte(str2[i++]);

    }

 

    SendrStr(str1);

 

 

 

ES =1;

// ET1=0;

EA =1;

 

 

  p1=buf1;

  p2=buf2;

 

 

  addr=8; ////片内地址 AT24C02为0~256 , 32page*8byte = 256个字节/////

  Length=8; ////// 读写长度 //////

  enumer=AT2402; /// 读写AT24C02////

 

while(1){

if(EEPROM_WR_FLAG=='W'){

  Control=0xae; ///  1010 1110 写操作///

  RW24xx(p1,Length,addr,Control,enumer); // 写操作 //

  for(i=0;i<10000;i++);    

  //要加入延时···才可正确的读取数据!  

  //在STOP和START之间有个 write cycle,一般有个最大值Twr.这是设备内部进行写入数据需要的时间,所以此处的延迟需要 大于这个 最大值Twr。

  // Delay(1000);//1:6.18us; 2:8.36us 3:10.55us △=2.18us

   EEPROM_WR_FLAG=0;

  }

 

 if(EEPROM_WR_FLAG=='R'){

  Control=0xaf; ///读操作///

  RW24xx(p2,Length,addr,Control,enumer);// 读 

   EEPROM_WR_FLAG=1;

  SendrStr(p2);

  SendrStr("rn");

 

  }

 

 }//while

 

}

 

 

/****************中断服务函数***************/

void UART_ISR(void) interrupt 4

{

    uint8 RX_Data;

    //只响应"接收"中断,"发送"中断来了就直接抹掉

    if(RI)

   {

     RI = 0; //串口中断标志不能自己清除,需要手动清除

     RX_Data=SBUF;

EEPROM_WR_FLAG = RX_Data;

     SendOneByte(EEPROM_WR_FLAG);

SendrStr(":rn");

   }

   else

     TI = 0; //串口发中断是发送完缓冲区数据之后产生

}


IIC.h


/*-----------------------------------------------

  编写:Louis 

  邮箱:kaly.liu@163.com

  日期:2015.05

  修改:无

  器件的型号 我用的是AT24C02   32PAGE*8BYTE = 2Kbit

------------------------------------------------*/

#include

#include

 

 

#define  ERROR 10     //允许ERROR的最大次数  

     

sbit     SDA=P1^2;

sbit     SCL=P1^1;

 

 

enum  eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型号 我用的是AT24C02*/

enum  eepromtype enumer;   //定义一个枚举变量

 

 

 

 

/* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */

void Delay(unsigned char DelayCount)

{ while(DelayCount--);   //判断 + 执行 2个机器周期

}

/* * * * * 以下是对IIC总线的操作子程序 * * * * */

/* * * * * * 启动总线 * * * * */

void Start(void)

{ SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示 */

  SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行 */

  Delay(2);

  SCL=1;

  Delay(2);

  SDA=0;

  Delay(2);

  SCL=0;

  SDA=1;

  Delay(2);     

}

 

 

 

/* * * * * 停止IIC总线 * * * * */

void Stop(void)

{ SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平 */

  SDA=0; /*表示一个"停止"状态,该状态终止所有通讯 */

  Delay(2);

  SCL=1;

  Delay(2); /* 空操作 */

  SDA=1;

  Delay(2);

  SCL=0;

  Delay(1000);

}

 

 

/* * * * * 检查应答位 * * * * */

bit RecAck(void)

{ SCL=0;

  SDA=1;

  Delay(20);

  SCL=1;

  Delay(2);

  Delay(2);

  CY=SDA;     /* 因为返回值总是放在CY中的 */

  SCL=0;

  Delay(20);

  return(CY);

}

 

 

/* * * * *对IIC总线产生应答 * * * * */

void Ack(void)

{ SDA=0; /* EEPROM通过在收到每个地址或数据之后, */

  SCL=1; /* 置SDA低电平的方式确认表示收到读SDA口状态 */

  Delay(2);

  SCL=0;

  Delay(2);

  SDA=1;

}

 

 

/* * * * * * * * * 不对IIC总线产生应答 * * * * */

void NoAck(void)

{ SDA=1;

  SCL=1;

  Delay(2);

  SCL=0;

}

 

/* * * * * * * * * 向IIC总线写数据 * * * * */

void Send(unsigned char sendbyte)

{ unsigned char data j=8;

  for(;j>0;j--)

  { SCL=0;

    sendbyte <<= 1; /* 使CY=sendbyte^7; */

    SDA=CY; /* CY 进位标志位 */

Delay(2);

    SCL=1;

Delay(20);

  }

  SCL=0;

  Delay(2);

}

 

/* * * * * * * * * 从IIC总线上读数据子程序 * * * * */

unsigned char Receive(void)

{ register receivebyte,i=8;

  SCL=0;

  while(i--)

  { SCL=1;

    receivebyte = (receivebyte <<1 ) | SDA;

Delay(2);

    SCL=0;

 //  receivebyte = (receivebyte <<1 ) | SDA;   //不能放在这里啊,放这里接受数据出错··!!

Delay(2);

  }

  return(receivebyte);

}

 

/* -----  AT24C01~AT24C256 的读写程序 ------ */

bit   RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,

                     unsigned char Control,enum eepromtype enumer)

 

  unsigned char data j,i=ERROR;

  bit errorflag=1;  /*   出错标志   */

  while(i--)

  { Start();  /*   启动总线   */

    Send(Control & 0xfe); /*   向IIC总线写数据,器件地址 */

    if(RecAck()) continue; /*   如写不正确结束本次循环   */

    if(enumer > AT2416)

    { Send((unsigned char)(Addr >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址

       if(RecAck())  continue;

    }

    Send((unsigned char)Addr); /*   向IIC总线写数据   */

    if(RecAck())  continue; /*   如写正确结束本次循环   */

    if(!(Control & 0x01))   //判断是读器件还是写器件 如果是写 0 就进去执行

    { j=Length;

       errorflag=0;         /* 清错误特征位 */

       while(j--)

      { Send(*DataBuff++); /*   向IIC总线写数据   */

         if(!RecAck()) continue; /*   如写正确结束本次循环   */

        errorflag=1;

         break;

       }

      if(errorflag==1) continue;

// SendOneByte('O');

      break;

    }

    else

    { Start();  /*   启动总线   */

      Send(Control); /*   向IIC总线写数据   */

      if(RecAck()) continue;//器件没应答结束本次本层循环

      while(--Length)  /*   字节长为0结束   */

      { *DataBuff ++= Receive();

         Ack();   /*   对IIC总线产生应答   */

       }

      *DataBuff=Receive(); /* 读最后一个字节 */

      NoAck();  /*   不对IIC总线产生应答   */

      errorflag=0;

      break;

    }

  }

  Stop();  /*   停止IIC总线   */

  if(!(Control & 0x01))

  { 

  Delay(255);

  Delay(255);

  Delay(255);

  Delay(255); 

  }

  return(errorflag);

}

 


uart.h


 

/*-----------------------------------------------

  编写:Louis 

  邮箱:kaly.liu@163.com

  日期:2015.05

  修改:无

------------------------------------------------*/

 

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        

 

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

请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度

(1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16

(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32

例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200

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

#define FOSC 11059200 //振荡频率

#define BAUD 9600 //波特率

#define SMOD 1 //是否波特率加倍

#if SMOD

#define TC_VAL (256-FOSC/16/12/BAUD)

#else

#define TC_VAL (256-FOSC/32/12/BAUD)

#endif

 

typedef unsigned char uint8;

typedef unsigned int uint16;

 

 

 

 

 

/****************串口初始化函数*************/

void InitUART(void)

{

    TMOD = 0x20;    //定时器1,模式2工作模式    

    SCON = 0x50;    //串口工作模式1,允许REN   /* SCON: 模式 1,  8-bit UART, 使能接收         */

    TH1 = TC_VAL;

    TL1 = TH1;

    PCON = 0x80; //发送速率加倍

    ES = 1;

    EA = 1;

    TR1 = 1;

}

/**************串口发送字符函数*************/

void SendOneByte(uint8 c)

{

    ES = 0; //禁止中断,让串口安心工作啊

    SBUF = c;

    while(!TI); //等待发送完毕

    TI = 0; //清TI中断

    ES = 1; //打开中断

}

/**************串口发送字符串函数*************/

 

/**************串口发送字符串函数*************/

void SendrStr(const uint8 *ptr)

{

    

for(;*ptr!='';ptr++)

{

   SendOneByte(*ptr);

}

}

 

/****************中断服务函数***************/

/*

void UART_ISR(void) interrupt 4

{

    uint8 RX_Data;

    //只响应"接收"中断,"发送"中断来了就直接抹掉

    if(RI)

   {

     RI = 0; //串口中断标志不能自己清除,需要手动清除

     RX_Data=SBUF;

     SendOneByte(RX_Data);

   }

   else

     TI = 0; //串口发中断是发送完缓冲区数据之后产生

}

*/

关键字:IIC读写  AT24C02  串口命令  控制R 引用地址:IIC读写AT24C02代码1——通过串口命令控制R/W

上一篇:IIC读写AT24C02代码2——串口命令控制多页读写
下一篇:STC89C52单片机——串口发送程序2

推荐阅读最新更新时间:2024-10-23 12:58

IIC读写AT24C02代码1——通过串口命令控制R/W
IIC读写AT24C02代码1——通过串口命令控制R/W,并显示到串口! 主函数 /*----------------------------------------------- IIC编程 1 编写:Louis 邮箱:kaly.liu@163.com 日期:2015.05.25 修改:通过串口命令,控制EEPROM的读写。并从串口提示。 晶振:11.0592MHZ ------------------------------------------------*/ #include REG52.H #include string.h #include uart.h #include iic.h
[单片机]
IIC读写AT24C02代码2——串口命令控制多页读写
通过串口输入 R 、W 进行控制程序读写IIC设备。波特率9600bps,晶振115200HZ。 main.c /*----------------------------------------------- IIC编程 1 编写:Louis 邮箱:kaly.liu@163.com 日期:2015.06.01 修改:通过串口命令R/W,控制EEPROM的读R写W。并从串口提示。 改进:增加对页读写功能 晶振:11.0592MHZ NOTE:*通过实测发现,AT24C02可以连续写入16BYTE字节,而且地址要连续的两个页。就是0~15,16~31,。。。 -------------------------
[单片机]
STM32 IIC读写AT24C02(二)
上次已经完成了IIC读写AT24C02的协议层,现在开始编写读写AT24C02的驱动函数。先从单字节的读写开始。 字节写要求在接收器件地址和ACK应答后,接收位的字地址。接收到这个地址后AT24C02应答“0”,然后是一个8位数据。在接收8位数据后,AT24C02应答“0”,接着必须由主器件发送停止条件来终止写序列。 此时AT24C02进入内部写周期tWR,数据写入非易失性存储器中,在此期间所有输入都无效。直到写周期完成,AT24C02才会有应答。 void AT24C02_ByteWrite(u8 wordAdd,u8 dat,s8 *err) { u8 ack = 0; IIC_Start(); IIC_
[单片机]
STM32 <font color='red'>IIC</font><font color='red'>读写</font><font color='red'>AT24C02</font>(二)
51通过IO口模拟IIC实现AT24C02读写
1.硬件连接 AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。在单片机上的应用广泛, 可以实现掉电数据不丢失功能。 2.AT24C02读写时序说明: (1)写数据描述: 通过IIC几种信号的组合,可以向AT24C02指定单元地址写一字节的数据。 可以看出,写顺序为:起始,写器件地址,应答,写单元地址,应答,写数据,应答,终止。 (2)读数据描述 从AT24C02任意单元地址读取数据,可以看出读写顺
[单片机]
51通过IO口模拟<font color='red'>IIC</font>实现<font color='red'>AT24C02</font>的<font color='red'>读写</font>
基于51单片机IIC通信的AT24C02学习笔记
引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。主要包括启始、停止、读、写、应答信号。这种方式简化了信号传输总线接口。 IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信
[单片机]
基于51单片机<font color='red'>IIC</font>通信的<font color='red'>AT24C02</font>学习笔记
PIC16F877A单片机 (IIC总线+AT24C02芯片)
1 基本原理 1.1 IIC总线 需要注意的是,高四位对于同种芯片而言,都是一样的。例如AT24C02芯片的高四位固定为1010。 1.2 AT24C02芯片 2 源代码 /*---------------------函数功能: IIC总线 AT24C02 -----------------------------------------*/ #include pic.h // 调用PIC16f87XA单片机的头文件 #include delay.h //调用延时子函数的头文件 __CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关
[单片机]
PIC16F877A单片机 (<font color='red'>IIC</font>总线+<font color='red'>AT24C02</font>芯片)
STM32-IIC通信(基于AT24C02的软件IIC通信)
IIC是什么? IIC是一种通信是一种由 PHILIPS 公司开发的两线式串行总线。IIC是用来传输数据的,也是一种通信协议。 IIC的特点: IIC总线简单而有效,占用的PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。IIC总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。高速 IIC 总线一般可达 400kbps 以上。 IIC的通信时序: I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开
[单片机]
STM32-<font color='red'>IIC</font>通信(基于<font color='red'>AT24C02</font>的软件<font color='red'>IIC</font>通信)
【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用。 但是在我们的HAL库中,对硬件IIC做了全新的优化,使得之前软件IIC几百行代码,在HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处 这可能是目前关于STM32CubeMX的硬件iic 讲的最全面和详细的一篇文章之一了 所用工具: 1、芯片: STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5、II
[单片机]
【STM32】HAL库 STM32CubeMX教程十二---<font color='red'>IIC</font>(读取<font color='red'>AT24C02</font> )
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved