📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 04/10/2008 19:53:20 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\I2C.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE src\I2C.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lst\I2C.lst) OBJECT(.\obj\I2C.o
-bj)
line level source
1 #include <reg51.h>
2
3 #include "i2c.h"
4
5 uchar code set_tab[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,
6 0x00,0x01,0x02,0x03,0x04,0x06,0x06,0x07,0x08,0x09,0x00,0x02,
7 0x00,0x01,0x02,0x03,0x04,0x07,0x06,0x07,0x08,0x09,0x00,0x03,
8 0x00,0x01,0x02,0x03,0x04,0x08,0x06,0x07,0x08,0x09,0x00,0x04,
9 0x00,0x01,0x02,0x03,0x04,0x09,0x06,0x07,0x08,0x09,0x00,0x05 };
10 ////5个用户的帐号和密码信息,前6个是帐户,后6个是密码////////////////////////////////////
11 /* =========================================================================
12 * I2C总线基本操作函数(接口模拟函数)
13 * =========================================================================*/
14
15 /****************************************************************************
16 * 函数原型: void i_delay(void);
17 * 功 能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时
18 * 指令。
19 ****************************************************************************/
20 void i_delay( void )
21 { ;;;;
22 1 }
23
24 /****************************************************************************
25 * 函数原型: void I_start(void);
26 * 功 能: 提供I2C总线工作时序中的起始位。
27 ****************************************************************************/
28 void I_start( void )
29 { SCL = HIGH ;
30 1 SDA = HIGH;
31 1 i_delay() ;
32 1 SDA = LOW ;
33 1 i_delay() ;
34 1 SCL = LOW ;
35 1 i_delay() ;
36 1
37 1 }
38
39 /****************************************************************************
40 * 函数原型: void I_stop(void);
41 * 功 能: 提供I2C总线工作时序中的停止位。
42 ****************************************************************************/
43 void I_stop( void )
44 { SDA = LOW ;
45 1 SCL = HIGH ;
46 1 i_delay() ;
47 1 SDA = HIGH ;
48 1 i_delay() ;
49 1 SCL = LOW ;
50 1 i_delay() ;
51 1 }
52
53 /****************************************************************************
54 * 函数原型: void I_init(void);
C51 COMPILER V7.50 I2C 04/10/2008 19:53:20 PAGE 2
55 * 功 能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
56 * 其它函数。
57 ****************************************************************************/
58 void I_init( void )
59 { SCL = LOW ;
60 1 I_stop() ;
61 1 }
62
63 /****************************************************************************
64 * 函数原型: bit I_clock(void);
65 * 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
66 * 态。本函数可用于数据发送, 也可用于数据接收。
67 ****************************************************************************/
68 bit I_clock( void )
69 { bit sample ;
70 1 SCL = HIGH ;
71 1 i_delay() ;
72 1 sample = SDA ;
73 1 SCL = LOW ;
74 1 i_delay() ;
75 1 return (sample);
76 1 }
77
78 /****************************************************************************
79 * 函数原型: bit I_send(uchar I_data);
80 * 功 能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
81 * 则返回1(TRUE), 否则返回0(FALSE)。
82 ****************************************************************************/
83 bit I_send( uchar I_data )
84 { uchar i;
85 1 for (i=0;i<8;i++) // 发送8位数据 //
86 1 { SDA = (bit)(I_data & 0x80) ;
87 2 I_clock() ;
88 2 I_data=I_data<<1 ;
89 2 }
90 1 SDA=HIGH ; //请求应答信号ACK //
91 1 return (~I_clock());
92 1 }
93
94 /****************************************************************************
95 * 函数原型: uchar I_receive(void);
96 * 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
97 * 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
98 * 号线处于浮置状态, 即使8051的P1.7脚置1。
99 ****************************************************************************/
100 uchar I_receive( void )
101 { uchar I_data = 0 ;
102 1 register uchar i ;
103 1 for (i=0;i<8;i++)
104 1 { I_data *= 2 ;
105 2 if (I_clock()) I_data++;
106 2 }
107 1 return (I_data) ;
108 1 //注意:没有回送ACK信号,方便后面读取数据时控制传输结束////////////
109 1 }
110 /****************************************************************************
111 * 函数原型: void I_Ack(void);
112 * 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
113 *****************************************************************************/
114 void I_Ack( void )
115 { SDA = LOW ;
116 1 I_clock() ;
C51 COMPILER V7.50 I2C 04/10/2008 19:53:20 PAGE 3
117 1 SDA = HIGH ;
118 1 }
119 /****************************************************************************
120 * 函数原型: bit E_address(uchar Address);
121 * 功 能: 对24C01指定一个存储器空间地址。
122 *****************************************************************************/
123 bit E_address( uchar Address )
124 { I_start() ;// 发送启动信号,该信号不可掉,否则无法正常传输////////
125 1 if (I_send(WRITE))
126 1 return (I_send( Address));
127 1 else
128 1 return (FALSE);
129 1 }
130
131 /****************************************************************************
132 * 函数原型: uchar E_read_onedata(uchar address);
133 * 功 能: 从24C01中address地址中读取1个字节的数据,并将读取的数据作为
134 * 函数的返回值返回。读取不成功返回值为0。注意不要将address地址
135 * 中的数据放为0,以免误解。
136 *****************************************************************************/
137 /*
138 uchar E_read_onedata(uchar address)
139 { uchar m ;
140 if ( E_address(address)) // 从指定的地址开始读取数据 //
141 { I_start(); // 发送重复启动信号//
142 if(I_send( READ))
143 {
144 m=(I_receive());
145 return(m);
146 }
147 else {
148 I_stop() ;
149 return (0) ;
150 }
151 }
152 else
153 { I_stop() ;
154 return (0) ;
155 }
156 }
157 */
158 /****************************************************************************
159 * 函数原型: void wait_5ms(void);
160 * 功 能: 提供5ms延时(时钟频率为12MHz)。
161 *****************************************************************************/
162 void wait_5ms( void )
163 { int i;
164 1 for(i=0;i<1000;i++)
165 1 {
166 2 ;
167 2 }
168 1 }
169
170 /****************************************************************************
171 * 函数原型: bit E_write_onedata(uchar address,uchar i_data );
172 * 功 能: 将数据i_data写入到24C01的address地址中
173 * 成功写入返回1( TRUE ), 否则返回0(FALSE)
174 *****************************************************************************/
175 /*
176 bit E_write_onedata(uchar address,uchar i_data )
177 {
178 if(E_address(address) &&I_send( i_data ) )
C51 COMPILER V7.50 I2C 04/10/2008 19:53:20 PAGE 4
179 {
180 I_stop() ;
181 wait_5ms();
182 return(TRUE);
183 }
184 else
185 {return(FALSE);}
186 }
187 */
188 /****************************************************************************
189 * 函数原型: uchar E_read_datablock(uchar address,uchar length);
190 * 功 能: 从24C01中以指定的地址address为首地址读取length个长度的数据
191 * 放到由指针p指定内部存储器(的数组变量)中 ,读取成功返回1,否则返回0。
192 *
193 *****************************************************************************/
194
195 bit E_read_datablock(uchar address,uchar length,uchar *p)
196 { uchar i ;
197 1 if (E_address(address) ) //从地址address开始读取数据//
198 1 { ////只指定了一个起始地址为首址,顺序读取数据///////
199 2 I_start() ; // 发送重复启动信号 //
200 2 if(I_send(READ))
201 2 {
202 3 for(i=0;i<=length;i++)
203 3 {
204 4 p[i] = (I_receive()) ;
205 4 if (i !=length) I_Ack() ;//每读取一个数据后要有一个Ack信号/////
206 4 else
207 4 {
208 5 I_clock();/////不给Ack信号,准备结束传输/////
209 5 I_stop();
210 5 }
211 4 }
212 3 return (TRUE);
213 3 }
214 2 else {
215 3 I_stop() ;
216 3 return (FALSE);
217 3 }
218 2 }
219 1 else I_stop() ;
220 1 return (FALSE);
221 1 }
222
223
224 /****************************************************************************
225 * 函数原型:bit E_write_datablock(uchar address,uchar length,uchar *p);
226 * 功 能: 写入数据到24C01的以address为首址length个存储器中,数据来源
227 * 由指针p指定内部RAM(数组)中的数据,成功写入返回1( TRUE ),
228 * 否则返回0(FALSE)
229 *****************************************************************************/
230 bit E_write_datablock(uchar address,uchar length,uchar *p)
231 { uchar i ;
232 1 for(i=0;i<=length;i++)
233 1 { if(E_address(address+i)&&I_send(*(p+i)))
234 2 ////指定一个地址。写一个数据//////
235 2 { I_stop() ;
236 3 wait_5ms();
237 3 }
238 2 else
239 2 return (FALSE);
240 2 }
C51 COMPILER V7.50 I2C 04/10/2008 19:53:20 PAGE 5
241 1 return (TRUE);
242 1 }
243
244
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 281 ----
CONSTANT SIZE = 60 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 8
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 + -