天天看點

【藍橋杯單片機進階強化-03】24C02存儲器的基本原理與應用

【1】24C02功能概述

      24C02是一個2K Bit的串行EEPROM存儲器,内部含有256個位元組。在24C02裡面有一個8位元組的頁寫緩沖器。該裝置的工作電壓為1.8V到6.0V,晶片的第7引腳WP為寫保護引腳,将該引腳接地允許正常的讀寫。

【藍橋杯單片機進階強化-03】24C02存儲器的基本原理與應用

【2】裝置位址

      24C02的裝置位址包括固定部分和可程式設計部分。可程式設計部分需要根據硬體引腳A0、A1和A2來設定。裝置位址的最後一位用于設定資料傳輸的方向,即讀/寫位。格式如下圖:

【藍橋杯單片機進階強化-03】24C02存儲器的基本原理與應用

      在IIC總線協定中,裝置位址是起始信号後第一個發送的位元組。如果硬體位址引腳A0、A1、A2均接地,那麼,24C02的裝置的讀操作位址為:0xA1;而寫操作位址則為:0xA0。

【3】讀寫操作中的應答信号

      在寫操作中,24C02每接收一個8位位元組後會産生一個應答信号。在讀操作中,24C02在發送一個8位資料後會釋放SDA線并監視應答信号。一旦收到應答信号,将繼續發送資料。如果主機沒有發送應答信号,從機則停止發送資料且等待一個停止信号。

【4】位元組寫操作

      24C02接收完裝置位址後,産生應答信号;然後接收8位記憶體位元組位址,産生應答信号,接着接收一個8位資料,産生應答信号;最後主機發送停止信号,位元組寫操作結束。

【5】頁寫操作

      24C02有一個8位元組的頁寫緩沖器,也就是說可以一次連續寫入8個位元組到緩沖器,然後由緩沖器一次性寫到EEPROM。頁寫操作初始化與位元組寫操作相同,隻是主機不會在寫完第一個資料後就發送停止信号,而是在24C02應答後,接着發送7個資料。

      需要注意的是,24C02接收到每個資料後,其位元組位址的低3位會自動加1,高位位址不變,維持在目前頁内。當内部産生的位元組位址到達該頁邊界時,随後的資料将寫入該頁的頁首,先前的寫入的資料将會被覆寫。

【6】目前位址讀操作

      24C02内部的位址寄存器會儲存着上次讀/寫操作最後一個位址加1的值。隻要晶片有電,該位址就一直儲存着。如果上次讀/寫操作的位址為N,那麼目前位址讀操作就從N+1開始。當讀到最後一個位元組(即255處),位址會回轉到0。

【7】位元組讀操作

      主機首先發送起始信号,接着發送裝置位址和它想要讀取的資料記憶體位元組位址,執行一個僞寫操作。在24C02應答主機之後,主機重新發送起始信号和從裝置位址,進行讀操作。24C02響應并發送應答信号,然後輸出所要求的一個8位位元組資料。主機接收完這個8位資料後,産生一個“非應答”信号,最後發送停止條件,位元組讀操作結束。

【8】連續讀操作

      在24C02發送完一個8位位元組資料之後,主機産生一個應答信号來響應,告知24C02要求讀取更多的資料,直到讀完最後一個資料,主機向24C02發送一個“非應答”信号,然後發送一個停止信号,結束此操作。

【9】基本讀寫操作流程

      24C02的位元組寫操作,參考代碼:

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總線停止信号		
}
           

    24C02的位元組讀操作,參考代碼:

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_Ack(0); 		//産生非應答信号		
	IIC_Stop();		//IIC總線停止信号			
	return tmp;
}
           

【10】進階強化實訓

【藍橋杯單片機進階強化-03】24C02存儲器的基本原理與應用

【11】參考源碼共享

#include "regx52.h"
#include "absacc.h"
#include "iic.h"

unsigned char dat1 = 0, dat2 = 0, dat3 = 0;

unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
		 0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void DelaySMG(unsigned int t)
{
	while(t--);
}

void DisplaySMG_Bit(unsigned char pos, unsigned char value)
{
	XBYTE[0xE000] = 0xFF;
	XBYTE[0xC000] = 0x01 << pos;
	XBYTE[0xE000] = value;
}

void Write_24C02(unsigned char addr, unsigned char dat)
{
	IIC_Start();						
	IIC_SendByte(0xa0); 		
	IIC_WaitAck();				
	IIC_SendByte(addr); 		
	IIC_WaitAck(); 					
	IIC_SendByte(dat); 			
	IIC_WaitAck();					
	IIC_Stop();							
}

unsigned char Read_24C02(unsigned char addr)
{
	unsigned char tmp;
	
	IIC_Start();					
	IIC_SendByte(0xa0); 		
	IIC_WaitAck();					
	IIC_SendByte(addr); 		
	IIC_WaitAck(); 					
	
	IIC_Start();						
	IIC_SendByte(0xa1); 		
	IIC_WaitAck();				
	tmp = IIC_RecByte();		
	IIC_Ack(0); 						
	IIC_Stop();							
	return tmp;
}

void Read_Write()
{
	dat1 = Read_24C02(0x01);
	dat2 = Read_24C02(0x03);
	dat3 = Read_24C02(0x05);
	
	dat1 = dat1 + 1;
	dat2 = dat2 + 2;
	dat3 = dat3 + 3;
	
	if(dat1 > 10)
		dat1 = 0;
	if(dat2 > 20)
		dat2 = 0;
	if(dat3 > 30)
		dat3 = 0;
	
	Write_24C02(0x01, dat1);
	DelaySMG(1000);
	Write_24C02(0x03, dat2);
	DelaySMG(1000);
	Write_24C02(0x05, dat3);
	DelaySMG(1000);
}

void DisplaySMG_24C02()
{
	DisplaySMG_Bit(0, SMG_duanma[dat1/10]);
	DelaySMG(500);
	DisplaySMG_Bit(1, SMG_duanma[dat1%10]);
	DelaySMG(500);
	DisplaySMG_Bit(2, SMG_duanma[16]);
	DelaySMG(500);
	
	DisplaySMG_Bit(3, SMG_duanma[dat2/10]);
	DelaySMG(500);
  DisplaySMG_Bit(4, SMG_duanma[dat2%10]);
	DelaySMG(500);
	DisplaySMG_Bit(5, SMG_duanma[16]);
	
	DelaySMG(500);
	DisplaySMG_Bit(6, SMG_duanma[dat3/10]);
	DelaySMG(500);
	DisplaySMG_Bit(7, SMG_duanma[dat3%10]);	
	DelaySMG(500);

}

main()
{
	XBYTE[0x8000] = 0xFF;
	XBYTE[0xA000] = 0x00;
	Read_Write();
	while(1)
	{
		DisplaySMG_24C02();
	}
}
           

【小蜜蜂筆記:廣東職業技術學院  歐浩源  [email protected]】

【藍橋杯單片機進階強化-03】24C02存儲器的基本原理與應用

繼續閱讀