📄 main.lst
字号:
189 2 *(s+i)=RecByte();
190 2 CS+=*(s+i);
191 2 }
192 1 if(RecByte()!=0x68) /*是数据帧头吗?*/
193 1 return 0;
194 1 CS+=0x68;
195 1 CS+=(*(s+6)=RecByte()); /*接收通讯命令*/
196 1 j=*(s+7)=RecByte(); /*接收通讯数据长度*/
197 1 CS+=j;
198 1 for(i=0;i<=(j-1);i++) /*接收N个数据*/
199 1 {
200 2 CS+=(*(s+i+8)=RecByte());
201 2 *(s+i+8)-=0x33;
202 2 }
203 1 if(CS!=RecByte()) /*校验正确吗?*/
204 1 return 0;
205 1 if(RecByte()!=0x16) /*是帧尾吗?*/
206 1 return 0;
207 1 ES=0;
208 1 return 1;
209 1 }
210
211 /********************************************************************
212 串口接收中断服务程序
213 功能:接收数据
214 ********************************************************************/
215 void RXD_Int(void) interrupt 4
216 {
217 1 CY=RecFrame(Serial_buf);
218 1 if(CY)
219 1 Command_status1|=0x04; /*一帧接收成功,通知主程序进行通讯处理*/
220 1 }
221
222 /********************************************************************
223 串口发送一个字节
224 功能:发送一个字节数据
225 入口参数:发送数据
226 出口参数:无
227 ********************************************************************/
228 void SendByte(uchar Serial_data)
229 {
230 1 ACC=Serial_data;
231 1 TB8=P;TI=0;
232 1 SBUF=Serial_data;
233 1 while(!TI);
234 1 TI=0; /*发送一个字节,并进行偶校验*/
235 1 }
236
237 /********************************************************************
238 发送一帧数据函数
239 原型:void TXD_Int(uchar *s);
240 功能:发送一帧数据
241 入口参数:发送数据帧地址指针
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 5
242 出口参数:无
243 ********************************************************************/
244 void TXD_Int(uchar *s)
245 {
246 1 uchar CS=0x68;
247 1 char i,j;
248 1
249 1 CTRL485=0; /*RS485通讯,切换为发送状态*/
250 1 Delay(1);
251 1 TI=0;
252 1 SendByte(0xfe); /*发送2个前到字节*/
253 1 SendByte(0xfe);
254 1 SendByte(0x68); /*发送帧头*/
255 1 for(i=0;i<=3;i++) /*发送通讯地址*/
256 1 {CS+=*(s+i);SendByte(*(s+i));}
257 1 CS+=0x68;SendByte(0x68); /*发送数据帧头*/
258 1 CS+=*(s+6);SendByte(*(s+6)); /*发送帧命令*/
259 1 CS+=*(s+7);j=*(s+7);SendByte(j); /*发送数据长度*/
260 1 for(i=0;i<=j-1;i++) /*发送数据*/
261 1 {
262 2 (*(s+i+8))+=0x33;
263 2 SendByte(*(s+i+8));CS+=(*(s+i+8));
264 2 }
265 1 SendByte(CS); /*发送校验字节*/
266 1 SendByte(0x16); /*发送帧尾*/
267 1 RI=0;TI=0;
268 1 Delay(1);
269 1 CTRL485=1; /*一帧发送完毕,恢复信道切换功能*/
270 1
271 1 }
272
273 /********************************************************************
274 通讯地址判断函数
275 原型:uchar Serial_Address(uchar *);
276 功能:通讯地址判断
277 全局变量:
278 入口参数:s1指向从通讯地址
279 出口参数:0x00错误,0x01正确,0x02广播地址
280 ********************************************************************/
281 uchar Serial_Address(uchar *s1)
282 {
283 1 uchar i,a[4];
284 1 a[0]=P20; /*读取通讯地址*/
285 1 a[1]=P21;
286 1 a[2]=P22;
287 1 a[3]=P23;
288 1 for(i=0;i<=3;i++)
289 1 {
290 2 if((*(s1+i))!=0x99)
291 2 break; /*不是广播地址*/
292 2 if(i==5)
293 2 return(0x02); /*是广播地址*/
294 2 }
295 1 for(i=0;i<=3;i++)
296 1 {
297 2 if((*(s1+i))!=a[i])
298 2 return(0x00); /*地址不相同*/
299 2 }
300 1 return(0x01); /*地址相同*/
301 1 }
302
303 /********************************************************************
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 6
304 通讯执行函数
305 原型:bit Serial_Command_Run(uchar *);
306 功能:执行通讯命令
307 入口参数:帧地址
308 出口参数:是否正确及是否完毕,0为错误和通讯没有完成,1为正确和通讯完成
309 ********************************************************************/
310 bit Serial_Command_Run(uchar *s)
311 {
312 1 switch(Serial_Address(s)) /*判断地址是否正确*/
313 1 {
314 2 case 0x02: /*广播地址99999999H*/
315 2 break;
316 2 case 0x01: /*正常地址*/
317 2 switch(*(s+4))
318 2 {
319 3 (*(s+6))|=0x80;(*(s+7))=0x04; /*存入命令码及长度字节*/
320 3 TXD_Int(s); /*发送一帧数据*/
321 3 break;
322 3 case 0x01: /*读数据*/
323 3 break;
324 3 case 0x04: /*写数据*/
325 3 break;
326 3 default: /*其他命令*/
327 3 break;
328 3 }
329 2 break;
330 2 case 0x00: /*地址错误*/
331 2 return 0;
332 2 break;
333 2 }
334 1 return 1; /*帧执行正确,返回*/
335 1
336 1 }
337 /********************************************************************
338 通讯主函数
339 原型:void Serial_Command();
340 功能:执行通讯命令
341 入口参数:无
342 出口参数:无
343 ********************************************************************/
344 void Serial_Command()
345 {
346 1 if(Command_status1&0x04) /*通讯事件发送*/
347 1 {
348 2 if(~Serial_Command_Run(Serial_buf)) /*帧执行*/
349 2 {ES=1;Command_status1&=0xfb;return;} /*帧错误,恢复信道功能*/
350 2 ES=1; /*恢复信道功能*/
351 2 Command_status1&=0xfb; /*j清除通讯处理事件*/
352 2 }
353 1 }
354
355 /********************************************************************
356 主函数
357 原型:void main();
358 功能:完成通讯主流程
359 入口参数:无
360 出口参数:无
361 ********************************************************************/
362 void main()
363 {
364 1 InitializeSystem(); /*对CPU各个部件初始化*/
365 1 while(1)
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 7
366 1 {
367 2 Serial_Command();
368 2 }
369 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1014 ----
CONSTANT SIZE = 152 ----
XDATA SIZE = 15 20
PDATA SIZE = ---- ----
DATA SIZE = 94 ----
IDATA SIZE = 36 ----
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 + -