|
24c02存儲(chǔ)地址是8位,24c64存儲(chǔ)地址是16位,24c02的讀寫(xiě)程序不能直接用在AT24c64上。
本測(cè)試程序已經(jīng)在開(kāi)發(fā)板上測(cè)試成功。
單片機(jī)源程序如下:
- /************************************************
- 51HEI開(kāi)發(fā)板
- 跳線設(shè)置:J7拔掉,雙排針除PSEN外全部插上
- 硬件結(jié)構(gòu)框架:
- 1,IIC總線芯AT24C64
- 2,MCU AT89S52
- 顯示效果:
- 1,在數(shù)碼管上計(jì)數(shù)
- 2,斷電記憶
- 相關(guān)知識(shí)點(diǎn):
- 1,類似IIC總線芯片的操作
- 功能描述:利用定時(shí)器產(chǎn)生一個(gè)0~99秒變化的秒表,并且顯示在數(shù)碼管上,
- 每過(guò)一秒將這個(gè)數(shù)寫(xiě)入板上的AT24C64內(nèi)部。當(dāng)關(guān)閉實(shí)驗(yàn)板電源,并再次打開(kāi)
- 實(shí)驗(yàn)板電源時(shí),單片機(jī)先進(jìn)入AT24C64中將原來(lái)寫(xiě)入的數(shù)讀取出來(lái),接著此數(shù)
- 繼續(xù)變化并顯示在數(shù)碼管上。
- *本測(cè)試程序不適用于24c02*
- Arzeng 2018.01.19 整理
- ************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define w_24C64 0xa0//0xa0 10100000 " MSB 0 1 0 1 A2 A1 A0 R/W " A2 A1 A0 接地為“0”
- #define r_24C64 0xa1//0xa1
- /********************24c64定義*********************/
- sbit scl_24c64 = P2^1; //24c64定義時(shí)鐘線
- sbit sda_24c64 = P2^0; //24c64定義數(shù)據(jù)線
- /**************************************************/
- uchar m_data_to_24c64[] = {0x01,0x08,0x0b,0x04,0x05,0x06};
- uchar m_data_from_24c64[32] ;//接收數(shù)組
- uchar DATA2;
- void delay1(uchar i)
- {
- uchar j,k;
- for(j=i; j>0; j--)
- for(k=125; k>0; k--)
- {
- ;
- }
- }
- sbit dula=P2^6;
- sbit wela=P2^7;
- void display()
- {
- static uchar a;
- uchar dis[8];
- uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- for(a=0; a<8; a++)
- {
- dis[a]=0;
- }
- dis[5]=DATA2/100;
- dis[6]=DATA2%100/10;
- dis[7]=DATA2%10;
- for(a=0; a<8; a++)
- {
- dula=0;
- P0=table[dis[a]];
- dula=1;
- dula=0;
- wela=0;
- P0=~(0x01<<a);
- wela=1;
- wela=0;
- delay1(5);
- }
- }
- void timer0() interrupt 1 //TR0
- {
- uint i;
- if(i++>=1250)
- {
- i=0;
- if(DATA2++>=255)
- {
- DATA2=0;
- }
- }
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- }
- void Delay_xus(uint i)
- {
- while(i--)
- {
- ;
- }
- }
- void Delay_100us()
- {
- uchar i = 14;
- while(i--)
- {
- ;
- }
- }
- void Delay_100ms()
- {
- uchar i;
- uint j = 1000;
- for(; j>0; j--)
- {
- i = 14;
- while(i--)
- {
- ;
- }
- }
- }
- /***************************************/
- void start_24c64()
- {
- sda_24c64 = 1;
- scl_24c64 = 1;
- Delay_xus(1); //也可不用延時(shí),怕你單片機(jī)快;
- sda_24c64 = 0;
- Delay_xus(1);
- scl_24c64 = 0;//控制時(shí)鐘線,防止數(shù)據(jù)誤入
- // I2C總線空閑時(shí),sda、scl為高電平
- }
- void stop_24c64()
- {
- sda_24c64 = 0;
- scl_24c64 = 1;
- Delay_xus(1);
- sda_24c64 = 1;
- Delay_xus(1);
- scl_24c64 = 0;
- }
- void ask_24c64() //寫(xiě)數(shù)據(jù)應(yīng)答,第九個(gè)脈沖sda_24c64為低,則24c64成功接受數(shù)據(jù)
- {
- uchar k=30;
- scl_24c64 = 0;
- scl_24c64 = 1;
- Delay_xus(1);
- while(sda_24c64&&k--)
- {
- ; //結(jié)合寫(xiě)數(shù)據(jù)發(fā)第九個(gè)脈沖,檢查應(yīng)答位,若無(wú)應(yīng)答,一定時(shí)間后退出
- }
- scl_24c64 = 0;
- }
- void writebyte_24c64(uchar data_to_24c64)//寫(xiě)入數(shù)據(jù)
- {
- uchar i;
- scl_24c64 = 0;
- for(i=0; i<8; i++)
- {
- if(data_to_24c64&0x80)
- {
- sda_24c64 = 1;
- }
- else
- {
- sda_24c64 = 0;
- }
- scl_24c64 = 1; //時(shí)鐘線低變高,發(fā)數(shù)據(jù)
- Delay_xus(1);
- scl_24c64 = 0;
- data_to_24c64<<=1;
- }
- ask_24c64();
- }
- uchar readbyte_24c64(uchar ack) //ack應(yīng)答位,ack=1,MCU不應(yīng)答(不繼續(xù)接受數(shù)據(jù))
- {
- //ack=0,MCU應(yīng)答,繼續(xù)接受數(shù)據(jù)
- uchar i,data_from_24c64;
- scl_24c64 = 0;
- for(i=0; i<8; i++)
- {
- data_from_24c64<<=1;
- scl_24c64 = 1;
- Delay_xus(1);
- data_from_24c64 |= sda_24c64;
- Delay_xus(1);
- scl_24c64 = 0;
- }
- sda_24c64 = ack;
- scl_24c64 = 1;
- scl_24c64 = 0;
- sda_24c64 = 1;
- return data_from_24c64;
- }
- void write_o_data_24c64(uchar addH,uchar addL,uchar data_24c64)//寫(xiě)入單個(gè)數(shù)據(jù)
- {
- start_24c64();
- writebyte_24c64(w_24C64);//寫(xiě)指令
- writebyte_24c64(addH);//寫(xiě)高位地址
- writebyte_24c64(addL);//寫(xiě)低位地址
- writebyte_24c64(data_24c64);//寫(xiě)儲(chǔ)存數(shù)據(jù)
- stop_24c64();
- }
- uchar read_o_data_24c64(uchar addH,uchar addL) //讀出單個(gè)數(shù)據(jù)
- {
- uchar temp;
- start_24c64();
- writebyte_24c64(w_24C64);//寫(xiě)寫(xiě)指令
- writebyte_24c64(addH);//寫(xiě)高位地址
- writebyte_24c64(addL);//寫(xiě)低位地址(實(shí)際上是調(diào)24c64地址指針到要讀取的數(shù)據(jù)的地址)
- stop_24c64();
- start_24c64();
- writebyte_24c64(r_24C64);//寫(xiě)讀指令
- temp = readbyte_24c64(1);
- stop_24c64();
- return temp;
- }
- void write_m_data_24c64(uchar addH,uchar addL,uchar *m_data_24c64,uchar n) //從某地址開(kāi)始連續(xù)多字節(jié)寫(xiě)入
- {
- uchar i;
- start_24c64();
- writebyte_24c64(w_24C64);//寫(xiě)指令
- writebyte_24c64(addH);//寫(xiě)高位地址
- writebyte_24c64(addL);//寫(xiě)低位地址
- if(n>32) //每頁(yè)最多32字節(jié)
- {
- n = 32;
- }
- for(i=0; i<n; i++)
- {
- writebyte_24c64(*(m_data_24c64++));//寫(xiě)儲(chǔ)存數(shù)據(jù)
- Delay_xus(1);
- }
- stop_24c64();
- }
- void read_m_data_24c64(uchar addH,uchar addL,uchar n)//從某地址開(kāi)始連續(xù)讀取n個(gè)數(shù)據(jù)
- {
- uchar i;
- if(n>32) //n不能大于32,會(huì)從頭覆蓋字節(jié)
- {
- n=32;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
24c64讀寫(xiě).rar
(26.08 KB, 下載次數(shù): 267)
2018-1-19 19:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|