📄 com.lst
字号:
C51 COMPILER V7.06 COM 06/17/2007 08:03:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN COM.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE COM.C BROWSE DEBUG OBJECTEXTEND
stmt 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 V7.06 COM 06/17/2007 08:03:15 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 2 if(re_finish){//接收一串字符完成
66 3 re_finish = 0;
67 3 vGet_Send();
68 3 }
69 2 }
70 1 }
71
72 /*****************************保存和串口发送**************************/
73 void vGet_Send(void)
74 { uchar i;
75 1
76 1 Start_I2c();
77 1 SendB(0xa0);
78 1 SendB(0x10); //数据存放初始地址为0x06
79 1 for(i=0;i<6;i++)
80 1 {SendB(buffer[i]); //向24C02写6个数据
81 2 delay(2); }
82 1 Stop_I2c();
83 1
84 1 delay(1000);
85 1
86 1 for(i=0;i<8;i++)
87 1 buffer[i] = 0xff; //用0xff填充发送缓冲区
88 1
89 1 for(i=0;i<6;i++){
90 2 Start_I2c();
91 2 SendB(0xa0); //从24C02读取刚才写入的数据
92 2 SendB(0x10+i); //数据存放地址为0x06+i
93 2 Start_I2c();
94 2 SendB(0xa1);
95 2 buffer[i]=RcvB(); //读取的值送串口缓冲区
96 2 Ack_I2c(1);
97 2 Stop_I2c();
98 2 }
99 1 copyOK = 1; //置准备好标志
100 1 send(); //向串口发送
101 1 }
102
103 /*****************************串口发送***************************/
104
105 void send(void)//向串口发送字符串
106 {
107 1
108 1 if(copyOK) //串口准备好且缓冲区准备好
109 1 {
110 2 i = 0;
111 2 REN = 0; //发送过程中禁止接收数据
C51 COMPILER V7.06 COM 06/17/2007 08:03:15 PAGE 3
112 2 copyOK = 0; //清缓冲区准备好标志
113 2 SBUF = buffer[i++]; //发送字符串首字符
114 2 number = 7; //置发送计数器
115 2 }
116 1 else
117 1 return; //没准备好则返回
118 1 }
119
120
121 /***************************串口中断响应*************************/
122
123 void serial(void) interrupt 4//串口中断响应
124 {
125 1 if(RI)//为接收中断
126 1 {
127 2 RI=0; //清接收中断标志
128 2 LED = ~LED; //闪串口指示LED
129 2 sbuffer = SBUF; //读取串口缓冲区数据
130 2
131 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
132 2 {
133 3 receive = 1; //开始接收标志
134 3 cmd_numb = 0; //清接收计数器
135 3 re_finish = 0; //清接收完成标志
136 3 }
137 2 else if(sbuffer == 'e') //判断数据尾
138 2 {
139 3 re_finish = 1; //置接收完成标志
140 3 receive =0; //清接收标志
141 3 }
142 2 else if(receive){ //判断当前是否处于接收状态
143 3
144 3 buffer[cmd_numb++] = sbuffer-'0'; //当前字符送缓冲区
145 3 }
146 2 else //无效命令则返回
147 2 return;
148 2 }
149 1 else{
150 2 TI=0; //为单个字符发送完中断
151 2 if(!number) //字符串发送完
152 2 { REN = 1; //允许接收
153 3 }
154 2 else{ //字符串未发送完
155 3 SBUF = buffer[i++]; //发送下一字符
156 3 number--; //发送字符数减一
157 3 }
158 2 }
159 1 }
160
161 /*****************************延时函数**************************/
162 void delay(unsigned int loop)
163 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
164 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
165 1 }
166
167
168 /*******************************I2C开始*****************************/
169 void Start_I2c()
170 {
171 1 SDA=1;
172 1 delay(1);
173 1 SCL=1;
C51 COMPILER V7.06 COM 06/17/2007 08:03:15 PAGE 4
174 1 delay(3);
175 1 SDA=0;
176 1 delay(3);
177 1 SCL=0;
178 1 delay(1);
179 1 }
180
181
182
183 /*********************************I2C结束*****************************/
184 void Stop_I2c()
185 {
186 1 SDA=0;
187 1 delay(1);
188 1 SCL=1;
189 1 delay(3);
190 1 SDA=1;
191 1 delay(1);
192 1
193 1 }
194
195
196 /*********************************I2C写一个字节************************/
197 void SendB(uchar c)
198 {
199 1 uchar BitCnt,ack;
200 1 for(BitCnt=0;BitCnt<8;BitCnt++)
201 1 {
202 2 if((c<<BitCnt)&0x80)SDA=1;
203 2 else SDA=0;
204 2 delay(2);
205 2 SCL=1;
206 2 delay(5);
207 2 SCL=0;
208 2 delay(2);
209 2
210 2 }
211 1 delay(1);
212 1 SDA=1;
213 1 delay(5);
214 1 SCL=1;
215 1 delay(1);
216 1 if(SDA==1)ack=0;
217 1 else ack=1;
218 1 SCL=0;
219 1 delay(1);
220 1
221 1 }
222
223 /******************************I2C读取一个字节****************************/
224 uchar RcvB()
225 {
226 1 uchar retc;
227 1 uchar BitCnt;
228 1 retc=0;
229 1 SDA=1;
230 1 for(BitCnt=0;BitCnt<8;BitCnt++)
231 1 {
232 2 delay(1);
233 2 SCL=0;
234 2 delay(5);
235 2 SCL=1;
C51 COMPILER V7.06 COM 06/17/2007 08:03:15 PAGE 5
236 2 delay(2);
237 2 retc=retc<<1;
238 2 if(SDA==1)retc=retc+1;
239 2 delay(1);
240 2 }
241 1 SCL=0;
242 1 delay(1);
243 1 return(retc);
244 1 }
245
246 /*********************************I2C应答*********************************/
247 void Ack_I2c(bit a)
248 {
249 1 if(a==0)SDA=0;
250 1 else SDA=1;
251 1 delay(1);
252 1 SCL=1;
253 1 delay(2);
254 1 SCL=0;
255 1 delay(1);
256 1
257 1 }
258
259 /**********************************结束***********************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 535 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 1
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -