📄 eeprom_24c02.lst
字号:
C51 COMPILER V7.50 EEPROM_24C02 09/19/2011 11:17:32 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE EEPROM_24C02
OBJECT MODULE PLACED IN EEPROM_24C02.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE EEPROM_24C02.c BROWSE DEBUG OBJECTEXTEND
line 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 * 名称 : flash()
23 * 功能 : 延时,时间为2个NOP,大概为2US
24 * 输入 : 无
25 * 输出 : 无
26 ***********************************************************************/
27 void flash(void)
28 {
29 1 _nop_();
30 1 _nop_();
31 1 }
32
33 /********************************************************************
34 * 名称 : x24c02_init()
35 * 功能 : 24c02初始化子程序
36 * 输入 : 无
37 * 输出 : 无
38 ***********************************************************************/
39 void x24c02_init(void)
40 {
41 1 scl = 1;
42 1 flash();
43 1 sda = 1;
44 1 flash();
45 1 }
46
47 /********************************************************************
48 * 名称 : start(void)
49 * 功能 : 启动I2C总线
50 * 输入 : 无
51 * 输出 : 无
52 ***********************************************************************/
53 void start(void)
54 {
55 1 scl = 1;
C51 COMPILER V7.50 EEPROM_24C02 09/19/2011 11:17:32 PAGE 2
56 1 flash();
57 1 sda = 1;
58 1 flash();
59 1 sda = 0;
60 1 flash();
61 1 scl = 0;
62 1 flash();
63 1 }
64
65 /********************************************************************
66 * 名称 : stop()
67 * 功能 : 停止I2C总线
68 * 输入 : 无
69 * 输出 : 无
70 ***********************************************************************/
71 void stop()
72 {
73 1 scl = 0;
74 1 flash();
75 1 sda = 0;
76 1 flash();
77 1 scl = 1;
78 1 flash();
79 1 sda = 1;
80 1 flash();
81 1 }
82
83 /********************************************************************
84 * 名称 : writex()
85 * 功能 : 写一个字节
86 * 输入 : j(需要写入的值)
87 * 输出 : 无
88 ***********************************************************************/
89 void writex(uchar j)
90 {
91 1 uchar i,temp;
92 1 temp = j;
93 1 for(i=0; i<8; i++)
94 1 {
95 2 scl = 0;
96 2 flash();
97 2 sda = (bit)(temp & 0x80);
98 2 flash();
99 2 scl = 1;
100 2 flash();
101 2 temp = temp << 1;
102 2 }
103 1 scl = 0;
104 1 flash();
105 1 }
106
107 /********************************************************************
108 * 名称 : readx()
109 * 功能 : 读一个字节
110 * 输入 : 无
111 * 输出 : 读出的值
112 ***********************************************************************/
113 uchar readx(void)
114 {
115 1 uchar i, j, k = 0;
116 1 for(i=0; i<8; i++)
117 1 {
C51 COMPILER V7.50 EEPROM_24C02 09/19/2011 11:17:32 PAGE 3
118 2 scl = 0;
119 2 flash();
120 2 if(sda == 1)
121 2 {
122 3 j = 1;
123 3 }
124 2 else j = 0;
125 2 k = (k << 1) | j;
126 2 scl = 1;
127 2 flash();
128 2 }
129 1 return(k);
130 1 }
131
132 /********************************************************************
133 * 名称 : ack()
134 * 功能 : I2C总线时钟
135 * 输入 : 无
136 * 输出 : 无
137 ***********************************************************************/
138 void ack(void)
139 {
140 1 uchar i = 0;
141 1 scl = 1;
142 1 flash();
143 1 while((sda == 1) && (i < 255))
144 1 {
145 2 i++;
146 2 }
147 1 scl = 0;
148 1 flash();
149 1 }
150
151 /********************************************************************
152 * 名称 : x24c02_read()
153 * 功能 : 从24c02中读出值
154 * 输入 : address(要在这个地址读取值)
155 * 输出 : 从24c02中读出的值
156 ***********************************************************************/
157 uchar x24c02_read(uchar address)
158 {
159 1 uchar i;
160 1 start();
161 1 writex(0xa0);
162 1 ack();
163 1 writex(address);
164 1 ack();
165 1 start();
166 1 writex(0xa1);
167 1 ack();
168 1 i = readx();
169 1 stop();
170 1 return(i);
171 1 }
172
173 /********************************************************************
174 * 名称 : x24c02_write()
175 * 功能 : 想24c02中写入数据
176 * 输入 : address(地址) , info(值)
177 * 输出 : 无
178 ***********************************************************************/
179 void x24c02_write(uchar address, uchar info)
C51 COMPILER V7.50 EEPROM_24C02 09/19/2011 11:17:32 PAGE 4
180 {
181 1 EA = 0;
182 1 start();
183 1 writex(0xa0);
184 1 ack();
185 1 writex(address);
186 1 ack();
187 1 writex(info);
188 1 ack();
189 1 stop();
190 1 EA = 1;
191 1 }
192
193 /********************************************************************
194 * 名称 : Delay_1ms()
195 * 功能 : 延时,延时时间为 1ms * i
196 * 输入 : i(延时1ms的个数)
197 * 输出 : 无
198 ***********************************************************************/
199 void Delay_1ms(uint i)
200 {
201 1 uchar x, j;
202 1 for(j=0; j<i; j++)
203 1 for(x=0; x<=148; x++)
204 1 ;
205 1 }
206
207 /********************************************************************
208 * 名称 : LED()
209 * 功能 : 显示
210 * 输入 : 无
211 * 输出 : 无
212 ***********************************************************************/
213 void LED() //LED显示函数
214 {
215 1 P2 = 6;
216 1 P0 = table[sec / 10];
217 1 Delay_1ms(5);
218 1 P2 = 7;
219 1 P0 = table[sec % 10];
220 1 Delay_1ms(5);
221 1 }
222
223 /********************************************************************
224 * 名称 : time0()
225 * 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
226 * 输入 : del
227 * 输出 : 无
228 ***********************************************************************/
229 void time0(void) interrupt 1 using 3 //定时中断服务函数
230 {
231 1 static uchar Count = 0;
232 1 TH0 = 0x4c; //对TH0 TL0赋值
233 1 TL0 = 0x00; //重装计数初值
234 1 Count++;
235 1 if(Count == 20) //计满20次(1秒)时
236 1 {
237 2 Count = 0; //重新再计
238 2 sec++;
239 2 write = 1; //1秒写一次24C08
240 2 if(sec == 100) //定时100秒,在从零开始计时
241 2 {
C51 COMPILER V7.50 EEPROM_24C02 09/19/2011 11:17:32 PAGE 5
242 3 sec = 0;
243 3 }
244 2 }
245 1 }
246
247 /********************************************************************
248 * 名称 : Time0_Init()
249 * 功能 : 定时器0的初始化
250 * 输入 : 无
251 * 输出 : 无
252 ***********************************************************************/
253 void Time0_Init(void)
254 {
255 1 TMOD = 0x01; //定时器工作在方式1
256 1 ET0 = 1;
257 1 EA = 1;
258 1 TH0 = 0x4c; //对TH0 TL0赋值
259 1 TL0 = 0x00; //使定时器0.05秒中断一次
260 1 TR0 = 1; //开始计时
261 1 }
262
263 /********************************************************************
264 * 名称 : Main()
265 * 功能 : 主函数
266 * 输入 : 无
267 * 输出 : 无
268 ***********************************************************************/
269 void Main(void)
270 {
271 1 x24c02_init(); //初始化24C02
272 1 sec = x24c02_read(2); //读出保存的数据赋于sec
273 1 Time0_Init();
274 1 while(1)
275 1 {
276 2 LED();
277 2 if(write == 1) //判断计时器是否计时一秒
278 2 {
279 3 write =0; //清零
280 3 x24c02_write(2,sec); //在24c08的地址2中写入数据sec
281 3 }
282 2 }
283 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 365 ----
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 + -