eeprom_24c02.lst
来自「一些51单片机基础模块的程序」· LST 代码 · 共 340 行
LST
340 行
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE EEPROM_24C02
OBJECT MODULE PLACED IN EEPROM_24C02.OBJ
COMPILER INVOKED BY: E:\Program Files\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 * 版本号 : 2.0
8 * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
9 * 感谢“中国自动化资讯网”对本工作室的大力支持。
10 ***********************************************************************/
11 #include <reg52.h>
12 #include <intrins.h>
13
14 #define uchar unsigned char
15 #define uint unsigned int
16
17 sbit scl=P3^6; //24c08 SCL
18 sbit sda=P3^7; //24c08 SDA
19
20 uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
21 uchar sec; //定义计数值,每过1秒,sec加1
22 uint write; //写标志位
23
24 /********************************************************************
25 * 名称 : delay1()
26 * 功能 : 短暂延时
27 * 输入 : x
28 * 输出 : 无
29 ***********************************************************************/
30 void delay1(uchar x)
31 {
32 1 uint i;
33 1 for(i=0; i<x; i++)
34 1 ;
35 1 }
36
37 /********************************************************************
38 * 名称 : flash()
39 * 功能 : 延时,时间为2个NOP,大概为2US
40 * 输入 : 无
41 * 输出 : 无
42 ***********************************************************************/
43 void flash(void)
44 {
45 1 _nop_();
46 1 _nop_();
47 1 }
48
49 /********************************************************************
50 * 名称 : x24c02_init()
51 * 功能 : 24c02初始化子程序
52 * 输入 : 无
53 * 输出 : 无
54 ***********************************************************************/
55 void x24c02_init(void)
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 2
56 {
57 1 scl = 1;
58 1 flash();
59 1 sda = 1;
60 1 flash();
61 1 }
62
63 /********************************************************************
64 * 名称 : start(void)
65 * 功能 : 启动I2C总线
66 * 输入 : 无
67 * 输出 : 无
68 ***********************************************************************/
69 void start(void)
70 {
71 1 sda = 1;
72 1 flash();
73 1 scl = 1;
74 1 flash();
75 1 sda = 0;
76 1 flash();
77 1 scl = 0;
78 1 flash();
79 1 }
80
81 /********************************************************************
82 * 名称 : stop()
83 * 功能 : 停止I2C总线
84 * 输入 : 无
85 * 输出 : 无
86 ***********************************************************************/
87 void stop()
88 {
89 1 sda = 0;
90 1 flash();
91 1 scl = 1;
92 1 flash();
93 1 sda = 1;
94 1 flash();
95 1 }
96
97 /********************************************************************
98 * 名称 : writex()
99 * 功能 : 写一个字节
100 * 输入 : j(需要写入的值)
101 * 输出 : 无
102 ***********************************************************************/
103 void writex(uchar j)
104 {
105 1 uchar i,temp;
106 1 temp = j;
107 1 for(i=0; i<8; i++)
108 1 {
109 2 temp = temp << 1;
110 2 scl = 0;
111 2 flash();
112 2 sda = CY;
113 2 flash();
114 2 scl = 1;
115 2 flash();
116 2 }
117 1 scl = 0;
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 3
118 1 flash();
119 1 sda = 1;
120 1 flash();
121 1 }
122
123 /********************************************************************
124 * 名称 : readx()
125 * 功能 : 读一个字节
126 * 输入 : 无
127 * 输出 : 读出的值
128 ***********************************************************************/
129 uchar readx(void)
130 {
131 1 uchar i, j, k = 0;
132 1 scl = 0;
133 1 flash();
134 1 sda = 1;
135 1 for(i=0; i<8; i++)
136 1 {
137 2 flash();
138 2 scl = 1;
139 2 flash();
140 2 if(sda == 1)
141 2 {
142 3 j = 1;
143 3 }
144 2 else j = 0;
145 2 k = (k << 1) | j;
146 2 scl = 0;
147 2 }
148 1 flash();
149 1 return(k);
150 1 }
151
152 /********************************************************************
153 * 名称 : clock()
154 * 功能 : I2C总线时钟
155 * 输入 : 无
156 * 输出 : 无
157 ***********************************************************************/
158 void clock(void)
159 {
160 1 uchar i = 0;
161 1 scl = 1;
162 1 flash();
163 1 while((sda == 1) && (i < 255))
164 1 {
165 2 i++;
166 2 }
167 1 scl = 0;
168 1 flash();
169 1 }
170
171 /********************************************************************
172 * 名称 : x24c02_read()
173 * 功能 : 从24c02中读出值
174 * 输入 : address(要在这个地址读取值)
175 * 输出 : 从24c02中读出的值
176 ***********************************************************************/
177 uchar x24c02_read(uchar address)
178 {
179 1 uchar i;
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 4
180 1 start();
181 1 writex(0xa0);
182 1 clock();
183 1 writex(address);
184 1 clock();
185 1 start();
186 1 writex(0xa1);
187 1 clock();
188 1 i = readx();
189 1 stop();
190 1 delay1(10);
191 1 return(i);
192 1 }
193
194 /********************************************************************
195 * 名称 : x24c02_write()
196 * 功能 : 想24c02中写入数据
197 * 输入 : address(地址) , info(值)
198 * 输出 : 无
199 ***********************************************************************/
200 void x24c02_write(uchar address, uchar info)
201 {
202 1 EA = 0;
203 1 start();
204 1 writex(0xa0);
205 1 clock();
206 1 writex(address);
207 1 clock();
208 1 writex(info);
209 1 clock();
210 1 stop();
211 1 EA = 1;
212 1 delay1(50);
213 1 }
214
215 /********************************************************************
216 * 名称 : Delay_1ms()
217 * 功能 : 延时,延时时间为 1ms * i
218 * 输入 : i(延时1ms的个数)
219 * 输出 : 无
220 ***********************************************************************/
221 void Delay_1ms(uint i)
222 {
223 1 uchar x, j;
224 1 for(j=0; j<i; j++)
225 1 for(x=0; x<=148; x++)
226 1 ;
227 1 }
228
229 /********************************************************************
230 * 名称 : LED()
231 * 功能 : 显示
232 * 输入 : 无
233 * 输出 : 无
234 ***********************************************************************/
235 void LED() //LED显示函数
236 {
237 1 P2 = 0x02;
238 1 P0 = table[sec / 10];
239 1 Delay_1ms(5);
240 1 P2 = 0x01;
241 1 P0 = table[sec % 10];
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 5
242 1 Delay_1ms(5);
243 1 }
244
245 /********************************************************************
246 * 名称 : time0()
247 * 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
248 * 输入 : del
249 * 输出 : 无
250 ***********************************************************************/
251 void time0(void) interrupt 1 using 3 //定时中断服务函数
252 {
253 1 static uchar Count = 0;
254 1 TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
255 1 TL0 = (65536 - 50000) % 256; //重装计数初值
256 1 Count++; //每过250ust tcnt加一
257 1 if(Count == 20) //计满20次(1秒)时
258 1 {
259 2 Count = 0; //重新再计
260 2 sec++;
261 2 write = 1; //1秒写一次24C08
262 2 if(sec == 100) //定时100秒,在从零开始计时
263 2 {
264 3 sec = 0;
265 3 }
266 2 }
267 1 }
268
269 /********************************************************************
270 * 名称 : Time0_Init()
271 * 功能 : 定时器0的初始化
272 * 输入 : 无
273 * 输出 : 无
274 ***********************************************************************/
275 void Time0_Init(void)
276 {
277 1 TMOD = 0x01; //定时器工作在方式1
278 1 ET0 = 1;
279 1 EA = 1;
280 1 TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
281 1 TL0 = (65536 - 50000) % 256; //使定时器0.05秒中断一次
282 1 TR0 = 1; //开始计时
283 1 }
284
285 /********************************************************************
286 * 名称 : Main()
287 * 功能 : 主函数
288 * 输入 : 无
289 * 输出 : 无
290 ***********************************************************************/
291 void Main(void)
292 {
293 1 P2 = 0x00;
294 1 x24c02_init(); //初始化24C02
295 1 Time0_Init();
296 1 sec = x24c02_read(2); //读出保存的数据赋于sec
297 1 while(1)
298 1 {
299 2 LED();
300 2 if(write == 1) //判断计时器是否计时一秒
301 2 {
302 3 write =0 ; //清零
303 3 x24c02_write(2,sec); //在24c08的地址2中写入数据sec
C51 COMPILER V7.50 EEPROM_24C02 04/09/2009 19:07:06 PAGE 6
304 3 }
305 2 }
306 1 }
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 + =
减小字号Ctrl + -
显示快捷键?