📄 dp51e.lst
字号:
C51 COMPILER V7.06 DP51E 08/31/2007 16:35:48 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DP51E
OBJECT MODULE PLACED IN dp51e.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE dp51e.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include<intrins.h>
3 #include"IIC.h"
4
5
6 #define CSI24WC02 0xa0
7
8 #define MAX 20
9
10 extern bit ack;
11
12 uchar xdata DATA_BUF[MAX]; /*由于寄存器的动态的,不能放在rom区,所以不能声明为code*/
13 void main(void)
14 {
15 1 uchar n;
16 1 TMOD=0x20;
17 1 TH1=0xfd;
18 1 TL1=0xfd;
19 1 TR1=1;
20 1 SCON=0x50;
21 1 PCON=0x00;
22 1 ES=1;
23 1 EA=1;
24 1 for(n=0;n<MAX;n++)
25 1 {
26 2 DATA_BUF[n]=0;
27 2 }
28 1 while(1);
29 1 }
30 //将DATA_BUF的数据发送回上位机;发送的数据个数n中
31 void send_pc(uchar *p,uchar n)
32 {
33 1 uchar i;
34 1 for(i=0;i<n;i++)
35 1 {
36 2 SBUF=p[i];
37 2 while(TI==0);
38 2 TI=0;
39 2 }
40 1 }
41 /*接收一字节串口上的数据*/
42 uchar rcv_data(void)
43 {
44 1 uchar buf;
45 1 uint m=500;
46 1 RI=0;
47 1 while(!RI)
48 1 {
49 2 m--;
50 2 if(m==0)
51 2 {
52 3 m=500;
53 3 buf=0x00;
54 3
55 3 return buf;
C51 COMPILER V7.06 DP51E 08/31/2007 16:35:48 PAGE 2
56 3 }
57 2 }
58 1 RI=0;
59 1 buf=SBUF;
60 1 return buf;
61 1 }
62
63 /*接收命令出错,返回出错码00H*/
64 void int_err(void)
65 {
66 1 DATA_BUF[0]=0x12;
67 1 DATA_BUF[1]=0xa1;
68 1 DATA_BUF[2]=0x022;
69 1 DATA_BUF[3]=0x00;
70 1 DATA_BUF[4]=0xb1;
71 1 send_pc(DATA_BUF,5);
72 1 TI=0;
73 1 RI=0;
74 1 }
75
76 /*读CSI24WC02的指定单元,并将数据返回给上位机
77 ;若读CSI24WC02无应答,则返回操作失败帧
78 */
79 bit IRcvStr(uchar sla,uchar suba,uchar no)
80 {
81 1 uchar i;
82 1 uchar xrl; /*异或校验位*/
83 1 Start_I2c(); /*启动总线*/
84 1 SendByte(sla); /*发送器件地址*/
85 1 if(ack==0)return(0);
86 1 SendByte(suba); /*发送器件子地址*/
87 1 if(ack==0)return(0);
88 1
89 1 Start_I2c();
90 1 SendByte(sla+1);
91 1 if(ack==0)
92 1 {
93 2 DATA_BUF[0]=0x12;
94 2 DATA_BUF[1]=0xa1;
95 2 DATA_BUF[2]=2;
96 2 DATA_BUF[3]=0x01;
97 2 DATA_BUF[4]=0xb1;
98 2 send_pc(DATA_BUF,5);
99 2 return(0);
100 2 }
101 1 DATA_BUF[0]=0x12;
102 1 DATA_BUF[1]=0xa0;
103 1 DATA_BUF[2]=no; //no=N+1 N位数据位1位奇偶校验位//
104 1 xrl=no^0xb2;
105 1 for(i=3;i<no+2;i++)
106 1 {
107 2 DATA_BUF[i]=RcvByte(); /*发送数据*/
108 2 Ack_I2c(0); /*发送就答位*/
109 2 xrl=xrl^DATA_BUF[i];
110 2 }
111 1 DATA_BUF[no+2]=xrl;
112 1 send_pc(DATA_BUF,no+3);
113 1 Ack_I2c(1); /*发送非应位*/
114 1 Stop_I2c(); /*结束总线*/
115 1 return(1);
116 1 }
117
C51 COMPILER V7.06 DP51E 08/31/2007 16:35:48 PAGE 3
118 /*写CSI24WC02的指定单元
119 ;操作成功则返回操作成功回应帧*/
120 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
121 {
122 1 uchar i;
123 1
124 1 Start_I2c(); /*启动总线*/
125 1 SendByte(sla); /*发送器件地址*/
126 1 if(ack==0)return(0);
127 1 SendByte(suba); /*发送器件子地址*/
128 1 if(ack==0)
129 1 {
130 2 DATA_BUF[0]=0x12;
131 2 DATA_BUF[1]=0xa1;
132 2 DATA_BUF[2]=3;
133 2 DATA_BUF[3]=suba;
134 2 DATA_BUF[4]=0x00;
135 2 DATA_BUF[5]=suba^0xb0;
136 2 send_pc(DATA_BUF,6);
137 2 return(0);
138 2 }
139 1 DATA_BUF[0]=0x12;
140 1 DATA_BUF[1]=0xa0;
141 1 DATA_BUF[2]=1;
142 1 DATA_BUF[3]=0xb3;
143 1 send_pc(DATA_BUF,4);
144 1 s=s+4;
145 1 for(i=0;i<no-2;i++)
146 1 {
147 2 SendByte(*s); /*发送数据???*/
148 2 if(ack==0)return(0);
149 2 s++;
150 2 }
151 1 Stop_I2c(); /*结束总线*/
152 1 return(1);
153 1 }
154
155 void ser_int(void) interrupt 4
156 {
157 1 uchar rd; //接收桢头
158 1 uchar i;
159 1 uchar xrl; //异或参数
160 1 uchar n; //参数个数
161 1 uchar ord; //命令字参数
162 1 bit err; //发送接收正确标志位
163 1 while(TI==0)
164 1 {
165 2 rd=SBUF;
166 2 if(rd!=0x12) break;
167 2 DATA_BUF[0]=rd;
168 2 xrl=rd;
169 2 rd=rcv_data(); //接收命令字
170 2 if(rd==0x00) break;
171 2 DATA_BUF[1]=rd;
172 2 rd=rcv_data(); //接收参数个数
173 2 if(rd==0x00) break;
174 2 DATA_BUF[2]=rd;
175 2 n=rd;
176 2 for(i=3;i<n+2;i++)
177 2 {
178 3 rd=rcv_data();
179 3 if(rd==0x00)
C51 COMPILER V7.06 DP51E 08/31/2007 16:35:48 PAGE 4
180 3 {
181 4 int_err();
182 4 break;
183 4 }
184 3 DATA_BUF[i]=rd;
185 3 }
186 2 rd=rcv_data(); //接收参数个数
187 2 if(rd==0x00) break;
188 2 DATA_BUF[n+2]=rd;
189 2 for(i=1;i<n+2;i++)
190 2 {
191 3 xrl=xrl^DATA_BUF[i];
192 3 }
193 2 if(xrl!=DATA_BUF[n+2]) int_err();
194 2 ord=DATA_BUF[1];
195 2 if(ord==20)
196 2 {
197 3 err=IRcvStr(CSI24WC02,DATA_BUF[3],n);
198 3 if(err==0) int_err();
199 3 break;
200 3 }
201 2 else if(ord==21)
202 2 {
203 3 err=ISendStr(CSI24WC02,DATA_BUF[3],DATA_BUF,n);
204 3 if(err==0) int_err();
205 3 break;
206 3 }
207 2 else break;
208 2 }
209 1 TI=0;
210 1 RI=0;
211 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 807 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 20 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 20
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 + -