📄 readwriteat24c08.lst
字号:
C51 COMPILER V7.50 READWRITEAT24C08 09/19/2006 14:43:25 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE READWRITEAT24C08
OBJECT MODULE PLACED IN ReadWriteAT24C08.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ReadWriteAT24C08.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2
3 // 对AT24C08的读、写
4 // extern void DelayMs(unsigned int);
5 // extern void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
6 // extern void WriteI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
7
8 /***************************************************************************/
9 #define WriteDeviceAddress 0xa0 //写器件地址
10 #define ReadDviceAddress 0xa1 //读器件地址
11
12 /***************************************************************************/
13 sbit SCL=P1^0; //I2C时钟线SCL
14 sbit SDA=P1^1; //I2C数据线SDA
15 sbit DOG=P3^7; //程序运行标志及数据读写正确标志
16
17 /***************************************************************************/
18 void DelayMs(unsigned int number) //延时子程序,延时大小取决于工作频率和number值
19 {
20 1 unsigned char temp;
21 1 for(;number!=0;number--,DOG=!DOG) //循环,DOG用于输出状态信号
22 1 {
23 2 for(temp=112;temp!=0;temp--) //空循环
24 2 {
25 3 }
26 2 }
27 1 }
28
29 /***************************************************************************/
30 void Start() //起始信号子程序
31 {
32 1 SDA=1;
33 1 DelayMs(1); //延时
34 1 SCL=1;
35 1 DelayMs(1);
36 1 SDA=0;
37 1 DelayMs(1);
38 1 SCL=0;
39 1 DelayMs(1);
40 1 }
41
42 /***************************************************************************/
43 void Stop() //终止信号子程序
44 {
45 1 SCL=0;
46 1 DelayMs(1);
47 1 SDA=0;
48 1 DelayMs(1);
49 1 SCL=1;
50 1 DelayMs(1);
51 1 SDA=1;
52 1 DelayMs(1);
53 1 }
54
55 /***************************************************************************/
C51 COMPILER V7.50 READWRITEAT24C08 09/19/2006 14:43:25 PAGE 2
56 void Ack() //发送应答位子程序
57 {
58 1 SDA=0;
59 1 DelayMs(1);
60 1 SCL=1;
61 1 DelayMs(1);
62 1 SCL=0;
63 1 DelayMs(1);
64 1 SDA=1;
65 1 DelayMs(1);
66 1 }
67
68 /***************************************************************************/
69 void NoAck() //发送非应答位子程序
70 {
71 1 SDA=1;
72 1 DelayMs(1);
73 1 SCL=1;
74 1 DelayMs(1);
75 1 SCL=0;
76 1 DelayMs(1);
77 1 }
78
79 /***************************************************************************/
80 bit TestAck() //应答位检查子程序
81 {
82 1 bit ErrorBit;
83 1 SDA=1;
84 1 DelayMs(1);
85 1 SCL=1;
86 1 DelayMs(1);
87 1 ErrorBit=SDA; //读入数据线上的应答状态
88 1 DelayMs(1);
89 1 SCL=0;
90 1 DelayMs(1);
91 1 return(ErrorBit); //返回应答状态,0为正常应答信号,1为非应答信号
92 1 }
93
94 /***************************************************************************/
95 bit Write8Bit(unsigned char input) //写一个字节数据子程序
96 { //input为待发送的数据
97 1 unsigned char temp;
98 1 for(temp=8;temp!=0;temp--) //循环移位,逐位发送数据
99 1 {
100 2 SDA=(bit)(input&0x80); //取数据的最高位
101 2 DelayMs(1);
102 2 SCL=1;
103 2 DelayMs(1);
104 2 SCL=0;
105 2 DelayMs(1);
106 2 input=input<<1; //左移一位
107 2 }
108 1 return 1;
109 1 }
110
111 /***************************************************************************/
112 void WriteI2C(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
113 { //写n个字节数据子程序
114 1 Start(); //启动
115 1 Write8Bit(WriteDeviceAddress); //写写器件的寻址地址
116 1 TestAck(); //应答检查
117 1 Write8Bit(RomAddress); //写入I2C器件内部的数据存储首地址
C51 COMPILER V7.50 READWRITEAT24C08 09/19/2006 14:43:25 PAGE 3
118 1 TestAck(); //应答检查
119 1 for(;number!=0;number--) //循环,逐个字节发送
120 1 {
121 2 Write8Bit(*Wdata); //写一个字节
122 2 TestAck(); //应答检查
123 2 Wdata++; //指针增加,指向下一个数据
124 2 }
125 1 Stop(); //停止
126 1 DelayMs(10);
127 1 }
128
129 /***************************************************************************/
130 unsigned char Read8Bit() //读一个字节数据子程序
131 {
132 1 unsigned char temp,rbyte=0;
133 1 for(temp=8;temp!=0;temp--) //循环,逐位读入字节数据
134 1 {
135 2 SCL=1;
136 2 DelayMs(1);
137 2 rbyte=rbyte<<1; //左移一位
138 2 DelayMs(1);
139 2 rbyte=rbyte|((unsigned char)(SDA)); //数据线SDA上的数据存入rbyte的最低位
140 2 SCL=0;
141 2 DelayMs(1);
142 2 }
143 1 return(rbyte); //返回读入的字节数据
144 1 }
145
146 /***************************************************************************/
147 void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
148 { //读n个字节数据子程序
149 1 Start(); //启动
150 1 Write8Bit(WriteDeviceAddress); //写写器件的寻址地址
151 1 TestAck(); //应答检查
152 1 Write8Bit(RomAddress); //写I2C器件内部数据的读取首地址
153 1 TestAck(); //应答检查
154 1 Start(); //重新启动
155 1 Write8Bit(ReadDviceAddress); //写读器件的寻址地址
156 1 TestAck(); //应答检查
157 1 while(bytes!=1) //循环读入字节数据
158 1 {
159 2 *RamAddress=Read8Bit(); //读入一个字节
160 2 Ack(); //应答
161 2 RamAddress++; //地址指针递增
162 2 bytes--; //待读入数据个数递减
163 2 }
164 1 *RamAddress=Read8Bit(); //读入最后一个字节数据
165 1 NoAck(); //非应答
166 1 Stop(); //停止
167 1 }
168
169 void main()
170 {
171 1 unsigned char writeByte[8]={0xC0,0x34,0x12,0x11,0x22,0x01,0x00,0x00};
172 1 //需要写的8个字节USB数据ID
173 1 unsigned char readByte[8]; //用于存读入的8个字节数据
174 1 unsigned char *addw; //写数据指针操作
175 1 unsigned char *addr; //读数据指针操作
176 1 unsigned char i;
177 1 unsigned char ok=0;
178 1 bit write=1; //读写标志
179 1 DOG=0;
C51 COMPILER V7.50 READWRITEAT24C08 09/19/2006 14:43:25 PAGE 4
180 1 while(1)
181 1 {
182 2 if(write==1) //当write==1时,执行写和读操作
183 2 {
184 3 addw=writeByte; //写地址映射
185 3 addr=readByte; //读地址映射
186 3 WriteI2C(addw,0x00,8); //写数据
187 3 ReadI2C(addr,0x00,8); //读数据
188 3 for(i=0;i<8;i++) //判断每个字节读写是否一致
189 3 {
190 4 if(writeByte[i]==readByte[i])
191 4 {
192 5 ok++;
193 5 }
194 4 }
195 3 if(ok==8)
196 3 {
197 4 DOG=1; //当读写一致时,P3.7输出高电平
198 4 }
199 3 else
200 3 {
201 4 DOG=0; //当读写不一致时,P3.7输出低电平
202 4 }
203 3 write=0; //置write==0,读写完毕
204 3 }
205 2 }
206 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 440 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 33
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -