蓝桥杯单片机之AT24C02模块的使用

蓝桥杯单片机之AT24C02时钟模块的使用

  • 简介部分
  • EEPROM
  • AT24C02
  • 引脚示意
  • 设备地址 Device Address
  • 基本操作
  • 字节写入:分析手册
  • 字节读取(随机读取:根据需要读取的地址进行读取):分析手册
  • 读与写函数代码
  • 实例代码(显示开机次数)
  • 简介部分

    EEPROM

    EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种 掉电后数据不丢失 的存储芯片。

    可以参考ROM、PROM、EPROM、EEPROM、Flash ROM的区别

    AT24C02

    AT24C02 提供2048 位串行电可擦除可编程只读存储器(EEPROM ),内部有256个字,每个字8位,即2k Bit。通过 IIC串口总线 访问。

    引脚示意

    Pin Name Function 译文
    A0 – A2 Address Inputs 地址输入
    SDA Serial Data 串行数据
    SCL Serial Clock Input 串行时钟线
    WP Write Protect 写入保护
    NC No Connect 无连接
    GND Ground 接地
    VCC Power Supply 电源

    设备地址 Device Address

    手册:

    24C02的设备地址包括固定部分和可编程部分。可编程部分需要根据硬件引脚A0、A1和A2来设置(蓝桥杯板子原理图显示是接地,所以都为低电平0)。设备地址的最后一位用于设置数据传输的方向,即读/写位。格式如下图:

    综合起来就是:AT24C02的设备的读操作地址为:0xA1;而写操作地址则为:0xA0。

    基本操作

    只分析常用的两个,其他操作可以查看手册去了解时序

    字节写入:分析手册


    从左到右分别为:起始(START)——>设备地址(Device Address)——>应答信号(ACK)——>数据字地址(WORD ADDRESS)——>应答信号(ACK)——>写入数据(DATA)——>应答信号(ACK)

    字节读取(随机读取:根据需要读取的地址进行读取):分析手册


    从左到右分别为:虚拟写入(DUMMY ARITE)——>应答信号(ACK)——>起始(START)——>设备地址(Device Address)——>应答信号(ACK)——>读取数据(DATA)——>应答信号(ACK)

    虚拟写入(DUMMY ARITE):归零IIC 从设备的微控制器 的内部字节地址计数器( internal address counter)
    如果直接发送器件地址(也就是进行当前地址读),那么它读出来的是当前计数器所指的地址:(因为只要不断电,the internal address counter 就会保持之前的值, 比如之前先对计数器0指的地址写了一个数据,此时计数器会累加到1, 然后接着进行当前地址读操作,此时读出的数据将是计数器1所指的地址的数据。
    应答信号(ACK):在读操作中,24C02在发送一个8位数据后会释放SDA线并监视应答信号。一旦收到应答信号,将继续发送数据。如果主机没有发送应答信号,从机则停止发送数据且等待一个停止信号。

    读与写函数代码

    //------------------------------------------------------//
    //添加两个函数:写入与读取
    //写函数
    void Write_24C02(unsigned char addr, unsigned char dat)
    {
    	IIC_Start();		//IIC总线起始信号					
    	IIC_SendByte(0xa0); 	//24C02的写设备地址
    	IIC_WaitAck();		//等待从机应答	
    	IIC_SendByte(addr); 	//内存字节字节
    	IIC_WaitAck(); 		//等待从机应答	
    	IIC_SendByte(dat); 	//写入目标数据
    	IIC_WaitAck();		//等待从机应答	
    	IIC_Stop();		//IIC总线停止信号		
    }
    //读函数
    unsigned char Read_24C02(unsigned char addr)
    {
    	unsigned char tmp;
    	//进行一个虚拟写操作
    	IIC_Start();		//IIC总线起始信号					
    	IIC_SendByte(0xa0); 	//24C02写设备地址
    	IIC_WaitAck();		//等待从机应答	
    	IIC_SendByte(addr); 	//内存自己地址
    	IIC_WaitAck(); 		//等待从机应答	
    	//进行字节读操作
    	IIC_Start();		//IIC总线起始信号					
    	IIC_SendByte(0xa1); 	//24C02读设备地址
    	IIC_WaitAck();		//等待从机应答	
    	tmp = IIC_RecByte();	//读取目标数据
    	IIC_SendAck(1); 		//产生非应答信号		
    	IIC_Stop();		//IIC总线停止信号			
    	return tmp;
    }
    

    实例代码(显示开机次数)

    为了方便调试,只设置显示最高9次

    #include "reg52.h"
    #include "iic.h"
     
    unsigned char dat1 = 0, dat2 = 0, dat3 = 0;
    int value;
    unsigned char SMG_NoDot[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff}; //0-9、A-F、'-'、'.'
    
    void Delay500us();
    void Display_right(long int number);
    void Digital_Tube(unsigned char Position,unsigned char Typeface);
    
    void Delay500us()		//@12.000MHz
    {
    	unsigned char i, j;
    
    	i = 6;
    	j = 211;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void Digital_Tube(unsigned char Position,unsigned char Typeface)    //Position是数码管第几位(从左到右,0开始),Typeface是显示的字样
    {   
        unsigned char Bit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};       
    	P2 = P2 & 0x1f | 0xc0;
    	P0=Bit[Position];
    	P2 = P2 & 0x1f | 0xe0;
    	P0=SMG_NoDot[Typeface];
    	Delay500us();
    	P0=0XFF;
    	P2 = P2 & 0x1f ;	//数码管消影
    }
    
    void Display_right(long int number)		//靠右显示开机次数
    {
        long int i,a,b;
        for(i=0;i<8;i++)
        {
            a=number%10;
            Digital_Tube(7-i,a);
            b=number/10;
            if(b==0) break;
            number=b;
        }
    }
    
    main()
    {
        value=Read_24C02(0X01); //从地址0x01中读出存储的数据
    	if(value>=9)
    	{
    		value=0;
    	}
    	Write_24C02(0X01,++value);  //向地址0x01中写入需要存储的数据,每开机一次value+1
    	while(1)
    	{
    		Display_right(value);
    	}
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 蓝桥杯单片机之AT24C02模块的使用

    发表评论