📄 eeprom_24c02.lst
字号:
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE EEPROM_24C02
OBJECT MODULE PLACED IN EEPROM_24C02.OBJ
COMPILER INVOKED BY: D:\Progrom\Keil\C51\BIN\C51.EXE EEPROM_24C02.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 * 文件名 : EEPROM_24C02.c
3 * 描述 : 该文件实现对24C02的操作。
4 确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
5 数码管显示的值会从断电钱的那个值开始显示。
6 * 创建人 : 东流,2009年4月9日
7 ***********************************************************************/
8 #include <reg52.h>
9 #include <intrins.h>
10
11 #define uchar unsigned char
12 #define uint unsigned int
13
14 sbit scl=P1^5; //24c08 SCL
15 sbit sda=P3^6; //24c08 SDA
16
17 uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
18 uchar sec; //定义计数值,每过1秒,sec加1
19 uint write; //写标志位
20
21 /********************************************************************
22 * 名称 : delay1()
23 * 功能 : 短暂延时
24 * 输入 : x
25 * 输出 : 无
26 ***********************************************************************/
27 void delay1(uchar x)
28 {
29 1 uint i;
30 1 for(i=0; i<x; i++)
31 1 ;
32 1 }
33
34 /********************************************************************
35 * 名称 : flash()
36 * 功能 : 延时,时间为2个NOP,大概为2US
37 * 输入 : 无
38 * 输出 : 无
39 ***********************************************************************/
40 void flash(void)
41 {
42 1 _nop_();
43 1 _nop_();
44 1 }
45
46 /********************************************************************
47 * 名称 : x24c02_init()
48 * 功能 : 24c02初始化子程序
49 * 输入 : 无
50 * 输出 : 无
51 ***********************************************************************/
52 void x24c02_init(void)
53 {
54 1 scl = 1;
55 1 flash();
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 2
56 1 sda = 1;
57 1 flash();
58 1 }
59
60 /********************************************************************
61 * 名称 : start(void)
62 * 功能 : 启动I2C总线
63 * 输入 : 无
64 * 输出 : 无
65 ***********************************************************************/
66 void start(void)
67 {
68 1 sda = 1;
69 1 flash();
70 1 scl = 1;
71 1 flash();
72 1 sda = 0;
73 1 flash();
74 1 scl = 0;
75 1 flash();
76 1 }
77
78 /********************************************************************
79 * 名称 : stop()
80 * 功能 : 停止I2C总线
81 * 输入 : 无
82 * 输出 : 无
83 ***********************************************************************/
84 void stop()
85 {
86 1 sda = 0;
87 1 flash();
88 1 scl = 1;
89 1 flash();
90 1 sda = 1;
91 1 flash();
92 1 }
93
94 /********************************************************************
95 * 名称 : writex()
96 * 功能 : 写一个字节
97 * 输入 : j(需要写入的值)
98 * 输出 : 无
99 ***********************************************************************/
100 void writex(uchar j)
101 {
102 1 uchar i,temp;
103 1 temp = j;
104 1 for(i=0; i<8; i++)
105 1 {
106 2 temp = temp << 1;
107 2 scl = 0;
108 2 flash();
109 2 sda = CY;
110 2 flash();
111 2 scl = 1;
112 2 flash();
113 2 }
114 1 scl = 0;
115 1 flash();
116 1 sda = 1;
117 1 flash();
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 3
118 1 }
119
120 /********************************************************************
121 * 名称 : readx()
122 * 功能 : 读一个字节
123 * 输入 : 无
124 * 输出 : 读出的值
125 ***********************************************************************/
126 uchar readx(void)
127 {
128 1 uchar i, j, k = 0;
129 1 scl = 0;
130 1 flash();
131 1 sda = 1;
132 1 for(i=0; i<8; i++)
133 1 {
134 2 flash();
135 2 scl = 1;
136 2 flash();
137 2 if(sda == 1)
138 2 {
139 3 j = 1;
140 3 }
141 2 else j = 0;
142 2 k = (k << 1) | j;
143 2 scl = 0;
144 2 }
145 1 flash();
146 1 return(k);
147 1 }
148
149 /********************************************************************
150 * 名称 : clock()
151 * 功能 : I2C总线时钟
152 * 输入 : 无
153 * 输出 : 无
154 ***********************************************************************/
155 void clock(void)
156 {
157 1 uchar i = 0;
158 1 scl = 1;
159 1 flash();
160 1 while((sda == 1) && (i < 255))
161 1 {
162 2 i++;
163 2 }
164 1 scl = 0;
165 1 flash();
166 1 }
167
168 /********************************************************************
169 * 名称 : x24c02_read()
170 * 功能 : 从24c02中读出值
171 * 输入 : address(要在这个地址读取值)
172 * 输出 : 从24c02中读出的值
173 ***********************************************************************/
174 uchar x24c02_read(uchar address)
175 {
176 1 uchar i;
177 1 start();
178 1 writex(0xa0);
179 1 clock();
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 4
180 1 writex(address);
181 1 clock();
182 1 start();
183 1 writex(0xa1);
184 1 clock();
185 1 i = readx();
186 1 stop();
187 1 delay1(10);
188 1 return(i);
189 1 }
190
191 /********************************************************************
192 * 名称 : x24c02_write()
193 * 功能 : 想24c02中写入数据
194 * 输入 : address(地址) , info(值)
195 * 输出 : 无
196 ***********************************************************************/
197 void x24c02_write(uchar address, uchar info)
198 {
199 1 EA = 0;
200 1 start();
201 1 writex(0xa0);
202 1 clock();
203 1 writex(address);
204 1 clock();
205 1 writex(info);
206 1 clock();
207 1 stop();
208 1 EA = 1;
209 1 delay1(50);
210 1 }
211
212 /********************************************************************
213 * 名称 : Delay_1ms()
214 * 功能 : 延时,延时时间为 1ms * i
215 * 输入 : i(延时1ms的个数)
216 * 输出 : 无
217 ***********************************************************************/
218 void Delay_1ms(uint i)
219 {
220 1 uchar x, j;
221 1 for(j=0; j<i; j++)
222 1 for(x=0; x<=148; x++)
223 1 ;
224 1 }
225
226 /********************************************************************
227 * 名称 : LED()
228 * 功能 : 显示
229 * 输入 : 无
230 * 输出 : 无
231 ***********************************************************************/
232 void LED() //LED显示函数
233 {
234 1 P2 = 0x06;
235 1 P0 = table[sec / 10];
236 1 Delay_1ms(5);
237 1 P2 = 0x07;
238 1 P0 = table[sec % 10];
239 1 Delay_1ms(5);
240 1 }
241
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 5
242 /********************************************************************
243 * 名称 : time0()
244 * 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
245 * 输入 : del
246 * 输出 : 无
247 ***********************************************************************/
248 void time0(void) interrupt 1 using 3 //定时中断服务函数
249 {
250 1 static uchar Count = 0;
251 1 TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
252 1 TL0 = (65536 - 50000) % 256; //重装计数初值
253 1 Count++; //每过250ust tcnt加一
254 1 if(Count == 20) //计满20次(1秒)时
255 1 {
256 2 Count = 0; //重新再计
257 2 sec++;
258 2 write = 1; //1秒写一次24C08
259 2 if(sec == 100) //定时100秒,在从零开始计时
260 2 {
261 3 sec = 0;
262 3 }
263 2 }
264 1 }
265
266 /********************************************************************
267 * 名称 : Time0_Init()
268 * 功能 : 定时器0的初始化
269 * 输入 : 无
270 * 输出 : 无
271 ***********************************************************************/
272 void Time0_Init(void)
273 {
274 1 TMOD = 0x01; //定时器工作在方式1
275 1 ET0 = 1;
276 1 EA = 1;
277 1 TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
278 1 TL0 = (65536 - 50000) % 256; //使定时器0.05秒中断一次
279 1 TR0 = 1; //开始计时
280 1 }
281
282 /********************************************************************
283 * 名称 : Main()
284 * 功能 : 主函数
285 * 输入 : 无
286 * 输出 : 无
287 ***********************************************************************/
288 void Main(void)
289 {
290 1 P2 = 0x00;
291 1 x24c02_init(); //初始化24C02
292 1 Time0_Init();
293 1 sec = x24c02_read(2); //读出保存的数据赋于sec
294 1 while(1)
295 1 {
296 2 LED();
297 2 if(write == 1) //判断计时器是否计时一秒
298 2 {
299 3 write =0 ; //清零
300 3 x24c02_write(2,sec); //在24c08的地址2中写入数据sec
301 3 }
302 2 }
303 1 }
C51 COMPILER V7.02b EEPROM_24C02 09/26/2009 10:30:46 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 395 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
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 + -