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