【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


每一枝玫瑰都有刺正如每个人的性格里都有你不能容忍的部分。