📄 at24c02.lst
字号:
C51 COMPILER V7.06 AT24C02 12/05/2003 14:04:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE AT24C02
OBJECT MODULE PLACED IN AT24C02.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AT24C02.C ROM(SMALL) OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //*****************************************************************
2 //MCU:AT892051
3 //EEPROM:AT24C02
4 //11.0592M晶振
5 //测试程序,绝对好用
6 //对PC波特率56000(呵呵,快了对程序影响小,但会出误码)
7 //******************************************************************
8 #include <at892051.h>
9 #include "intrins.h"
10 #define uchar unsigned char
11 #define uint unsigned int
12
13 #define AddWr 0xa0 /*器件地址选择及写标志*/
14 #define AddRd 0xa1 /*器件地址选择及读标志*/
15 /*有关全局变量*/
16 uchar bdata buffer;
17
18 sbit SDA = P3^5; /*串行数据*/
19 sbit SCL = P3^4; /*串行时钟*/
20 sbit WP = P3^3; /*硬件写保护*/
21
22 sbit B7 = buffer^7;
23 sbit B6 = buffer^6;
24 sbit B5 = buffer^5;
25 sbit B4 = buffer^4;
26 sbit B3 = buffer^3;
27 sbit B2 = buffer^2;
28 sbit B1 = buffer^1;
29 sbit B0 = buffer^0;
30
31 //----------------------------------------------------------------
32 //延时4.3uS,11.0592M晶振标准延时程序
33 //----------------------------------------------------------------
34 void delay_4uS(void)
35 {
36 1 ;
37 1 }
38 //----------------------------------------------------------------
39 //延时j毫秒程序,11.0592M晶振非标准延时程序
40 //----------------------------------------------------------------
41
42 void mS_Delay(uchar j)
43 {
44 1 uchar i;
45 1 while(j>0)
46 1 {
47 2 i = 0;
48 2 j--;
49 2 while(i<114) i++;
50 2 }
51 1
52 1 }
53 //----------------------------------------------------------------
54 /*发送起始条件*/
55 //----------------------------------------------------------------
C51 COMPILER V7.06 AT24C02 12/05/2003 14:04:57 PAGE 2
56 void Start_01(void) /*起始条件*/
57 {
58 1 do{
59 2 SDA=1;
60 2 SCL=1;
61 2 }while(!(SDA&&SCL)); //检测总线是否可用
62 1 delay_4uS();
63 1 SDA=0;
64 1 delay_4uS();
65 1 SCL=0;
66 1
67 1 }
68 //----------------------------------------------------------------
69 /*停止条件*/
70 //----------------------------------------------------------------
71 void Stop_01(void)
72 {
73 1 SDA=0;
74 1 SCL=1;
75 1 delay_4uS();
76 1 SDA=1;
77 1 _nop_();
78 1 _nop_();
79 1 }
80 //----------------------------------------------------------------
81 //检测应答位
82 //----------------------------------------------------------------
83 void Ack(void)
84 {
85 1 SDA = 1;
86 1 SCL=1;
87 1 _nop_();
88 1 _nop_();
89 1 while(SDA);
90 1 SCL=0;
91 1
92 1 }
93
94
95 //----------------------------------------------------------------
96 /*反向应答位*/
97 //----------------------------------------------------------------
98 void NoAck(void)
99 {
100 1 SDA=1;
101 1 delay_4uS();
102 1 SCL=1;
103 1 delay_4uS();
104 1 SCL=0;
105 1 }
106 //----------------------------------------------------------------
107 /*发送数据子程序,Data为要求发送的数据*/
108 //----------------------------------------------------------------
109 void Send_01(void)
110 {
111 1 uchar i; /*位数控制*/
112 1 for(i=0;i<8;i++)
113 1 {
114 2 SDA = B7;
115 2 buffer = buffer<<1;
116 2 delay_4uS();
117 2 SCL=1;
C51 COMPILER V7.06 AT24C02 12/05/2003 14:04:57 PAGE 3
118 2 delay_4uS();
119 2 SCL = 0;
120 2 }
121 1 }
122
123 //-----------------------------------------------------------------------------
124 //读一个字节的数据,并返回该字节值,虽然资料说是负跳沿读出数据,
125 //可是在SCL高电平时读出才是正确的
126 //-----------------------------------------------------------------------------
127 void Read_01(void)
128 {
129 1 uchar i;
130 1 SDA=1;
131 1 for(i=0;i<8;i++)
132 1 {
133 2 buffer = buffer<<1;
134 2 SCL=1;
135 2 _nop_();
136 2 _nop_();
137 2 B0 = SDA;
138 2 _nop_();
139 2 SCL=0;
140 2 _nop_();
141 2 _nop_();
142 2 }
143 1 }
144
145 //----------------------------------------------------------------
146 //数据块写入,传递参数:数据块首址、写入地址、数据块长度
147 //---------------------------------------------------------------
148 void WrToROM(uchar Data[],uchar Address,uchar Num)
149 {
150 1 uchar data i;
151 1 uchar data *PData;
152 1 WP = 0;
153 1 PData=Data;
154 1 for(i=0;i<Num;i++)
155 1 {
156 2 Start_01(); /*发送启动信号*/
157 2 buffer = AddWr;
158 2 Send_01(); /*选择器件*/
159 2 Ack();
160 2 buffer = Address+i;
161 2 Send_01(); /*发送地址*/
162 2 Ack();
163 2 buffer = *(PData+i);
164 2 Send_01();
165 2 Ack();
166 2 Stop_01();
167 2 mS_Delay(15);
168 2 }
169 1 WP = 1;
170 1 }
171 //----------------------------------------------------------------
172 //数据块读出,传递参数:数据块首址、读出地址、数据块长度
173 //---------------------------------------------------------------
174 void RdFromROM(uchar Data[],uchar Address,uchar Num)
175 {
176 1 uchar i;
177 1 uchar *PData;
178 1 PData=Data;
179 1 for(i=0;i<Num;i++)
C51 COMPILER V7.06 AT24C02 12/05/2003 14:04:57 PAGE 4
180 1 {
181 2 Start_01();
182 2 buffer = AddWr;
183 2 Send_01();
184 2 Ack();
185 2 buffer = Address+i;
186 2 Send_01();
187 2 Ack();
188 2 Start_01();
189 2 buffer = AddRd;
190 2 Send_01();
191 2 Ack();
192 2 Read_01();
193 2 *(PData+i)= buffer;
194 2 NoAck();
195 2 Stop_01();
196 2 }
197 1 }
198 //-------------------------------------------
199 //串口发送子程序,条件:TI=1,ES=0;
200 //---------------------------------------------
201 void ser_send(uchar a)
202 {
203 1 while(TI==0);
204 1 SBUF = a;
205 1 TI=0;
206 1 }
207
208 /*=============================================================================
209 *Name :SysInit
210 *Descripton :sysem initialization
211 *Status :Done
212 =============================================================================*/
213
214 void SysInit(void)
215 {
216 1 mS_Delay(1);
217 1 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
218 1 TMOD = 0x21; /* T0工作于方式1,十六位定时器,T1工作于方式2 */
219 1 TH1 = 0xff; /* TH1: reload value for 1200 baud @ 16MHz */
220 1 TL1 = 0xff;
221 1 PCON = PCON|0x80;
222 1 TL0 = 0x3f;
223 1 TH0 = 0xfe;
224 1 TR1 = 1; /* TR1: timer 1 run */
225 1 //TR0 = 1; /* TR0: timer 0 run */
226 1 IE = 0x80;
227 1 P1 = 0X00;
228 1 }
229
230 void main()
231 {
232 1 uchar Number[50]={0};
233 1 uchar i;
234 1 SysInit();
235 1 WP= 1;
236 1 for(i=0;i<50;i++)
237 1 {
238 2 Number[i]=i;
239 2 }
240 1 WrToROM(Number,0,50); /*将初始化后的数值写入EEPROM*/
241 1 mS_Delay(20);
C51 COMPILER V7.06 AT24C02 12/05/2003 14:04:57 PAGE 5
242 1 for(i=0;i<50;i++)
243 1 {
244 2 Number[i]=i+50;
245 2 }
246 1 WrToROM(Number,50,50); /*将初始化后的数值写入EEPROM*/
247 1 mS_Delay(20);
248 1 for(i=0;i<50;i++)
249 1 {
250 2 Number[i]=i+100;
251 2 }
252 1 WrToROM(Number,100,50); //将初始化后的数值写入EEPROM
253 1 mS_Delay(20);
254 1 for(i=0;i<50;i++)
255 1 {
256 2 Number[i]=i+150;
257 2 }
258 1 WrToROM(Number,150,50); //将初始化后的数值写入EEPROM
259 1 mS_Delay(20);
260 1 for(i=0;i<50;i++)
261 1 {
262 2 Number[i]=i+200;
263 2 }
264 1 WrToROM(Number,200,50); //将初始化后的数值写入EEPROM
265 1 mS_Delay(20);
266 1 for(i=0;i<255;i++)
267 1 {
268 2 RdFromROM(Number,i,1);
269 2 TI = 1;
270 2 ser_send(Number[0]);
271 2 }
272 1 WP= 1; //将AT24C01A写保护
273 1 while(1);
274 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 493 ----
CONSTANT SIZE = 50 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 63
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 + -