|
通過仿真實(shí)現(xiàn)對(duì)存儲(chǔ)器AT24C04讀寫操作,通過數(shù)碼管或LED燈狀態(tài)來顯示
1.png (35.79 KB, 下載次數(shù): 80)
下載附件
原理圖
2019-5-12 21:48 上傳
原理圖
2.png (64.21 KB, 下載次數(shù): 74)
下載附件
實(shí)驗(yàn)結(jié)果圖
2019-5-12 21:49 上傳
實(shí)驗(yàn)結(jié)果圖
實(shí)驗(yàn)部分代碼結(jié)構(gòu):
//24C04.c
- //-----------------------------------------------------------------
- // 名稱: AT24C04讀/寫驅(qū)動(dòng)程序
- //-----------------------------------------------------------------
- #define INT8U unsigned char
- #define INT16U unsigned int
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- sbit SCL = P1^0; //串行時(shí)鐘線
- sbit SDA = P1^1; //串行數(shù)據(jù)線
- #include "I2C.h" //IIC總線通用宏及函數(shù)
- //-----------------------------------------------------------------
- //AT24C04所調(diào)用的外部相關(guān)函數(shù)
- extern void Show_HEX(INT8U dat); //16進(jìn)制格式顯示字節(jié)
- extern void PutStr(INT8U *s); //串口輸出字符串
- extern void delay_ms(INT16U); //延時(shí)函數(shù)
- extern INT16U r; //換行控制變量
- //-----------------------------------------------------------------
- // 向任意指定的地址寫入一字節(jié)數(shù)據(jù)
- // 器件地址碼字節(jié)格式 (其中E2,E1為片選位,A8為塊地址位)
- // 位: B7 B6 B5 B4 B3 B2 B1 B0
- // 值: 1 0 1 0 E2 E1 A8 RW
- //-----------------------------------------------------------------
- void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 從任意地址讀取一字節(jié)數(shù)據(jù)
- //-----------------------------------------------------------------
- INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
- {
- }
- //-----------------------------------------------------------------
- // 從指定地址開始連續(xù)順序讀取N節(jié)數(shù)據(jù)
- //-----------------------------------------------------------------
- void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N)
- {
- }
復(fù)制代碼 //IC.h
- //-----------------------------------------------------------------
- // 名稱: IIC總線通用宏及函數(shù)
- //-----------------------------------------------------------------
- #define NOP4() { _nop_();_nop_();_nop_();_nop_(); }
- //總線啟動(dòng) -------------------------------------------------------
- #define IIC_Start() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); SDA = 0; NOP4(); SCL = 0; }
- //總線停止 -------------------------------------------------------
- #define IIC_Stop() \
- { SDA = 0; NOP4(); SCL = 1; NOP4(); SDA = 1; NOP4(); }
- //-----------------------------------------------------------------
- //以下3個(gè)有關(guān)應(yīng)答的宏定義均生成第9個(gè)時(shí)鐘脈沖,讀取應(yīng)答或發(fā)送應(yīng)答/非應(yīng)答
- //1.主機(jī)讀從機(jī)應(yīng)答 -----------------------------------------------
- //(SDA = 1設(shè)為輸入,準(zhǔn)備讀取應(yīng)答位,要使用該位作出處理時(shí)引用F0)
- #define IIC_Rd_Ack() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); F0 = !SDA; NOP4(); SCL = 0; }
- //2.主機(jī)發(fā)送應(yīng)答位 -----------------------------------------------
- #define IIC_Ack() \
- { SDA = 0; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 1; }
- //3.主機(jī)發(fā)送非應(yīng)答位 -------------------------------------------
- #define IIC_NAck() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 0; }
- //-----------------------------------------------------------------
- // 主機(jī)向IIC總線寫一字節(jié)
- //-----------------------------------------------------------------
- bit IIC_WriteByte(INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 主機(jī)從IIC總線讀一字節(jié)
- //-----------------------------------------------------------------
- INT8U IIC_ReadByte()
- {
- }
復(fù)制代碼 主程序main.c
- //-----------------------------------------------------------------
- // 名稱: I2C接口存儲(chǔ)器AT24C04讀寫與顯示(4片)
- //-----------------------------------------------------------------
- // 說明: 按下K1-K4按鍵時(shí),前兩個(gè)分別向第1,2片AT24C04中寫入400個(gè)隨機(jī)字節(jié)
- // 后2個(gè)按鍵分別寫第3,4片AT24C04,先寫入200個(gè)0x01,再寫入200個(gè)0x02
- // 寫入后接著讀取并顯示.(400個(gè)字節(jié)的地址范圍: 0x0000~0x018F)
- //
- //-----------------------------------------------------------------
- #define INT8U unsigned char
- #define INT16U unsigned int
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- sbit K1 = P3^3; //四個(gè)操作按鍵定義
- sbit K2 = P3^4;
- sbit K3 = P3^5;
- sbit K4 = P3^6;
- INT16U r = 0; //滿20個(gè)字節(jié)換行控制變量
- //AT24C04相關(guān)函數(shù)
- extern void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat);
- extern INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr);
- extern void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N);
- //-----------------------------------------------------------------
- // 延時(shí)函數(shù)
- //-----------------------------------------------------------------
- void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
- //-----------------------------------------------------------------
- // 向串口發(fā)送1字節(jié)
- //-----------------------------------------------------------------
- void PutChar(INT8U c) { SBUF = c; while( TI == 0 ); TI = 0;}
- //-----------------------------------------------------------------
- // 向串口發(fā)送字符串
- //-----------------------------------------------------------------
- void PutStr(INT8U *s) { while(*s) PutChar(*s++); }
- //-----------------------------------------------------------------
- // sprintf對(duì)%2X格式支持不穩(wěn)定,編譯時(shí)有時(shí)可以輸出正確結(jié)果,有時(shí)則不正常
- // sprintf(s,"%02X ",(INT8U)Random_Read(0xA0,i)); PutStr(s);
- // 故改用下面的函數(shù)實(shí)現(xiàn)十六進(jìn)制形式顯示所讀取的字節(jié)
- //-----------------------------------------------------------------
- void Show_HEX(INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- INT16U i; char s[] = "NO.X\r\n";
- INT8U n = 0, ChipNo = 0;
- //串口配置
- SCON = 0x40; TMOD = 0x20; PCON = 0;
- TH1 = 0xFD; TL0 = 0xFD;
- TI = 0; TR1 = 1;
- srand(30); //隨機(jī)種子
- PutStr("\r\n>>> Press K1~K4, Write/Read No.1~4 AT24C04...\r\n ");
- while(1)
- { if ((P3 & 0xF0) != 0xF0) //P3端口高4位按鍵狀態(tài)檢測(cè)
- {
- } else { delay_ms(10); continue; }
- PutStr("\r\n\r\n>>> Write IIC, Waiting.........\r\n\r\n ");
- //提示當(dāng)前讀取的AT24C04芯片號(hào)1~4(由0~3加1得到)
- s[3] = ChipNo + '1'; PutStr(s);
- switch (ChipNo)
- { case 0: case 1: //K1,K2分別向第1,2片寫入400個(gè)隨機(jī)字節(jié)
- case 2: case 3: //K3,K4分別寫第3,4片,寫入200個(gè)0x01,0x02
- }
- PutStr("\r\n\r\n>>> Reading From IIC...........\r\n\r\n");
- r = 0; //滿20個(gè)字節(jié)換行顯示控制變量歸0
- //從指定的AT24C04中讀取400字節(jié)并發(fā)送串口顯示,下面兩種讀取方法中,
- //隨機(jī)尋址單字節(jié)讀取共400字節(jié)將明顯慢于順序連續(xù)讀取400字節(jié)
- }
- }
復(fù)制代碼 完整代碼
IC.zip
(2.71 KB, 下載次數(shù): 110)
2019-5-12 22:01 上傳
點(diǎn)擊文件名下載附件
包含c文件與h文件代碼 下載積分: 黑幣 -5
|
|