?? pmpdatar.lst
字號(hào):
C51 COMPILER V7.02b PMPDATAR 12/10/2005 20:50:40 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE PMPDATAR
OBJECT MODULE PLACED IN PMPDataR.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE PMPDataR.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程學(xué)院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "PMPDataR.h"
8
9 /* 延時(shí)t毫秒 */
10 void delay(uint t)
11 {
12 1 uint i;
13 1 while(t--)
14 1 {
15 2 /* 對(duì)于11.0592M時(shí)鐘,約延時(shí)1ms */
16 2 for (i=0;i<125;i++)
17 2 {}
18 2 }
19 1 }
20
21 /* 發(fā)送數(shù)據(jù)函數(shù) */
22 uchar recvdata(uchar *buf)
23 {
24 1 uchar i,tmp;
25 1 uchar len; // 保存數(shù)據(jù)長(zhǎng)度
26 1 uchar ecc; // 保存校驗(yàn)字節(jié)
27 1
28 1 /* 接收數(shù)據(jù)長(zhǎng)度字節(jié) */
29 1 RI = 0;
30 1 while(!RI);
31 1 if (RB8==1)
32 1 return 0xee; // 若接收的為地址幀,則返回0xee
33 1 len = SBUF;
34 1 RI = 0;
35 1
36 1 /* 使用len的值為校驗(yàn)字節(jié)ecc賦初值 */
37 1 ecc = len;
38 1
39 1 /* 接收數(shù)據(jù) */
40 1 for (i=0;i<len;i++)
41 1 {
42 2 while(!RI);
43 2 if (RB8==1)
44 2 return 0xee; // 若接收的為地址幀,則返回0xee
45 2 *buf = SBUF;
46 2 ecc = ecc^(*buf); // 進(jìn)行字節(jié)校驗(yàn)
47 2 RI = 0;
48 2 buf++;
49 2 }
50 1 *buf = 0; // 表示數(shù)據(jù)結(jié)束
51 1
52 1 /* 接收校驗(yàn)字節(jié) */
53 1 while(!RI);
54 1 if (RB8==1)
55 1 return 0xee; // 若接收的為地址幀,則返回0xee
C51 COMPILER V7.02b PMPDATAR 12/10/2005 20:50:40 PAGE 2
56 1 tmp = SBUF;
57 1 RI = 0;
58 1
59 1 /* 進(jìn)行數(shù)據(jù)校驗(yàn) */
60 1 ecc = tmp^ecc;
61 1 if (ecc!=0) // 如果校驗(yàn)錯(cuò)誤
62 1 {
63 2 *(buf-len) = 0; // 清空數(shù)據(jù)緩沖區(qū)
64 2
65 2 /* 發(fā)送校驗(yàn)錯(cuò)誤信號(hào)ERR */
66 2 TI = 0;
67 2 TB8 = 0;
68 2 SBUF = ERR;
69 2 while(!TI);
70 2 TI = 0;
71 2
72 2 return 0xff; // 返回0xff表示校驗(yàn)錯(cuò)誤
73 2 }
74 1
75 1 /* 發(fā)送校驗(yàn)成功信號(hào)SUCC */
76 1 TI = 0;
77 1 TB8 = 0;
78 1 SBUF = SUCC;
79 1 while(!TI);
80 1 TI = 0;
81 1
82 1 return 0; // 校驗(yàn)成功,返回0
83 1 }
84
85 /* 串口初始化函數(shù) */
86 void init_serial()
87 {
88 1 TMOD = 0x20; // 定時(shí)器T1使用工作方式2
89 1 TH1 = 250;
90 1 TL1 = 250;
91 1 TR1 = 1; // 開(kāi)始計(jì)時(shí)
92 1 PCON = 0x80; // SMOD = 1
93 1 SCON = 0xd0; // 工作方式,9位數(shù)據(jù)位,波特率9600kbit/s,允許接收
94 1 }
95
96 /* 主程序 */
97 void main()
98 {
99 1 uchar i = 0;
100 1 uchar tmp = 0xff;
101 1
103 1
104 1 P20 = 1; // 發(fā)光管不亮
105 1
106 1 init_serial(); // 串口初始化
107 1
108 1 EA = 0; // 關(guān)閉所有中斷
109 1
110 1 /* 進(jìn)入設(shè)備應(yīng)答 */
111 1 while(1)
112 1 {
113 2 SM2 = 1; // 只接收地址幀
114 2
115 2 /* 如果接收到的地址幀不是本機(jī)地址,則繼續(xù)等待 */
116 2 tmp = addr-1;
117 2 while (tmp!=addr)
C51 COMPILER V7.02b PMPDATAR 12/10/2005 20:50:40 PAGE 3
118 2 {
119 3 RI = 0;
120 3 while(!RI)
121 3 tmp = SBUF;
122 3 RI = 0;
123 3 }
124 2
125 2 /* 發(fā)送本機(jī)地址作為應(yīng)答信號(hào),準(zhǔn)備接收數(shù)據(jù) */
126 2 TI = 0;
127 2 TB8 = 0; // 主機(jī)不檢測(cè)該位
128 2 SBUF = addr;
129 2 while(!TI);
130 2 TI = 0;
131 2 SM2 = 0; // 允許接收數(shù)據(jù)
132 2
133 2 /* 數(shù)據(jù)接收 */
134 2 tmp = 0xff;
135 2 while(tmp==0xff) // 如果校驗(yàn)失敗則重新接收數(shù)據(jù)
136 2 {
137 3 /* 校驗(yàn)失敗返回0xff,檢測(cè)到地址幀則返回0xee,接收成功返回0 */
138 3 tmp = recvdata(buf);
139 3 }
140 2 if (tmp==0x00) // 校驗(yàn)正確,表示接收成功
141 2 {
142 3 /* 綠燈亮,持續(xù)500ms,表示接收數(shù)據(jù)成功 */
143 3 P20 = 0;
144 3 delay(500);
145 3 P20 = 1;
146 3 }
147 2 // 如果接收數(shù)據(jù)時(shí)發(fā)現(xiàn)地址幀,則重新開(kāi)始整個(gè)接收過(guò)程
148 2 }
149 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 258 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 65 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -