?? main.lst
字號:
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 /*
2 //*************************************************************************
3 //
4 // 串口輸入輸出控制器
5 //
6 // COPYRIGHT (c) 2005 BY 明浩 pnzwzw@cdle.net
7 // -- ALL RIGHTS RESERVED --
8 //
9 // File Name: main.c
10 // Created: 2005.7.4
11 // Modified: 2005.7.5
12 // Revision: 1.0
13 //
14 //*************************************************************************
15 // 芯片類型 AT89S51
16 //*************************************************************************
17 */
18
19 #include <at89x52.h>
20 #include <INTRINS.H>
21
22 void InitCom(void);
23 void ComOutChar(unsigned char OutData);
24 void PackCheck(void);
25 void SendErrMsg(void);
26 void SendCRCMsg(void);
27 void SendTeMsg(void);
28 void SendNSMsg(void);
29 void RunPack(void);
30 void CheckID(void);
31 void SendPack(void);
32 void Write(void);
33 void Read(void);
34
35 static unsigned char Pack[9]; //數據包數組
36 static unsigned char PN = 0; //接收指針
37 static unsigned char TN = 0; //超時標識
38 static unsigned char SN = 0;
39 unsigned char code SNID[] = {"SN0001"}; //固件的序列號
40
41 void main(void)
42 {
43 1 unsigned int a;
44 1
45 1 InitCom();
46 1 do
47 1 {
48 2 for (a=0; a<30000; a++)
49 2 P3_6 = 1;
50 2 for (a=0; a<30000; a++) //指示燈閃動
51 2 P3_6 = 0;
52 2 }
53 1 while(1);
54 1 }
55
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 2
56 //串口初始化 晶振為11.0592M 方式1 波特率57600
57 void InitCom(void)
58 {
59 1 SCON = 0x50; //串口方式1,允許接收
60 1 TMOD = 0x21; //定時器1定時方式2,定時0為模式1,16位模式
61 1 TCON = 0x40; //設定時器1開始計數
62 1 TH1 = 255; //設波特率為57600
63 1 TL1 = 255;
64 1 PCON = 0x80; //波特率加倍控制,SMOD位
65 1 RI = 0; //清收發標志
66 1 TI = 0;
67 1 TR1 = 1; //啟動定時器
68 1 EA = 1; //開總中斷
69 1 ES = 1; //開串口中斷
70 1 }
71
72
73 //向串口輸出一個字符(非中斷方式)
74 void ComOutChar(unsigned char OutData)
75 {
76 1 SBUF = OutData; //輸出字符
77 1 while(!TI); //空語句判斷字符是否發完
78 1 TI = 0; //清TI
79 1 }
80
81 //串口接收中斷
82 void ComInINT(void) interrupt 4
83 {
84 1 if (RI) //判斷是不是收完字符
85 1 {
86 2 ET0 = 0; //開定時中斷
87 2 TR0 = 0;
88 2 TN = 0; //接收超時變量清零
89 2 RI = 0; //RI清零
90 2 Pack[PN] = SBUF; //存數據
91 2 PN++; //指針加1
92 2 if (PN == 9)
93 2 {
94 3 PN = 0; //指針清零 一幀數據收完后
95 3 PackCheck(); //調用數據包檢查
96 3 }
97 2 else
98 2 {
99 3 TH0 = 0x70; //設定時值,收到數據時設定時值
100 3 TL0 = 0x43;
101 3 ET0 = 1; //定時器中斷0開
102 3 TR0 = 1; //啟動定時器 定時器用于在一幀數據接收時如有丟包則返回錯誤信息12個0xEE
103 3 }
104 2 }
105 1 }
106
107 //定時器中斷用于處理丟包
108 void Timer0(void) interrupt 1
109 {
110 1 if (TN>2) // 幀中的兩字符間隔tn*40ms則為出錯
111 1 {
112 2 ET0 = 0;
113 2 TR0 = 0; //關定時中斷
114 2
115 2 SendTeMsg(); //發送超時錯誤信息
116 2 PN = 0; //pack指針清零
117 2 TN = 0;
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 3
118 2 }
119 1 else
120 1 TN++;
121 1 }
122
123 //信息包校驗
124 void PackCheck(void)
125 {
126 1 unsigned char CRCL = 0, CRCH = 0; //CRC高低字節暫存
127 1 unsigned char TempCyc;
128 1
129 1 for (TempCyc=0; TempCyc<7; TempCyc++)
130 1 {
131 2 CRCL = CRCL + Pack[TempCyc]; //把信息包中的前十個相加
132 2 if (CY) //當CRCL大于0xFF時,CY為1
133 2 CRCH++; //CY為1時CRCH加1
134 2 }
135 1 if ((CRCL == Pack[8]) && (CRCH == Pack[7]))
136 1 RunPack(); //校驗正確時執行包
137 1 else
138 1 SendCRCMsg(); //CRC校驗不對時,這個包將不執行,并向PC發送CRC錯誤信息
139 1 }
140
141 //發送SN錯誤信息
142 void SendErrMsg(void)
143 {
144 1 ComOutChar(0x0A);
145 1 }
146
147 //發送命令完成
148 void SendOKMsg(void)
149 {
150 1 ComOutChar(0x0B);
151 1 }
152
153 //發送CRC錯誤
154 void SendCRCMsg(void)
155 {
156 1 ComOutChar(0x0C);
157 1 }
158
159 //發送超時錯誤
160 void SendTeMsg(void)
161 {
162 1 ComOutChar(0x0D);
163 1 }
164
165
166 //發送命令不支持錯誤
167 void SendNSMsg(void)
168 {
169 1 ComOutChar(0x0E);
170 1 }
171
172 //運行信息包
173 void RunPack(void)
174 {
175 1 switch(Pack[0])
176 1 {
177 2 case 1: CheckID(); break;
178 2 case 2: Write(); break;
179 2 case 3: Read(); break;
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 4
180 2 default: SendNSMsg(); //命令不支持
181 2 }
182 1 }
183
184 //校驗序列號
185 void CheckID(void)
186 {
187 1 unsigned char TempCyc;
188 1 for (TempCyc=1; TempCyc<7; TempCyc++)
189 1 {
190 2 if (SNID[TempCyc-1]!=Pack[TempCyc])
191 2 {
192 3 TempCyc=7; //如有一個不對時跳出循環
193 3 SN = 0;
194 3 }
195 2 else
196 2 {
197 3 SN = 1;
198 3 }
199 2 }
200 1 if (SN)
201 1 SendOKMsg(); //返回OK
202 1 else
203 1 SendErrMsg(); //發送SN錯誤信息
204 1 }
205
206 //發送信息包
207 void SendPack(void)
208 {
209 1 unsigned char CRCL = 0, CRCH = 0; //CRC高低字節暫存
210 1 unsigned char TempCyc;
211 1
212 1 for (TempCyc=0; TempCyc<7; TempCyc++)
213 1 {
214 2 CRCL = CRCL + Pack[TempCyc]; //把信息包中的前十個相加
215 2 if (CY) //當CRCL大于0xFF時,CY為1
216 2 CRCH++; //CY為1時CRCH加1
217 2 }
218 1 Pack[7] = CRCH;
219 1 Pack[8] = CRCL; //計算要發送的信息包CRC
220 1 for (TempCyc=0; TempCyc<9; TempCyc++)
221 1 ComOutChar(Pack[TempCyc]); //發送錯誤信息包
222 1 }
223
224 //寫命令的信息包處理
225 void Write(void)
226 {
227 1 if (SN)
228 1 {
229 2 switch(Pack[1]) //0為P0,1為P1,2為P2,3為關閉所有
230 2 {
231 3 case 0:
232 3 P0 = Pack[2];
233 3 SendOKMsg();
234 3 break;
235 3 case 1:
236 3 P1 = Pack[2];
237 3 SendOKMsg();
238 3 break;
239 3 case 2:
240 3 P2 = Pack[2];
241 3 SendOKMsg();
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 5
242 3 break;
243 3 case 3:
244 3 P0 = 0xFF;
245 3 P1 = 0xFF;
246 3 P2 = 0xFF;
247 3 SendOKMsg();
248 3 break;
249 3 case 4:
250 3 P0 = 0x00;
251 3 P1 = 0x00;
252 3 P2 = 0x00;
253 3 SendOKMsg();
254 3 break;
255 3 default: SendNSMsg();
256 3 }
257 2 }
258 1 else
259 1 {
260 2 SendErrMsg();
261 2 }
262 1 }
263
264
265 //跟據相應的芯片類型去讀芯片
266 void Read(void)
267 {
268 1 if (SN)
269 1 {
270 2 switch(Pack[1]) //0為P0,1為P1,2為P2,3為返回全部
271 2 {
272 3 case 0:
273 3 Pack[1] = P0;
274 3 Pack[2] = 0;
275 3 Pack[3] = 0;
276 3 SendPack();
277 3 break;
278 3 case 1:
279 3 Pack[1] = 0;
280 3 Pack[2] = P1;
281 3 Pack[3] = 0;
282 3 SendPack();
283 3 break;
284 3 case 2:
285 3 Pack[1] = 0;
286 3 Pack[2] = 0;
287 3 Pack[3] = P2;
288 3 SendPack();
289 3 break;
290 3 case 3:
291 3 Pack[1] = P0;
292 3 Pack[2] = P1;
293 3 Pack[3] = P2;
294 3 SendPack();
295 3 break;
296 3 default: SendNSMsg();
297 3 }
298 2 }
299 1 else
300 1 {
301 2 SendErrMsg();
302 2 }
303 1 }
C51 COMPILER V7.09 MAIN 07/05/2005 16:40:31 PAGE 6
304
305
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 556 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -