📄 24c04.lst
字号:
C51 COMPILER V7.50 24C04 09/12/2008 21:25:27 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 24C04
OBJECT MODULE PLACED IN 24c04.OBJ
COMPILER INVOKED BY: D:\Program Files\keil c51\C51\BIN\C51.EXE 24c04.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****************************************
2
3 说明:
4 用短路子短接 P0.1-P0.2 、P1.3-P1.5、PP5 的接线柱
5 下载完程序通电后,若 P00 的 LED 亮,则读写过程出现错误
6 若 P01 的 LED 亮,则读写过程正确
7
8 *****************************************/
9 #include <reg51.h>
10 #define uchar unsigned char
11 #define uint unsigned int
12 #define WRITE 0xA0 /* 定义24C04的器件地址SLA和方向位W */
13 #define READ 0xA1 /* 定义24C04的器件地址SLA和方向位R */
14 #define FALSE 0
15 #define TRUE ~FALSE
16 //////////////////////////////////////////////////////////////////////
17 #define HIGH 1
18 #define LOW 0
19 #define FALSE 0
20 #define TRUE ~FALSE
21 sbit SDA = P1^5;
22 sbit SCL = P1^4;
23 sbit WP = P1^3;
24 /*#define SDA P2_7
25 #define SCL P2_6*/
26 /****************************************************************************
27 * 函数原型: void delay(void);
28 * 功 能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时
29 * 指令。
30 ****************************************************************************/
31 void delay( void )
32 {
33 1 }
34 /****************************************************************************
35 * 函数原型: void I_start(void);
36 * 功 能: 提供I2C总线工作时序中的起始位。
37 ****************************************************************************/
38 void I_start( void )
39 {
40 1 SCL = HIGH ;
41 1 delay() ;
42 1 SDA = LOW ;
43 1 delay() ;
44 1 SCL = LOW ;
45 1 delay() ;
46 1 }
47 /****************************************************************************
48 * 函数原型: void I_stop(void);
49 * 功 能: 提供I2C总线工作时序中的停止位。
50 ****************************************************************************/
51 void I_stop( void )
52 {
53 1 SDA = LOW ;
54 1 delay() ;
55 1 SCL = HIGH ;
C51 COMPILER V7.50 24C04 09/12/2008 21:25:27 PAGE 2
56 1 delay() ;
57 1 SDA = HIGH ;
58 1 delay() ;
59 1 SCL = LOW ;
60 1 delay() ;
61 1 }
62 /****************************************************************************
63 * 函数原型: void I_init(void);
64 * 功 能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
65 * 其它函数。
66 ****************************************************************************/
67 void I_init( void )
68 {
69 1 SCL = LOW ;
70 1 I_stop() ;
71 1 }
72 /****************************************************************************
73 * 函数原型: bit I_clock(void);
74 * 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
75 * 态。本函数可用于数据发送, 也可用于数据接收。
76 ****************************************************************************/
77 bit I_clock( void )
78 {
79 1 bit sample ;
80 1 SCL = HIGH ;
81 1 delay() ;
82 1 sample = SDA ;
83 1 SCL = LOW ;
84 1 delay() ;
85 1 return ( sample ) ;
86 1 }
87 /****************************************************************************
88 * 函数原型: bit I_send(uchar I_data);
89 * 功 能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
90 * 则返回1(TRUE), 否则返回0(FALSE)。
91 ****************************************************************************/
92 bit I_send( uchar I_data )
93 {
94 1 uchar i ;
95 1 /* 发送8位数据 */
96 1 for ( i=0 ; i<8 ; i++ )
97 1 {
98 2 SDA = (bit)( I_data & 0x80 ) ;
99 2 I_data = I_data << 1 ;
100 2 I_clock() ;
101 2 }
102 1 /* 请求应答信号ACK */
103 1 SDA = HIGH ;
104 1 return ( ~I_clock() );
105 1 }
106 /****************************************************************************
107 * 函数原型: uchar I_receive(void);
108 * 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
109 * 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
110 * 号线处于浮置状态, 即使8051的P1.7脚置1。
111 ****************************************************************************/
112 uchar I_receive( void )
113 {
114 1 uchar I_data = 0;
115 1 register uchar i ;
116 1 for ( i=0 ; i<8 ; i++ )
117 1 {
C51 COMPILER V7.50 24C04 09/12/2008 21:25:27 PAGE 3
118 2 I_data *= 2 ;
119 2 if (I_clock()) I_data++;
120 2 }
121 1 return ( I_data ) ;
122 1 }
123 /****************************************************************************
124 * 函数原型: void I_Ack(void);
125 * 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
126 *****************************************************************************/
127 void I_Ack( void )
128 {
129 1 SDA = LOW ;
130 1 I_clock() ;
131 1 SDA = HIGH ;
132 1 }
133 /****************************************************************************
134 * 函数原型: bit E_address(uchar Address);
135 * 功 能: 向24C04写入器件地址和一个指定的字节地址。
136 *****************************************************************************/
137 bit E_address( uchar Address )
138 {
139 1 I_start() ;
140 1 if ( I_send( WRITE ) )
141 1 return ( I_send( Address ) ) ;
142 1 else
143 1 return ( FALSE ) ;
144 1 }
145 /****************************************************************************
146 * 函数原型: bit E_read_block(void);
147 * 功 能: 从24C04中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象
148 * 单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果
149 * 24C04不接受指定的地址则返回0(FALSE)。
150 *****************************************************************************/
151 uchar E_read(uchar add )
152 { uchar rec=0;
153 1 E_address(add);
154 1 I_start() ;
155 1 I_send( READ );
156 1 rec = ( I_receive() );
157 1 I_clock() ;
158 1 I_stop() ;
159 1 return rec;
160 1 }
161 /****************************************************************************
162 * 函数原型: void wait_5ms(void);
163 * 功 能: 提供5ms延时(时钟频率为12MHz)。
164 *****************************************************************************/
165 void wait_5ms( void )
166 {
167 1 int i ;
168 1 for ( i=0 ; i<1000 ; i++ );
169 1 }
170 /****************************************************************************
171 * 函数原型: bit E_write_block(void);
172 * 功 能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。
173 * 采用字节写操作方式, 每次写入时都需要指定片内地址。如果24C04
174 * 不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0
175 * (FALSE)。
176 *****************************************************************************/
177 void E_write( uchar s,uchar add )
178 {
179 1 if ( E_address(add) )
C51 COMPILER V7.50 24C04 09/12/2008 21:25:27 PAGE 4
180 1 { if(I_send(s))
181 2 {
182 3 I_stop() ;
183 3 wait_5ms();
184 3 }
185 2 }
186 1 }
187
188 /*********************** 主函数 ************************/
189 void main(void)
190 {
191 1 static code CODE[16] = {
192 1 0xb0,0xa0,0xb0,0xa0,0xd0,0xb4,0xd0,0xc2,0xce,0xc4,0xd5,0xc2,0xb0,0xa0,0xb0,0xa0,
193 1 };
194 1 uint n=0;
195 1 uint i;
196 1 P0 = 0;
197 1
198 1 I_init();
199 1 WP = 0;
200 1 for(i = 0;i < 16;i ++)
201 1 {
202 2 E_write(CODE[i],i);
203 2 }
204 1
205 1 for(i = 0;i < 16;i ++)
206 1 {
207 2 if(CODE[i] != E_read(i))
208 2 {
209 3 P0 = 0x01; //如果读出来的值和写进的值不一样,则 P00 发光二极管点亮
210 3 break;
211 3 }
212 2 P0 = 0x02;
213 2 }
214 1
215 1 while(1);
216 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 301 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -