【Proteus仿真】在AT24C04的连续地址中写入数据并循环读取
【Proteus仿真】在AT24C04的连续地址中写入数据并循环读取
- Proteus仿真

实验说明
在AT24C04的地址0-9中分别写入数据,然后在while循环里面循环从AT24C04的地址0-9读取数据,并通过数码管显示数出来,来验证数据的写入和读取是否成功。
- 本示例是展示如何将数据写入到AT24C04当中,并读取数据,可以用于移植到有需要的相关项目当中。
程序代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define NOP4() {\_nop\_();\_nop\_();\_nop\_();\_nop\_();}
sbit SCL = P1^0; sbit SDA = P1^1;
uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar DISP_Buffer[]={0,0,0}; uchar Count = 0;
void DelayMS(uint x) { uchar t; while(x--) { for(t=120;t>0;t--); } }
void Start() { SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0; }
void Stop() { SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1; }
void RACK() { SDA=1;NOP4();SCL=1;NOP4();SCL=0; }
void NO\_ACK() { SDA=1;SCL=1;NOP4();SCL=0;SDA=0; }
void Write\_A\_Byte(uchar b) { uchar i; for(i=0;i<8;i++) { b<<=1;SDA=CY;\_nop\_();SCL=1;NOP4();SCL=0; } RACK(); }
uchar Receive\_A\_Byte() { uchar i,d; for(i=0;i<8;i++) { SCL=1;d<<=1;d|=SDA;SCL=0; } return d; } /\*地址位写数据\*/ void Write\_Random\_Address\_Byte(uchar add,uchar dat) { Start(); Write\_A\_Byte(0xa0); Write\_A\_Byte(add); Write\_A\_Byte(dat); Stop(); DelayMS(10); } /\*读数据\*/ uchar Read\_Current\_Address\_Data() { uchar d; Start(); Write\_A\_Byte(0xa1); d=Receive\_A\_Byte(); NO\_ACK(); Stop(); return d; } /\*地址位读数据\*/ uchar Random\_Read(uchar addr) { Start(); Write\_A\_Byte(0xa0); Write\_A\_Byte(addr); Stop(); return Read\_Current\_Address\_Data(); }
void Convert\_And\_Display() { unsigned char k =0,j=0,z=0; for(z=0;z<10;z++){ for(j=0;j<120;j++){ Count = Random\_Read(k);//从AT24C04中读数据 DISP_Buffer[2] = Count/100; DISP_Buffer[1] = Count%100/10; DISP_Buffer[0] = Count%100%10; // if(DISP\_Buffer[2] == 0) // { // DISP\_Buffer[2] = 10; // if(DISP\_Buffer[1] == 0) // { // DISP\_Buffer[1] = 10; // } // } P2 = 0x80; P0 = DSY_CODE[DISP_Buffer[0]]; DelayMS(2); P2 = 0x40; P0 = DSY_CODE[DISP_Buffer[1]]; DelayMS(2); P2 = 0x20; P0 = DSY_CODE[DISP_Buffer[2]]; DelayMS(2); } k++; } }
void main() { unsigned char i=0; // Count = Random\_Read(0x00) + 1; // Write\_Random\_Address\_Byte(0x00,Count); for(i=0;i<10;i++){ Write\_Random\_Address\_Byte(i,111+i);//指定地址写数据 } while(1){ Convert\_And\_Display(); } }
|
程序源码和仿真资源
本示例基于Proteus8.12平台。
1 2 3
| 链接:https://pan.baidu.com/s/1TCEXVLOZqa\_KnJ-1tiTKAw 提取码:k0kq
|
| 每一枝玫瑰都有刺正如每个人的性格里都有你不能容忍的部分。 |
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!