📄 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 + -