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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11969|回復: 8
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
通過仿真實現對存儲器AT24C04讀寫操作,通過數碼管或LED燈狀態來顯示


原理圖




實驗結果圖

實驗部分代碼結構:
//24C04.c
  1. //-----------------------------------------------------------------
  2. //  名稱: AT24C04讀/寫驅動程序
  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;                                        //串行時鐘線
  11. sbit SDA = P1^1;                                        //串行數據線
  12. #include "I2C.h"                                        //IIC總線通用宏及函數
  13. //-----------------------------------------------------------------
  14. //AT24C04所調用的外部相關函數
  15. extern void Show_HEX(INT8U dat);         //16進制格式顯示字節
  16. extern void PutStr(INT8U *s);                //串口輸出字符串
  17. extern void delay_ms(INT16U);                //延時函數
  18. extern INT16U r;                                        //換行控制變量
  19. //-----------------------------------------------------------------
  20. // 向任意指定的地址寫入一字節數據
  21. // 器件地址碼字節格式 (其中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. // 從任意地址讀取一字節數據
  30. //-----------------------------------------------------------------
  31. INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
  32. {

  33. }

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

  39. }
復制代碼
//IC.h

  1. //-----------------------------------------------------------------
  2. // 名稱: IIC總線通用宏及函數
  3. //-----------------------------------------------------------------
  4. #define NOP4()        { _nop_();_nop_();_nop_();_nop_(); }
  5. //總線啟動        -------------------------------------------------------
  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個有關應答的宏定義均生成第9個時鐘脈沖,讀取應答或發送應答/非應答
  13. //1.主機讀從機應答        -----------------------------------------------
  14. //(SDA = 1設為輸入,準備讀取應答位,要使用該位作出處理時引用F0)
  15. #define IIC_Rd_Ack()        \
  16. { SDA = 1; NOP4(); SCL = 1; NOP4(); F0 = !SDA; NOP4(); SCL = 0;        }
  17. //2.主機發送應答位        -----------------------------------------------
  18. #define IIC_Ack()                \
  19. { SDA = 0; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 1;        }
  20. //3.主機發送非應答位        -------------------------------------------
  21. #define IIC_NAck()                \
  22. { SDA = 1; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 0;        }
  23. //-----------------------------------------------------------------
  24. // 主機向IIC總線寫一字節
  25. //-----------------------------------------------------------------
  26. bit IIC_WriteByte(INT8U dat)
  27. {

  28. }

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

  34. }
復制代碼
主程序main.c

  1. //-----------------------------------------------------------------
  2. //        名稱: I2C接口存儲器AT24C04讀寫與顯示(4片)
  3. //-----------------------------------------------------------------
  4. //        說明: 按下K1-K4按鍵時,前兩個分別向第1,2片AT24C04中寫入400個隨機字節
  5. //                  后2個按鍵分別寫第3,4片AT24C04,先寫入200個0x01,再寫入200個0x02
  6. //                  寫入后接著讀取并顯示.(400個字節的地址范圍: 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;                //四個操作按鍵定義
  16. sbit K2 = P3^4;
  17. sbit K3 = P3^5;
  18. sbit K4 = P3^6;
  19. INT16U r = 0;                //滿20個字節換行控制變量
  20. //AT24C04相關函數
  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. // 延時函數
  26. //-----------------------------------------------------------------
  27. void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
  28. //-----------------------------------------------------------------
  29. // 向串口發送1字節
  30. //-----------------------------------------------------------------
  31. void PutChar(INT8U c) {        SBUF = c; while( TI == 0 ); TI = 0;}
  32. //-----------------------------------------------------------------
  33. // 向串口發送字符串
  34. //-----------------------------------------------------------------
  35. void PutStr(INT8U *s) { while(*s) PutChar(*s++); }
  36. //-----------------------------------------------------------------
  37. // sprintf對%2X格式支持不穩定,編譯時有時可以輸出正確結果,有時則不正常
  38. // sprintf(s,"%02X ",(INT8U)Random_Read(0xA0,i)); PutStr(s);
  39. // 故改用下面的函數實現十六進制形式顯示所讀取的字節
  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);                //隨機種子
  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位按鍵狀態檢測
  59.                 {



  60.                 } else { delay_ms(10); continue; }
  61.                 PutStr("\r\n\r\n>>> Write IIC, Waiting.........\r\n\r\n ");
  62.                 //提示當前讀取的AT24C04芯片號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個隨機字節



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



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









  72.         }
  73. }
復制代碼
完整代碼

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

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

使用道具 舉報

沙發
ID:469417 發表于 2019-5-13 04:44 | 只看該作者
       其實很簡單,首先你要知道仿真與實際不一樣!一開始你就拖家帶口的將你要完成功能的代碼都寫進去,必死無疑!
       正確的方法了先做一個,調試24C04外設固定地址,很重要!因為仿真庫內芯片外設地址還真不是一回事!
       一個一個將外設地址調對好,再就是設24C04存儲器存儲數據地址,設好后讀寫操作正常與否,再就是連讀連寫,多讀多寫,后面就是調試與按鍵配合
回復

使用道具 舉報

板凳
ID:536476 發表于 2019-5-13 21:19 | 只看該作者
刀刀見紅 發表于 2019-5-13 04:44
其實很簡單,首先你要知道仿真與實際不一樣!一開始你就拖家帶口的將你要完成功能的代碼都寫進去, ...

大佬說的對。經驗之談
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:832110 發表于 2020-10-20 10:06 | 只看該作者
大佬說的對
回復

使用道具 舉報

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

使用道具 舉報

7#
ID:580936 發表于 2020-10-29 21:29 | 只看該作者
你這個代碼明顯有錯誤啊
回復

使用道具 舉報

8#
ID:165291 發表于 2021-1-8 21:07 | 只看該作者
這個是不是理解錯誤啊?
回復

使用道具 舉報

9#
ID:165291 發表于 2021-1-8 21:08 | 只看該作者
在嗎?你這個理解真的對嗎?測試了嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线综合网 | 伊人网av | 又黄又爽网站 | 久久久久久久免费视频 | 色在线视频 | 黄色国产网站 | 久久精品视频免费 | 超碰人人在线 | 毛片毛片毛片毛片毛片 | 五月综合色 | 亚洲第一免费视频 | 亚洲成人精品一区 | 欧美在线播放视频 | 亚洲欧美日韩另类 | 日韩毛片免费看 | 亚洲精品免费在线 | 日日干日日操 | 国产成人片 | 国产综合久久 | 亚洲国产精品成人无久久精品 | 国产精品亚洲精品 | 久久久免费观看 | 日韩一区二区视频 | 国产一二 | av在线天堂网| 国产亚洲欧美在线 | 在线观看av的网站 | 成人爽a毛片一区二区免费 亚洲午夜在线观看 | 毛片毛片毛片 | 国产精品成人免费视频 | 中文字幕免费看 | 毛片网站免费 | 欧美一区二区在线 | 青青草国产成人av片免费 | 欧美一级免费看 | 手机av片 | 精品一区久久 | 六月婷婷在线 | 玖玖精品在线 | 在线免费观看av片 | 一级片在线 |