📄 com.lst
字号:
C51 COMPILER V8.05a COM 02/20/2009 14:27:41 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN COM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE COM.C BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*****************************************************************/
3 /* */
-
4 /*名称: 24C02读写程序 */
-
-
5 /*功能: 接收串口发来的数据,写到24C02里面 */
6 /* 再从24C02里读出刚写进的数据,由串口发出 */
7 /*难度等级: 高 */
-
8 /* 作者: zengrenliang */
9 /* 版权: http://www.51kaifa.com */
10 /*编写日期: 2006.05.21 */
-
-
11 /*****************************************************************/
12
13 #include <reg52.h>
14 #define uchar unsigned char
15 #define uint unsigned int
16 sbit SCL=P1^0;//I2C时钟线
17 sbit SDA=P1^1;//I2C数据线
18
19 bit receive;//接收标志
20 bit re_finish;//接收一串字符完成标志
21 sbit LED = P1^2;//LED指示灯
22
23 uchar i,buffer[8];//串口缓冲区
24 uchar sbuffer,number;//发送字符个数
25 uchar sendFINS ;//发送完成标志
26 uchar copyOK , cmd_numb ;//发送缓冲区填充完成
27
28 extern void Start_I2c();
29 extern void Stop_I2c();
30 extern uchar RcvB();
31 void send(void);
32 void vGet_Send(void);
33 extern void Ack_I2c(bit a);
34 extern void SendB(uchar c);
35 extern void delay(unsigned int loop);
36
37 /*******************************系统初始化***********************/
38 void initial()
39 { unsigned char j;
40 1
41 1 SCON=0x50; //串口工作方式1,允许接收
42 1 PCON=0x80; //波特率翻倍
43 1 TCON=0;
44 1 TMOD=0x26; //T1用于串口波特率控制
45 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
46 1 TH1=0xfa;
47 1 TR1=1; //开定时器
48 1 EA=1; //开总中断
49 1 ES=1; //开串口中断
C51 COMPILER V8.05a COM 02/20/2009 14:27:41 PAGE 2
50 1 copyOK = 0; //缓冲区准备好标志清零
51 1 receive = 0; //接收标志清零
52 1 re_finish = 0; //接受完成标志清零
53 1 cmd_numb = 0; //接受计数器清零
54 1
55 1 for(j=0; j<8; j++) //串口缓冲区清空
56 1 buffer[i] = 0xff; //table[18]为空显示
57 1 }
58
59 /******************************主函数**************************/
60
61 main()
62 {
63 1 initial();
64 1 while(1)
65 1 {
66 2 if(re_finish)
67 2 {//接收一串字符完成
68 3 re_finish = 0;
69 3 vGet_Send();
70 3 }
71 2 }
72 1 }
73
74 /*****************************保存和串口发送**************************/
75 void vGet_Send(void)
76 { uchar i;
77 1
78 1 Start_I2c();
79 1 SendB(0xa0);
80 1 SendB(0x10); //数据存放初始地址为0x06
81 1 for(i=0;i<6;i++)
82 1 {SendB(buffer[i]); //向24C02写6个数据
83 2 delay(10); }
84 1 Stop_I2c();
85 1
86 1 delay(1000);
87 1
88 1 for(i=0;i<8;i++)
89 1 buffer[i] = 0x5f; //用0xff填充发送缓冲区
90 1
91 1 for(i=0;i<6;i++){
92 2 Start_I2c();
93 2 SendB(0xa0); //从24C02读取刚才写入的数据
94 2 SendB(0x10+i); //数据存放地址为0x06+i
95 2 Start_I2c();
96 2 SendB(0xa1);
97 2 delay(6);
98 2 buffer[i]=RcvB(); //读取的值送串口缓冲区
99 2 Ack_I2c(1);
100 2 Stop_I2c();
101 2 }
102 1 copyOK = 1; //置准备好标志
103 1 send(); //向串口发送
104 1 }
105
106 /*****************************串口发送***************************/
107
108 void send(void)//向串口发送字符串
109 {
110 1
111 1 if(copyOK) //串口准备好且缓冲区准备好
C51 COMPILER V8.05a COM 02/20/2009 14:27:41 PAGE 3
112 1 {
113 2 i = 0;
114 2 REN = 0; //发送过程中禁止接收数据
115 2 copyOK = 0; //清缓冲区准备好标志
116 2 SBUF = buffer[i++]; //发送字符串首字符
117 2 number = 7; //置发送计数器
118 2 }
119 1 else
120 1 return; //没准备好则返回
121 1 }
122
123
124 /***************************串口中断响应*************************/
125
126 void serial(void) interrupt 4//串口中断响应
127 {
128 1 if(RI)//为接收中断
129 1 {
130 2 RI=0; //清接收中断标志
131 2 LED = ~LED; //闪串口指示LED
132 2 sbuffer = SBUF; //读取串口缓冲区数据
133 2
134 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
135 2 {
136 3 receive = 1; //开始接收标志
137 3 cmd_numb = 0; //清接收计数器
138 3 re_finish = 0; //清接收完成标志
139 3 }
140 2 else if(sbuffer == 'e') //判断数据尾
141 2 {
142 3 re_finish = 1; //置接收完成标志
143 3 receive =0; //清接收标志
144 3 }
145 2 else if(receive){ //判断当前是否处于接收状态
146 3
147 3 buffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
148 3 }
149 2 else //无效命令则返回
150 2 return;
151 2 }
152 1 else{
153 2 TI=0; //为单个字符发送完中断
154 2 if(!number) //字符串发送完
155 2 { REN = 1; //允许接收
156 3 }
157 2 else{ //字符串未发送完
158 3 SBUF = buffer[i++]; //发送下一字符
159 3 number--; //发送字符数减一
160 3 }
161 2 }
162 1 }
163
164 /*****************************延时函数**************************/
165 void delay(unsigned int loop)
166 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
167 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
168 1 }
169
170
171 /*******************************I2C开始*****************************/
172 void Start_I2c()
173 {
C51 COMPILER V8.05a COM 02/20/2009 14:27:41 PAGE 4
174 1 SDA=1;
175 1 delay(3);
176 1 SCL=1;
177 1 delay(6);
178 1 SDA=0;
179 1 delay(6);
180 1 SCL=0;
181 1 delay(3);
182 1 }
183
184
185
186 /*********************************I2C结束*****************************/
187 void Stop_I2c()
188 {
189 1 SDA=0;
190 1 delay(3);
191 1 SCL=1;
192 1 delay(6);
193 1 SDA=1;
194 1 delay(3);
195 1
196 1 }
197
198
199 /*********************************I2C写一个字节************************/
200 void SendB(uchar c)
201 {
202 1 uchar BitCnt,ack;
203 1 for(BitCnt=0;BitCnt<8;BitCnt++)
204 1 {
205 2 if((c<<BitCnt)&0x80)SDA=1;
206 2 else SDA=0;
207 2 delay(3);
208 2 SCL=1;
209 2 delay(6);
210 2 SCL=0;
211 2 delay(3);
212 2
213 2 }
214 1 delay(3);
215 1 SDA=1;
216 1 delay(6);
217 1 SCL=1;
218 1 delay(3);
219 1 SCL=0;
220 1 delay(3);
221 1
222 1 }
*** WARNING C280 IN LINE 202 OF COM.C: 'ack': unreferenced local variable
223
224 /******************************I2C读取一个字节****************************/
225 uchar RcvB()
226 {
227 1 uchar retc;
228 1 uchar BitCnt;
229 1 retc=0;
230 1 SDA=1;
231 1 for(BitCnt=0;BitCnt<8;BitCnt++)
232 1 {
233 2 delay(3);
234 2 SCL=0;
C51 COMPILER V8.05a COM 02/20/2009 14:27:41 PAGE 5
235 2 delay(6);
236 2 SCL=1;
237 2 delay(3);
238 2 retc=retc<<1;
239 2 if(SDA==1)retc=retc+1;
240 2 delay(3);
241 2 }
242 1 SCL=0;
243 1 delay(3);
244 1 return(retc);
245 1 }
246
247 /*********************************I2C应答*********************************/
248 void Ack_I2c(bit a)
249 {
250 1 if(a==0)SDA=0;
251 1 else SDA=1;
252 1 delay(3);
253 1 SCL=1;
254 1 delay(6);
255 1 SCL=0;
256 1 delay(3);
257 1
258 1 }
259
260 /**********************************结束***********************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 513 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 2
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -