📄 eeprom.lst
字号:
C51 COMPILER V8.02 EEPROM 01/04/2011 02:19:31 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <INTRINS.H>
3 typedef unsigned char uint8;
4 typedef unsigned int uint16;
5 typedef unsigned long uint32;
6 sbit SCL = P3^7;
7 sbit SDA = P3^6;
8 /*****************************************************************************
9 ** 函数名称:Delay
10 ** 功能描述:延时子程序
11 ******************************************************************************/
12 void Delay(void)
13 {
14 1 _nop_();
15 1 _nop_();
16 1 _nop_();
17 1 _nop_();
18 1
19 1 }
20 /*****************************************************************************
21 ** 函数名称:InitI2C
22 ** 功能描述:配置模拟I2C的IO端口
23 ** 可移植性:注意IO口需支持漏开输出
24 ******************************************************************************/
25 void InitI2C(void)
26 {
27 1 SDA = 1;
28 1 SCL = 1;
29 1 }
30 /*****************************************************************************
31 ** 函数名称:I2CStart
32 ** 功能描述:发送I2C总线起始状态
33 ** 输 入:无
34 ** 输 出:无
35 ** 全局变量:无
36 ** 调用模块:Delay_us()
37 ** 可移植性:直接移植
38 ******************************************************************************/
39 void I2CStart(void)
40 {
41 1 SDA = 1;
42 1 Delay(); // 延时子程序
43 1 SCL = 1;
44 1 Delay();
45 1 SDA = 0;
46 1 Delay();
47 1 SCL = 0;
48 1
49 1 }
50 /*****************************************************************************
51 ** 函数名称:I2CStop
52 ** 功能描述:发送I2C总线停止起始状态
53 ** 输 入:无
54 ** 输 出:无
55 ** 全局变量:无
C51 COMPILER V8.02 EEPROM 01/04/2011 02:19:31 PAGE 2
56 ** 调用模块:Delay_us()
57 ** 可移植性:直接移植
58 ******************************************************************************/
59 void I2CStop(void)
60 {
61 1 SCL = 0;
62 1 Delay();
63 1 SDA = 0;
64 1 Delay();
65 1 SCL = 1;
66 1 Delay();
67 1 SDA = 1;
68 1 Delay();
69 1
70 1 }
71 /*****************************************************************************
72 ** 函数名称:I2CSend
73 ** 功能描述:向I2C总线发送一个字节数据,并检测应答
74 ** 输 入:待发送字节byte
75 ** 输 出:无
76 ** 全局变量:无
77 ** 调用模块:Delay_us()
78 ** 可移植性:直接移植
79 ******************************************************************************/
80 void I2CSend(uint8 byte)
81 {
82 1 uint8 mask;
83 1 uint8 i;
84 1 uint8 j;
85 1
86 1 mask = 0x80;
87 1 for(i = 0; i < 8; i++)
88 1 {
89 2 SCL = 0;
90 2 Delay();
91 2 if((mask & byte) == 0)
92 2 {
93 3 SDA = 0;
94 3 }
95 2 else
96 2 {
97 3 SDA = 1;
98 3 }
99 2 mask >>= 1;
100 2 Delay();
101 2 SCL = 1;
102 2 Delay();
103 2 }
104 1
105 1 SCL = 0;
106 1 SDA = 1;
107 1 Delay();
108 1 SCL = 1;
109 1 j = SDA;
110 1 Delay();
111 1 SCL = 0;
112 1
113 1 }
114
115 /*****************************************************************************
116 ** 函数名称:I2CRead
117 ** 功能描述:从I2C总线读取最后一个字节数据,并发送非应答位
C51 COMPILER V8.02 EEPROM 01/04/2011 02:19:31 PAGE 3
118 ** 输 入:无
119 ** 输 出:接收到的字节byte
120 ** 全局变量:无
121 ** 调用模块:Delay_us()
122 ** 可移植性:直接移植
123 ******************************************************************************/
124 uint8 I2CRead(void)
125 {
126 1 uint8 byte;
127 1 uint8 i;
128 1
129 1 byte = 0;
130 1 for(i = 0; i < 8; i++)
131 1 {
132 2 SCL = 0;
133 2 SDA = 1;
134 2 Delay();
135 2 SCL = 1;
136 2 Delay();
137 2 byte <<= 1;
138 2 if(SDA == 1)
139 2 {
140 3 byte |= 0x01;
141 3 }
142 2 Delay();
143 2 }
144 1 SCL = 0;
145 1 SDA = 1;
146 1 Delay();
147 1 SCL = 1;
148 1 Delay();
149 1 SCL = 0;
150 1
151 1 return byte;
152 1
153 1 }
154 /*****************************************************************************
155 ** 函数名称:I2CReadAck
156 ** 功能描述:从I2C总线读取一个字节数据,并发送应答
157 ** 输 入:无
158 ** 输 出:接收到的字节byte
159 ** 全局变量:无
160 ** 调用模块:Delay_us()
161 ** 可移植性:直接移植
162 ******************************************************************************/
163 uint8 I2CReadAck(void)
164 {
165 1 uint8 i;
166 1 uint8 byte;
167 1
168 1 byte = 0;
169 1 for(i=0;i<8;i++)
170 1 {
171 2 SCL = 0;
172 2 SDA = 1;
173 2 Delay();
174 2 SCL = 1;
175 2 Delay();
176 2 byte <<= 1;
177 2 if(SDA==1) {byte |= 0x01;}
178 2 Delay();
179 2 }
C51 COMPILER V8.02 EEPROM 01/04/2011 02:19:31 PAGE 4
180 1 SCL = 0;
181 1 Delay();
182 1 SDA = 0;
183 1 Delay();
184 1 SCL = 1;
185 1 Delay();
186 1 SCL = 0;
187 1
188 1 return byte;
189 1 }
190 /*****************************************************************************
191 ** 函数名称:read_eeprom
192 ** 功能描述:读取EEPROM数据函数(可多片共存)
193 ** 输 入:E2中目的地址addr
194 ** 输 出:读取的数据
195 ** 全局变量:无
196 ** 调用模块:I2CStart(),I2CSend(),I2CStop()
197 ******************************************************************************/
198 uint8 read_eeprom(uint8 addr)
199 {
200 1 uint8 databyte;
201 1
202 1 I2CStart();
203 1 I2CSend(0xa0);
204 1 I2CSend(addr);
205 1 I2CStart();
206 1 I2CSend(0xa1);
207 1 databyte = I2CRead();
208 1 I2CStop();
209 1
210 1 return databyte;
211 1
212 1 }
213
214 /*****************************************************************************
215 ** 函数名称:write_eeprom
216 ** 功能描述:读取EEPROM数据函数(可多片共存)
217 ** 输 入:E2中目的地址addr
218 ** 输 出:读取的数据
219 ** 全局变量:无
220 ** 调用模块:I2CStart(),I2CSend(),I2CStop()
221 ******************************************************************************/
222 void write_eeprom(uint8 addr, uint8 databyte)
223 {
224 1 I2CStart();
225 1 I2CSend(0xa0);
226 1 I2CSend(addr);
227 1 I2CSend(databyte);
228 1 I2CStop();
229 1
230 1 }
231
232 void UART_init(void)
233 {
234 1 SCON = 0x50;
235 1 TMOD = 0x20;
236 1 TH1 = 0xFD;
237 1 TL1 = 0xFD;
238 1 TR1 = 1;
239 1 // ES = 1;
240 1 // EA = 1;
241 1 }
C51 COMPILER V8.02 EEPROM 01/04/2011 02:19:31 PAGE 5
242 void UART_send_byte(uint8 dat)
243 {
244 1 SBUF = dat;
245 1 while(!TI);
246 1 TI = 0;
247 1 }
248 /*****************************************************************************
249 ** 函数名称:主函数main
250 ** 功能描述:读写EEPROM
251 ** 输 入:
252 ** 输 出:
253 ******************************************************************************/
254 main()
255 {
256 1 uint8 addr = 0x00, databyte = 0xe4;
257 1 uint8 c = 0;
258 1 uint16 i;
259 1
260 1 UART_init();
261 1 InitI2C();
262 1 while(1)
263 1 {
264 2 write_eeprom(addr, databyte);
265 2 for(i = 0; i < 1000; i++)
266 2 {
267 3 Delay();
268 3 }
269 2 c = read_eeprom(addr);
270 2 UART_send_byte(c);
271 2 addr++;
272 2 databyte++;
273 2 if(addr == 0xff) {addr = 0;}
274 2 if(databyte == 0xff) {databyte = 0;}
275 2 for(i = 0; i < 1000; i++)
276 2 {
277 3 Delay();
278 3 }
279 2 }
280 1
281 1
282 1 }
283
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 324 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -