📄 serial_kuozhan_c.lst
字号:
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL_KUOZHAN_C
OBJECT MODULE PLACED IN serial_kuozhan_c.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial_kuozhan_c.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //***************************************************
2 //实现功能:实现单片机模拟IIC总线对24cxx的读写
3 //目标板:
4 //***************************************************
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define device_addr 0xa0
8 #include <reg51.h>
9
10 sbit scl=P1^2; //24c02 SCL
11 sbit sda=P1^1; //24c02 SDA
12 sbit P16=P1^6;
13 sbit P15=P1^5;
14 sbit P14=P1^4;
15 sbit P13=P1^3;
16 uchar temp_write[]={2,3,4};
17 uchar temp_read[3];
18
19 uchar read_byte(uchar address); //从24c02的地址address中读取一个字节数据
20 void write_byte(uchar address,uchar info); //向24c02的address地址中写入一字节数据info
21 void write_n_byte(uchar address,uchar w_num,uchar *p);
22 void read_n_byte(uchar address,uchar r_num,uchar *p);
23
24 void start(void);
25 void stop(void);
26 void send(unsigned char send_data);
27
28
29 void IIC_send(uchar temp);
30 uchar IIC_read(void);
31 void wait_ack(void);
32
33 //******************主函数***********************
34 //描 述:实现单片机模拟IIC总线对24cxx的读写
35 //入口参数:无
36 //返回参数:无
37 //设 计:ycj
38 //最后修改:时间(2006.5.4) 修改人(ycj)
39 //***********************************************
40 int main(void)
41 {unsigned char i;
42 1 //*******************测试写一个字节***************
43 1 //对24cxx的01h地址写一个数据08h
44 1 write_byte(1,8);
45 1 i=read_byte(1);
46 1 //读24cxx的01h地址并验证是否是刚才写进去的08h
47 1 if(i==8)
48 1 P16=0;//是,点亮P1.6脚的发光二极管
49 1 //*******************测试写n个字节***************
50 1 //从24cxx的地址02h开始连续写3个数据,分别是02h , 03h , 04h
51 1 write_n_byte(2,3,temp_write);
52 1 read_n_byte(2,3,temp_read);
53 1 //读24cxx的01h地址并验证是否是刚才写进去的08h
54 1 if(temp_read[0]==2)
55 1 P15=0;//是,点亮P1.6脚的发光二极管
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 2
56 1 if(temp_read[1]==3)
57 1 P14=0;//是,点亮P1.6脚的发光二极管
58 1 if(temp_read[2]==4)
59 1 P13=0;//是,点亮P1.6脚的发光二极管
60 1 while(1);//检验完成;
61 1 }
62 //*******************对24cxx读一个字节***********************
63 //描 述:实现单片机模拟IIC总线对24cxx的读一个字节
64 //入口参数:uchar address : 要读的地址
65 //返回参数:uchar i : 返回读到的数据
66 //设 计:ycj
67 //最后修改:时间(2006.5.4) 修改人(ycj)
68 //***********************************************************
69 uchar read_byte(uchar address)
70 {
71 1 uchar i;
72 1 start();
73 1 IIC_send(device_addr);
74 1 wait_ack();
75 1
76 1 IIC_send(address);
77 1 wait_ack();
78 1
79 1 start();
80 1 IIC_send(device_addr+1);
81 1 wait_ack();
82 1
83 1 i=IIC_read();
84 1 stop();
85 1 return(i);
86 1 }
87 //*******************对24cxx读n个字节***********************
88 //描 述:实现单片机模拟IIC总线对24cxx的读n个字节
89 //入口参数:uchar address : 要读的地址
90 // uchar r_num : 要读的数量
91 // uchar *p : 读出来存放的首地址
92 //返回参数:无
93 //设 计:ycj
94 //最后修改:时间(2006.5.4) 修改人(ycj)
95 //***********************************************************
96 void read_n_byte(uchar address,uchar r_num,uchar *p)
97 {uchar i;
98 1 start();
99 1 IIC_send(device_addr);
100 1 wait_ack();
101 1
102 1 IIC_send(address);
103 1 wait_ack();
104 1 for(i=0;i<r_num;i++)
105 1 {
106 2 start();
107 2 IIC_send(device_addr+1);
108 2 wait_ack();
109 2 *p=IIC_read();
110 2 p++;
111 2 }
112 1 stop();
113 1 }
114 //*******************对24cxx写n个字节***********************
115 //描 述:实现单片机模拟IIC总线对24cxx的写n个字节
116 //入口参数:uchar address : 要写入的开始地址
117 // uchar w_num : 要写入数据的数量
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 3
118 // uchar *p : 要写入的数据开始地址
119 //返回参数:无
120 //设 计:ycj
121 //最后修改:时间(2006.5.4) 修改人(ycj)
122 //**********************************************************
123 void write_n_byte(uchar address,uchar w_num,uchar *p)
124 {uchar i;
125 1 start();
126 1 IIC_send(device_addr);
127 1 wait_ack();
128 1
129 1
130 1 IIC_send(address);
131 1 wait_ack();
132 1 for(i=0;i<w_num;i++)
133 1 {
134 2 IIC_send(*p);
135 2 wait_ack();
136 2 p++;
137 2 }
138 1 stop();
139 1
140 1 }
141 //*******************对24cxx写一个字节***********************
142 //描 述:实现单片机模拟IIC总线对24cxx的写一个字节
143 //入口参数:uchar address : 要写的地址
144 // uchar info : 要写入的数据
145 //返回参数:无
146 //设 计:ycj
147 //最后修改:时间(2006.5.4) 修改人(ycj)
148 //***********************************************************
149 void write_byte(uchar address,uchar info)
150 {
151 1 start();
152 1 IIC_send(device_addr);
153 1 wait_ack();
154 1
155 1 IIC_send(address);
156 1 wait_ack();
157 1
158 1 IIC_send(info);
159 1 wait_ack();
160 1
161 1 stop();
162 1
163 1 }
164
165 //******************时间延迟函数**********************
166 //描 述:用指令实现延时一段时间
167 //入口参数:int i,为时间延迟参数
168 //出口参数:无
169 //设计人:ycj
170 //最后修改:时间(2006.5.4) 修改人(ycj)
171 //****************************************************
172 void delay_time(unsigned int i)
173 {
174 1 while(i)
175 1 i--;
176 1 }
177 //****************IIC产生start信号函数*****************
178 //描 述:模拟IIC总线发送一个start信号
179 //入口参数:无
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 4
180 //返回参数:无
181 //设 计:ycj
182 //最后修改:时间(2006.5.4) 修改人(ycj)
183 //*****************************************************
184 void start()
185 {
186 1 sda=1;
187 1 delay_time(1);
188 1 scl=1;
189 1 delay_time(1);
190 1 sda=0;
191 1 delay_time(1);
192 1 scl=0;
193 1 delay_time(1);
194 1 }
195 //****************IIC产生stop信号函数******************
196 //描 述:模拟IIC总线发送一个stop信号
197 //入口参数:无
198 //返回参数:无
199 //设 计:ycj
200 //最后修改:时间(2006.5.4) 修改人(ycj)
201 //*****************************************************
202 void stop()
203 {
204 1 scl=0;
205 1 delay_time(1);
206 1 sda=0;
207 1 delay_time(1);
208 1 scl=1;
209 1 delay_time(1);
210 1 sda=1;
211 1 delay_time(2500);
212 1
213 1 }
214 //*******************IIC发送数据函数********************
215 //描 述:模拟IIC总线发送数据
216 //入口参数:uchar temp : 待发送的数据
217 //返回参数:无
218 //设 计:ycj
219 //最后修改:时间(2006.5.4) 修改人(ycj)
220 //******************************************************
221 void IIC_send(uchar temp)
222 {
223 1 uchar i;
224 1 scl=0;
225 1 delay_time(1);
226 1 for (i=0;i<8;i++)
227 1 {
228 2 if (temp&0x80)
229 2 sda=1;
230 2 else
231 2 sda=0;
232 2 delay_time(1);
233 2 scl=1;
234 2 delay_time(1);
235 2 scl=0;
236 2 delay_time(1);
237 2 sda=0;
238 2 temp=temp<<1;
239 2 }
240 1 }
241 //****************从IIC总线上读数据函数****************
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 5
242 //描 述:从IIC总线上读一个byte的数据
243 //入口参数:无
244 //返回参数:uchar k : 返回从总线上读到的数据
245 //设 计:ycj
246 //最后修改:时间(2006.5.4) 修改人(ycj)
247 //*****************************************************
248 uchar IIC_read(void)
249 {
250 1 uchar i,j,k=0;
251 1 scl=0;
252 1 delay_time(1);
253 1
254 1 for (i=0;i<8;i++){
255 2 sda=1;
256 2 delay_time(1);
257 2 scl=1;
258 2 delay_time(1);
259 2 if (sda==1)
260 2 j=1;
261 2 else
262 2 j=0;
263 2 k=(k<<1)|j;
264 2 scl=0;
265 2 delay_time(1);
266 2 }
267 1 return(k);
268 1 }
269 //*******************等待应答函数***********************
270 //描 述:等待24cxx的应答信号
271 //入口参数:无
272 //返回参数:无
273 //设 计:ycj
274 //最后修改:时间(2006.5.4) 修改人(ycj)
275 //******************************************************
276 void wait_ack(void)
277 {unsigned char i;
278 1 scl=0;
279 1 delay_time(1);
280 1 sda=1;
281 1 delay_time(1);
282 1 scl=1;
283 1 delay_time(1);
284 1 while(1)
285 1 {
286 2 if (sda==1)
287 2 i++;
288 2 else
289 2 break;
290 2 if (i==255)
291 2 while(1);
292 2 }
293 1 scl=0;
294 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 462 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 17
IDATA SIZE = ---- ----
C51 COMPILER V7.06 SERIAL_KUOZHAN_C 05/14/2006 16:38:49 PAGE 6
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 + -