基于51单片机的EEPROM读写
本講內(nèi)容:
? ? ? 對存儲器的基本知識進(jìn)行介紹。介紹EEPROM芯片AT24C02;通過例程展示EEPROM的讀寫。
? ? ? 存儲器是應(yīng)用于各種嵌入式場合的存儲部件,按功能可分為只讀存儲器(ROM)和隨機存取存儲器(RAM)兩大類,分別用作固定數(shù)據(jù)存儲和臨時數(shù)據(jù)緩存。
RAM(Random Access Memory),隨機存取存儲器:
? ? ? RAM的特點是:上電運行時,操作系統(tǒng)和應(yīng)用程序的所有正在運行的數(shù)據(jù)和程序都會放置其中,并且隨時可以對存放在里面的數(shù)據(jù)進(jìn)行修改和存取。它的工作需要由持續(xù)的電力提供,一旦系統(tǒng)斷電,存放在里面的所有數(shù)據(jù)和程序都會自動清空掉,并且再也無法恢復(fù)。
使用得比較多的RAM種類有:?
DRAM(Dynamic RAM,動態(tài)隨機存取存儲器):
? ? ? 這是最普通的RAM,一個電子管與一個電容器組成一個位存儲單元,DRAM將每個內(nèi)存位作為一個電荷保存在位存儲單元中,用電容的充放電來做儲存動作,但因電容本身有漏電問題,因此必須每幾微秒就要刷新一次,否則數(shù)據(jù)會丟失。存取時間和放電時間一致,約為2~4ms。因為成本比較便宜,通常都用作計算機內(nèi)的主存儲器。
SRAM(Static RAM,靜態(tài)隨機存取存儲器):
? ? ? 靜態(tài),指的是內(nèi)存里面的數(shù)據(jù)可以長駐其中而不需要隨時進(jìn)行存取。每6顆電子管組成一個位存儲單元,因為沒有電容器,因此無須不斷充電即可正常運作,因此它可以比一般的動態(tài)隨機處理內(nèi)存處理速度更快更穩(wěn)定,往往用來做高速緩存。
SDRAM(Synchronous DRAM,同步動態(tài)隨機存取存儲器):
? ? ? ?這是一種與CPU實現(xiàn)外頻Clock同步的內(nèi)存模式,工作電壓為3.3V。 所謂clock同步是指內(nèi)存能夠與CPU同步存取資料,這樣可以取消等待周期,減少數(shù)據(jù)傳輸?shù)难舆t,因此可提升計算機的性能和效率。
DDR SDRAM(Double Data Rate二倍速率同步動態(tài)隨機存取存儲器):
? ? ? 作為SDRAM的換代產(chǎn)品,它具有兩大特點:
? ? ? 其一,速度比SDRAM有一倍的提高;
? ? ? 其二,采用了DLL(Delay Locked Loop:延時鎖定回路)提供一個數(shù)據(jù)濾波信號。這是目前內(nèi)存市場上的主流模式。
只讀存儲器(read-only memory --- ROM)可以分為以下兩大類:
? ? ?(1)掩模編程ROM,它所存儲的固定邏輯信息是由生產(chǎn)廠家通過光刻掩模版來決定的。
? ? ?(2)現(xiàn)場可編程ROM(programmable read-only memory)。
??????? a:PROM(可編程ROM)。此類ROM通常采用溶絲結(jié)構(gòu),用戶可根據(jù)編程的需要,把無用的溶絲燒斷來完成編程工作(即把信息寫入到存儲器中)。但一旦編程完畢,就無法再變更,故用戶只可編程(寫)一次。
??????? b:EPROM(可擦除可編程ROM-erasable programmable read only memory)。
此類ROM存儲單元中存貯信息的管子采用浮柵結(jié)構(gòu),可用紫外線或X-射線把原來存的信息一次全部擦除。
??????? c:EEPROM(電可擦除可編程ROM,也叫E2PROM-electrically erasable programmable read only memory)。
??????? d: Flash Memory(快閃存儲器)
這是一種可以直接在主機板上修改內(nèi)容而不 需要將IC拔下的內(nèi)存,當(dāng)電源關(guān)掉后儲存在里面的資料并不會流失掉,在寫入資料時必須先將原本的資料清除掉,然后才能再寫入新的資料,缺點為寫入資料的速度太慢。
EEPROM芯片AT24C02介紹:
?
?
例程:
/*****************EEPROM讀寫*******************
*單片機型號:STC89C52RC
*開發(fā)環(huán)境:KEIL
*功能:向IIC總線器件24c02EEPROM中地址為1的存儲單元中寫入數(shù)據(jù)50
? ? ? ? ? ? 并將其讀出,顯示于數(shù)碼管上。 ??
****************************************************/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;sbit scl=P2^1;sbit LE1=P2^6;sbit LE2=P2^7;sbit LED=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
0x5e,0x79,0x71};
void delay1(uint z)
{
?uchar x,x1;
?for(;z>0;z--)
?{for(x=0;x<114;x++){for(x1=0;x1<1;x1++);}}
}
void delay_5us()
{
?int i;
?for(i=0;i<1;i++){;}
}
void delay(int In,int Out)????????????????????????????????????????????????????????????????????????????????????????? //定義延時函數(shù)?
{
?int i,j;
?for(i=0;i<In;i++)
?{for(j=0;j<Out;j++){;}}
}
void star()
{
?sda=1;delay_5us();
?scl=1;delay_5us();
?sda=0;delay_5us();
}
void stop()
{
?sda=0;delay_5us();
?scl=1;delay_5us();
?sda=1;delay_5us();
}
void ack()
{
?uchar z=0;
?while((sda==1)&&(z<50))z++;
?scl=0;
?delay_5us();
}
void write(uchar slave_write_address,uchar byte_address,uchar data_data)
{
?uchar temp,temp1,i,ii;
?star();
?for(ii=0;ii<3;ii++)
?{
? if(ii==0)
? {temp=slave_write_address;temp1=slave_write_address;}
? else if(ii==1)
? {temp=byte_address;temp1=byte_address;}
? else if(ii==2)
? {temp=data_data;temp1=data_data;}
? for(i=0;i<8;i++)
? {
?? scl=0;
?? delay_5us();
?? temp=temp1;
?? temp=temp&0x80;
?? if(temp==0x80)sda=1;
?? else sda=0;
?? delay_5us();
?? scl=1;delay_5us();
?? scl=0;delay_5us();
?? temp1=temp1<<1;
? }
? sda=1;delay_5us();
? scl=1;delay_5us();
? ack();
?}
?stop();
}
uchar read(uchar slave_write_address,uchar byte_address,uchar slave_read_address)
{
?uchar temp,temp1,i,ii,x,data_data;
?star();
?for(ii=0;ii<3;ii++)
?{
? if(ii==0)
? {temp=slave_write_address;temp1=slave_write_address;}
? else if(ii==1)
? {temp=byte_address;temp1=byte_address;}
? else if(ii==2)
? {star();temp=slave_read_address;temp1=slave_read_address;}
? for(i=0;i<8;i++)
? {
? ?scl=0;delay_5us();
?? temp=temp1;temp=temp&0x80;
?? if(temp==0x80)sda=1;
?? else sda=0;
?? delay_5us();
??
?? scl=1;delay_5us();
?? scl=0;delay_5us();
?? temp1=temp1<<1;
? }
? sda=1;delay_5us();
? scl=1;delay_5us();
? ack();
? }
? for(x=0;x<8;x++)
? {
?? data_data=data_data<<1;
?? sda=1;delay_5us();
?? scl=0;delay_5us();
?? scl=1;delay_5us();
?? if(sda==1)data_data|=0x01;
? }
? ack();
? stop();
? return data_data;
}
??????????????????????
void display(uchar a,uchar b)
{
?LE1=0;
?P0=table[a];LE1=1;LE1=0;?????? //顯示百位
?LE2=0;
?P0=0xfe;LE2=1;LE2=0;
?delay(5,100);
?LE1=0;
?P0=table[b];LE1=1;LE1=0;?????? //顯示十位
?LE2=0;
?P0=0xfd;LE2=1;LE2=0;
?delay(5,100);
}
void main()
{
?unsigned char num;
?unsigned char buffer;
?unsigned char a,b;
?num = 0x32;
?loop1:write(0xa0,0x01,num);
?delay1(20);
?buffer=read(0xa0,0x01,0xa1);
?delay1(20);
?if(buffer!=num){goto loop1;}
?a=buffer/10;
?b=buffer%10;
?LED=0;delay(5,1000);
?LED=1;delay(5,1000);
?LED=0;delay(5,1000);
?LED=1;delay(5,1000);
?while(1){display(a,b);}
}
最后,求求看到的此文的小伙伴點贊和關(guān)注支持一下下哦。畢竟,碼字不容易哦,您的支持是我最大的動力呀!!!嗚嗚嗚~~~
總結(jié)
以上是生活随笔為你收集整理的基于51单片机的EEPROM读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lucas–Kanade(LK)光流算法
- 下一篇: Nginx反向代理,上游是https 4