📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 01/27/2008 16:21:54 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /* 51系列单片机在使用时,有时需要模拟I2C总线, */
2 /* 这里举出一个实例(读写串行EEPROM芯片at2402) */
3 /************************************************************************/
4 /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */
5 /* Language: C51单片机编程语言 */
6 /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751 */
7 /* Author: StephenZhu javasdk@163.com */
8 /* Date: 2003年5月21日,5月22日,5月29日 */
9 /* Version: 1.1.1 */
10 /* Others: None */
11 /************************************************************************/
12
13 #include<string.h>
14 #include<reg52.h>
15 #include<intrins.h>
16 #include "LCM1602.h"
17 #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
18 #define TRUE 1
19 #define FALSE 0
20
21 sbit SCL=P3^5;/*假设由P1.7和P1.6控制*/
22 sbit SDA=P3^4;
23
24
25 /********** Function Definition 函数定义 ************/
26
27 void DELAY(unsigned int t) /*延时函数*/
28 {
29 1 while(t!=0)
30 1 t--;
31 1 }
32
33 void I2C_Start(void)
34 {
35 1 /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
36 1 SDA=1;
37 1 SCL=1;
38 1 DELAY(DELAY_TIME);
39 1 SDA=0;
40 1 DELAY(DELAY_TIME);
41 1 SCL=0;
42 1 DELAY(DELAY_TIME);
43 1 }
44
45 void I2C_Stop(void)
46 {
47 1 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
48 1 SDA=0;
49 1 SCL=1;
50 1 DELAY(DELAY_TIME);
51 1 SDA=1;
52 1 DELAY(DELAY_TIME);
53 1 SCL=0;
54 1 DELAY(DELAY_TIME);
55 1 }
C51 COMPILER V7.06 MAIN 01/27/2008 16:21:54 PAGE 2
56
57 void SEND_0(void) /* SEND ACK */
58 {
59 1 /*发送0,在SCL为高电平时使SDA信号为低*/
60 1 SDA=0;
61 1 SCL=1;
62 1 DELAY(DELAY_TIME);
63 1 SCL=0;
64 1 DELAY(DELAY_TIME);
65 1 }
66
67 void SEND_1(void)
68 {
69 1 /*发送1,在SCL为高电平时使SDA信号为高*/
70 1 SDA=1;
71 1 SCL=1;
72 1 DELAY(DELAY_TIME);
73 1 SCL=0;
74 1 DELAY(DELAY_TIME);
75 1 }
76
77 bit Check_Acknowledge(void)
78 {
79 1 /*发送完一个字节后检验设备的应答信号*/
80 1 SDA=1;
81 1 SCL=1;
82 1 DELAY(DELAY_TIME/2);
83 1 F0=SDA;
84 1 DELAY(DELAY_TIME/2);
85 1 SCL=0;
86 1 DELAY(DELAY_TIME);
87 1 if(F0==1)
88 1 return FALSE;
89 1 return TRUE;
90 1 }
91
92 void WriteI2CByte(char b)reentrant
93 {
94 1 /*向I2C总线写一个字节*/
95 1 char i;
96 1 for(i=0;i<8;i++)
97 1 if((b<<i)&0x80)
98 1 SEND_1();
99 1 else
100 1 SEND_0();
101 1 }
102
103
104 char ReadI2CByte(void)reentrant
105 {
106 1 /*从I2C总线读一个字节*/
107 1 char b=0,i;
108 1 for(i=0;i<8;i++)
109 1 {
110 2 SDA=1; /*释放总线*/
111 2 SCL=1; /*接受数据*/
112 2 DELAY(10);
113 2 F0=SDA;
114 2 DELAY(10);
115 2 SCL=0;
116 2 if(F0==1)
117 2 {
C51 COMPILER V7.06 MAIN 01/27/2008 16:21:54 PAGE 3
118 3 b=b<<1;
119 3 b=b|0x01;
120 3 }
121 2 else
122 2 b=b<<1;
123 2 }
124 1 return b;
125 1 }
126
127
128 /**********以下为读写24c02的函数**********/
129 void Write_One_Byte(char addr,char thedata)
130 {
131 1 bit acktemp=1;
132 1 /*write a byte to mem*/
133 1 I2C_Start();
134 1 WriteI2CByte(0xa0);
135 1 acktemp=Check_Acknowledge();
136 1 WriteI2CByte(addr);/*address*/
137 1 acktemp=Check_Acknowledge();
138 1 WriteI2CByte(thedata);/*thedata*/
139 1 acktemp=Check_Acknowledge();
140 1 I2C_Stop();
141 1
142 1 }
143
144 void Write_A_Page(char *buffer,char addr)
145 {
146 1 bit acktemp=1;
147 1 // bit wrtmp;
148 1 int i;
149 1 /*write a page to at24c02*/
150 1 I2C_Start();
151 1 WriteI2CByte(0xa0);
152 1 acktemp=Check_Acknowledge();
153 1 WriteI2CByte(addr);/*address*/
154 1 acktemp=Check_Acknowledge();
155 1 for(i=0;i<7;i++)
156 1 {
157 2 WriteI2CByte(buffer[i]);
158 2 if(!Check_Acknowledge())
159 2 {
160 3 I2C_Stop();
161 3
162 3 }
163 2 }
164 1
165 1
166 1 I2C_Stop();
167 1
168 1 }
169
170 char Read_One_Byte(char addr)
171 { bit acktemp=1;
172 1 char mydata;
173 1 /*read a byte from mem*/
174 1 I2C_Start();
175 1 WriteI2CByte(0xa0);
176 1 acktemp=Check_Acknowledge();
177 1 WriteI2CByte(addr);/*address*/
178 1 acktemp=Check_Acknowledge();
179 1 I2C_Start();
C51 COMPILER V7.06 MAIN 01/27/2008 16:21:54 PAGE 4
180 1 WriteI2CByte(0xa1);
181 1 acktemp=Check_Acknowledge();
182 1
183 1
184 1 mydata=ReadI2CByte();
185 1 acktemp=Check_Acknowledge();
186 1
187 1 return mydata;
188 1 I2C_Stop();
189 1 }
190
191 void Read_N_Bytes(char *buffer,char n,char addr)
192 {
193 1 bit acktemp=1;
194 1
195 1 int i=0;
196 1 /*read 8 bytes from mem*/
197 1 I2C_Start();
198 1 WriteI2CByte(0xa0);
199 1 acktemp=Check_Acknowledge();
200 1 WriteI2CByte(addr);/*address*/
201 1 acktemp=Check_Acknowledge();
202 1 I2C_Start();
203 1 WriteI2CByte(0xa1);
204 1
205 1 acktemp=Check_Acknowledge();
206 1
207 1
208 1
209 1
210 1 for(i=0;i<n;i++)
211 1 {
212 2 buffer[i]=ReadI2CByte();
213 2 if(i!=n-1)
214 2 SEND_0(); /*发送应答*/
215 2 else
216 2 SEND_1(); /*发送非应答*/
217 2 }
218 1
219 1 I2C_Stop();
220 1
221 1 }
222
223
224 void main()
225 {
226 1 int i;
227 1 char mybyte;
228 1 char myarray[8];
229 1 char myarray2[8];
230 1 char rdarray[16];
231 1
232 1 for(i=0;i<8;i++)
233 1 {
234 2 myarray[i]=i;
235 2 myarray2[i]=i+0x08;
236 2
237 2 }
238 1
239 1 Write_One_Byte(0x20,0x28);
240 1
241 1 Write_A_Page(myarray,0x10);
C51 COMPILER V7.06 MAIN 01/27/2008 16:21:54 PAGE 5
242 1 Write_A_Page(myarray2,0x18);
243 1
244 1 mybyte=Read_One_Byte(0x20);
245 1 Read_N_Bytes(rdarray,16,0x10);
246 1
247 1 }
248
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 645 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 43
IDATA SIZE = ---- ----
BIT SIZE = ---- 4
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -