久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11456|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)IIC接口存儲(chǔ)器AT24C04的讀寫和顯示程序(詳細(xì)注釋)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
通過仿真實(shí)現(xiàn)對(duì)存儲(chǔ)器AT24C04讀寫操作,通過數(shù)碼管或LED燈狀態(tài)來顯示


原理圖




實(shí)驗(yàn)結(jié)果圖

實(shí)驗(yàn)部分代碼結(jié)構(gòu):
//24C04.c
  1. //-----------------------------------------------------------------
  2. //  名稱: AT24C04讀/寫驅(qū)動(dòng)程序
  3. //-----------------------------------------------------------------
  4. #define INT8U  unsigned char
  5. #define INT16U unsigned int
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. sbit SCL = P1^0;                                        //串行時(shí)鐘線
  11. sbit SDA = P1^1;                                        //串行數(shù)據(jù)線
  12. #include "I2C.h"                                        //IIC總線通用宏及函數(shù)
  13. //-----------------------------------------------------------------
  14. //AT24C04所調(diào)用的外部相關(guān)函數(shù)
  15. extern void Show_HEX(INT8U dat);         //16進(jìn)制格式顯示字節(jié)
  16. extern void PutStr(INT8U *s);                //串口輸出字符串
  17. extern void delay_ms(INT16U);                //延時(shí)函數(shù)
  18. extern INT16U r;                                        //換行控制變量
  19. //-----------------------------------------------------------------
  20. // 向任意指定的地址寫入一字節(jié)數(shù)據(jù)
  21. // 器件地址碼字節(jié)格式 (其中E2,E1為片選位,A8為塊地址位)
  22. // 位: B7 B6 B5 B4 B3 B2 B1 B0
  23. // 值:  1  0  1  0 E2 E1 A8 RW
  24. //-----------------------------------------------------------------
  25. void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat)
  26. {

  27. }

  28. //-----------------------------------------------------------------
  29. // 從任意地址讀取一字節(jié)數(shù)據(jù)
  30. //-----------------------------------------------------------------
  31. INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
  32. {

  33. }

  34. //-----------------------------------------------------------------
  35. // 從指定地址開始連續(xù)順序讀取N節(jié)數(shù)據(jù)
  36. //-----------------------------------------------------------------
  37. void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N)
  38. {

  39. }
復(fù)制代碼
//IC.h

  1. //-----------------------------------------------------------------
  2. // 名稱: IIC總線通用宏及函數(shù)
  3. //-----------------------------------------------------------------
  4. #define NOP4()        { _nop_();_nop_();_nop_();_nop_(); }
  5. //總線啟動(dòng)        -------------------------------------------------------
  6. #define IIC_Start()                \
  7. { SDA = 1; NOP4(); SCL = 1; NOP4(); SDA = 0; NOP4(); SCL = 0; }
  8. //總線停止        -------------------------------------------------------
  9. #define IIC_Stop()                \
  10. { SDA = 0; NOP4(); SCL = 1; NOP4(); SDA = 1; NOP4(); }
  11. //-----------------------------------------------------------------
  12. //以下3個(gè)有關(guān)應(yīng)答的宏定義均生成第9個(gè)時(shí)鐘脈沖,讀取應(yīng)答或發(fā)送應(yīng)答/非應(yīng)答
  13. //1.主機(jī)讀從機(jī)應(yīng)答        -----------------------------------------------
  14. //(SDA = 1設(shè)為輸入,準(zhǔn)備讀取應(yīng)答位,要使用該位作出處理時(shí)引用F0)
  15. #define IIC_Rd_Ack()        \
  16. { SDA = 1; NOP4(); SCL = 1; NOP4(); F0 = !SDA; NOP4(); SCL = 0;        }
  17. //2.主機(jī)發(fā)送應(yīng)答位        -----------------------------------------------
  18. #define IIC_Ack()                \
  19. { SDA = 0; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 1;        }
  20. //3.主機(jī)發(fā)送非應(yīng)答位        -------------------------------------------
  21. #define IIC_NAck()                \
  22. { SDA = 1; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 0;        }
  23. //-----------------------------------------------------------------
  24. // 主機(jī)向IIC總線寫一字節(jié)
  25. //-----------------------------------------------------------------
  26. bit IIC_WriteByte(INT8U dat)
  27. {

  28. }

  29. //-----------------------------------------------------------------
  30. // 主機(jī)從IIC總線讀一字節(jié)
  31. //-----------------------------------------------------------------
  32. INT8U IIC_ReadByte()
  33. {

  34. }
復(fù)制代碼
主程序main.c

  1. //-----------------------------------------------------------------
  2. //        名稱: I2C接口存儲(chǔ)器AT24C04讀寫與顯示(4片)
  3. //-----------------------------------------------------------------
  4. //        說明: 按下K1-K4按鍵時(shí),前兩個(gè)分別向第1,2片AT24C04中寫入400個(gè)隨機(jī)字節(jié)
  5. //                  后2個(gè)按鍵分別寫第3,4片AT24C04,先寫入200個(gè)0x01,再寫入200個(gè)0x02
  6. //                  寫入后接著讀取并顯示.(400個(gè)字節(jié)的地址范圍: 0x0000~0x018F)
  7. //
  8. //-----------------------------------------------------------------
  9. #define INT8U  unsigned char
  10. #define INT16U unsigned int
  11. #include <reg51.h>
  12. #include <intrins.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. sbit K1 = P3^3;                //四個(gè)操作按鍵定義
  16. sbit K2 = P3^4;
  17. sbit K3 = P3^5;
  18. sbit K4 = P3^6;
  19. INT16U r = 0;                //滿20個(gè)字節(jié)換行控制變量
  20. //AT24C04相關(guān)函數(shù)
  21. extern void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat);
  22. extern INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr);
  23. extern void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N);
  24. //-----------------------------------------------------------------
  25. // 延時(shí)函數(shù)
  26. //-----------------------------------------------------------------
  27. void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
  28. //-----------------------------------------------------------------
  29. // 向串口發(fā)送1字節(jié)
  30. //-----------------------------------------------------------------
  31. void PutChar(INT8U c) {        SBUF = c; while( TI == 0 ); TI = 0;}
  32. //-----------------------------------------------------------------
  33. // 向串口發(fā)送字符串
  34. //-----------------------------------------------------------------
  35. void PutStr(INT8U *s) { while(*s) PutChar(*s++); }
  36. //-----------------------------------------------------------------
  37. // sprintf對(duì)%2X格式支持不穩(wěn)定,編譯時(shí)有時(shí)可以輸出正確結(jié)果,有時(shí)則不正常
  38. // sprintf(s,"%02X ",(INT8U)Random_Read(0xA0,i)); PutStr(s);
  39. // 故改用下面的函數(shù)實(shí)現(xiàn)十六進(jìn)制形式顯示所讀取的字節(jié)
  40. //-----------------------------------------------------------------
  41. void Show_HEX(INT8U dat)
  42. {

  43. }

  44. //-----------------------------------------------------------------
  45. // 主程序
  46. //-----------------------------------------------------------------
  47. void main()
  48. {
  49.         INT16U i; char s[] = "NO.X\r\n";
  50.         INT8U n = 0, ChipNo = 0;
  51.         //串口配置
  52.         SCON = 0x40;        TMOD = 0x20;        PCON = 0;
  53.         TH1 = 0xFD;                TL0 = 0xFD;
  54.         TI = 0;                        TR1 = 1;
  55.         srand(30);                //隨機(jī)種子
  56.         PutStr("\r\n>>> Press K1~K4, Write/Read No.1~4 AT24C04...\r\n ");
  57.         while(1)
  58.         {        if ((P3 & 0xF0) != 0xF0)                //P3端口高4位按鍵狀態(tài)檢測(cè)
  59.                 {



  60.                 } else { delay_ms(10); continue; }
  61.                 PutStr("\r\n\r\n>>> Write IIC, Waiting.........\r\n\r\n ");
  62.                 //提示當(dāng)前讀取的AT24C04芯片號(hào)1~4(由0~3加1得到)
  63.                 s[3] = ChipNo + '1'; PutStr(s);        
  64.                 switch (ChipNo)
  65.                 {        case 0: case 1:         //K1,K2分別向第1,2片寫入400個(gè)隨機(jī)字節(jié)



  66.                         case 2: case 3:         //K3,K4分別寫第3,4片,寫入200個(gè)0x01,0x02



  67.                 }
  68.                 PutStr("\r\n\r\n>>> Reading From IIC...........\r\n\r\n");
  69.                 r = 0;                                                        //滿20個(gè)字節(jié)換行顯示控制變量歸0
  70.                 //從指定的AT24C04中讀取400字節(jié)并發(fā)送串口顯示,下面兩種讀取方法中,
  71.                 //隨機(jī)尋址單字節(jié)讀取共400字節(jié)將明顯慢于順序連續(xù)讀取400字節(jié)









  72.         }
  73. }
復(fù)制代碼
完整代碼

IC.zip (2.71 KB, 下載次數(shù): 110)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:469417 發(fā)表于 2019-5-13 04:44 | 只看該作者
       其實(shí)很簡(jiǎn)單,首先你要知道仿真與實(shí)際不一樣!一開始你就拖家?guī)Э诘膶⒛阋瓿晒δ艿拇a都寫進(jìn)去,必死無疑!
       正確的方法了先做一個(gè),調(diào)試24C04外設(shè)固定地址,很重要!因?yàn)榉抡鎺靸?nèi)芯片外設(shè)地址還真不是一回事!
       一個(gè)一個(gè)將外設(shè)地址調(diào)對(duì)好,再就是設(shè)24C04存儲(chǔ)器存儲(chǔ)數(shù)據(jù)地址,設(shè)好后讀寫操作正常與否,再就是連讀連寫,多讀多寫,后面就是調(diào)試與按鍵配合
回復(fù)

使用道具 舉報(bào)

板凳
ID:536476 發(fā)表于 2019-5-13 21:19 | 只看該作者
刀刀見紅 發(fā)表于 2019-5-13 04:44
其實(shí)很簡(jiǎn)單,首先你要知道仿真與實(shí)際不一樣!一開始你就拖家?guī)Э诘膶⒛阋瓿晒δ艿拇a都寫進(jìn)去, ...

大佬說的對(duì)。經(jīng)驗(yàn)之談
回復(fù)

使用道具 舉報(bào)

地板
ID:396065 發(fā)表于 2020-10-17 18:26 | 只看該作者
重入函數(shù)嗎?你真的測(cè)試過嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:832110 發(fā)表于 2020-10-20 10:06 | 只看該作者
大佬說的對(duì)
回復(fù)

使用道具 舉報(bào)

6#
ID:337139 發(fā)表于 2020-10-20 17:42 | 只看該作者
寫一個(gè)固定地址,測(cè)試先。然后再讀這個(gè)地址看是否有變化!
回復(fù)

使用道具 舉報(bào)

7#
ID:580936 發(fā)表于 2020-10-29 21:29 | 只看該作者
你這個(gè)代碼明顯有錯(cuò)誤啊
回復(fù)

使用道具 舉報(bào)

8#
ID:165291 發(fā)表于 2021-1-8 21:07 | 只看該作者
這個(gè)是不是理解錯(cuò)誤啊?
回復(fù)

使用道具 舉報(bào)

9#
ID:165291 發(fā)表于 2021-1-8 21:08 | 只看該作者
在嗎?你這個(gè)理解真的對(duì)嗎?測(cè)試了嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久九九| 成人黄色在线 | 欧美黄色网络 | 一区二区三区在线免费看 | 久久这里有精品 | 精品欧美一区二区三区久久久 | 欧美一区二区三区在线看 | 日本三级电影在线免费观看 | 亚洲国产精品久久久 | 国产精品国产精品国产专区不卡 | 欧美日一区 | 欧美国产激情二区三区 | 欧美一级大片免费看 | 免费一区二区 | 天天色官网 | 国产一区成人 | 黄色网址在线免费观看 | 天天综合久久 | 成人小视频在线免费观看 | 欧美 日韩精品 | 一区二区三区在线 | 美女黄频 | 国产免费国产 | 亚洲成人午夜电影 | 免费在线播放黄色 | 免费精品 | jlzzjlzz欧美大全 | 国产精品美女久久久久久久网站 | 亚洲一区二区在线电影 | 中文字幕一级毛片视频 | 美国av毛片| 国产精品一区在线 | 不卡一区二区在线观看 | 欧美激情在线一区二区三区 | 国产一区二区黑人欧美xxxx | 成人在线观看免费视频 | 免费国产一区二区 | 天天干天天干 | 中文字幕精品一区二区三区在线 | 国产精品久久久久久久久久久免费看 | 久久久免费精品 |