日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基于51单片机的EEPROM读写

發布時間:2023/12/20 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于51单片机的EEPROM读写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本講內容:

? ? ? 對存儲器的基本知識進行介紹。介紹EEPROM芯片AT24C02;通過例程展示EEPROM的讀寫。

? ? ? 存儲器是應用于各種嵌入式場合的存儲部件,按功能可分為只讀存儲器(ROM)和隨機存取存儲器(RAM)兩大類,分別用作固定數據存儲和臨時數據緩存。

RAM(Random Access Memory),隨機存取存儲器:

? ? ? RAM的特點是:上電運行時,操作系統和應用程序的所有正在運行的數據和程序都會放置其中,并且隨時可以對存放在里面的數據進行修改和存取。它的工作需要由持續的電力提供,一旦系統斷電,存放在里面的所有數據和程序都會自動清空掉,并且再也無法恢復。

使用得比較多的RAM種類有:?

DRAM(Dynamic RAM,動態隨機存取存儲器):

? ? ? 這是最普通的RAM,一個電子管與一個電容器組成一個位存儲單元,DRAM將每個內存位作為一個電荷保存在位存儲單元中,用電容的充放電來做儲存動作,但因電容本身有漏電問題,因此必須每幾微秒就要刷新一次,否則數據會丟失。存取時間和放電時間一致,約為2~4ms。因為成本比較便宜,通常都用作計算機內的主存儲器。

SRAM(Static RAM,靜態隨機存取存儲器):

? ? ? 靜態,指的是內存里面的數據可以長駐其中而不需要隨時進行存取。每6顆電子管組成一個位存儲單元,因為沒有電容器,因此無須不斷充電即可正常運作,因此它可以比一般的動態隨機處理內存處理速度更快更穩定,往往用來做高速緩存。

SDRAM(Synchronous DRAM,同步動態隨機存取存儲器):

? ? ? ?這是一種與CPU實現外頻Clock同步的內存模式,工作電壓為3.3V。 所謂clock同步是指內存能夠與CPU同步存取資料,這樣可以取消等待周期,減少數據傳輸的延遲,因此可提升計算機的性能和效率。

DDR SDRAM(Double Data Rate二倍速率同步動態隨機存取存儲器):

? ? ? 作為SDRAM的換代產品,它具有兩大特點:

? ? ? 其一,速度比SDRAM有一倍的提高;

? ? ? 其二,采用了DLL(Delay Locked Loop:延時鎖定回路)提供一個數據濾波信號。這是目前內存市場上的主流模式。

只讀存儲器(read-only memory --- ROM)可以分為以下兩大類:

? ? ?(1)掩模編程ROM,它所存儲的固定邏輯信息是由生產廠家通過光刻掩模版來決定的。

? ? ?(2)現場可編程ROM(programmable read-only memory)。

??????? a:PROM(可編程ROM)。此類ROM通常采用溶絲結構,用戶可根據編程的需要,把無用的溶絲燒斷來完成編程工作(即把信息寫入到存儲器中)。但一旦編程完畢,就無法再變更,故用戶只可編程(寫)一次。

??????? b:EPROM(可擦除可編程ROM-erasable programmable read only memory)。

此類ROM存儲單元中存貯信息的管子采用浮柵結構,可用紫外線或X-射線把原來存的信息一次全部擦除。

??????? c:EEPROM(電可擦除可編程ROM,也叫E2PROM-electrically erasable programmable read only memory)。

??????? d: Flash Memory(快閃存儲器)

這是一種可以直接在主機板上修改內容而不 需要將IC拔下的內存,當電源關掉后儲存在里面的資料并不會流失掉,在寫入資料時必須先將原本的資料清除掉,然后才能再寫入新的資料,缺點為寫入資料的速度太慢。

EEPROM芯片AT24C02介紹:

?

?

例程:

/*****************EEPROM讀寫*******************

*單片機型號:STC89C52RC

*開發環境:KEIL

*功能:向IIC總線器件24c02EEPROM中地址為1的存儲單元中寫入數據50

? ? ? ? ? ? 并將其讀出,顯示于數碼管上。 ??

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

#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)????????????????????????????????????????????????????????????????????????????????????????? //定義延時函數?

{

?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);}

}

最后,求求看到的此文的小伙伴點贊關注支持一下下哦。畢竟,碼字不容易哦,您的支持是我最大的動力呀!!!嗚嗚嗚~~~

總結

以上是生活随笔為你收集整理的基于51单片机的EEPROM读写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。