📄 485mon.lst
字号:
C51 COMPILER V7.02b 485MON 12/10/2005 21:23:08 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE 485MON
OBJECT MODULE PLACED IN 485Mon.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE 485Mon.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************/
2 /* Copyright (c) 2005, 通信工程学院 */
3 /* All rights reserved. */
4 /****************************************/
5
6 #include "485Mon.h"
7
8 void main(void)
9 {
10 1 uchar type;
11 1
12 1 /* 初始化 */
13 1 init();
14 1
15 1 while (1)
16 1 {
17 2 if (Recv_Data(&type)==0) // 接收帧错误或者地址不符合,丢弃
18 2 continue;
19 2 switch (type)
20 2 {
21 3 case ACTIVE: // 主机询问从机是否在位
22 3 Send_Data(READY,0,StatusBuf); // 发送READY指令
23 3 break;
24 3 case GETDATA: // 主机读设备请求
25 3 Clr_StatusBuf();
26 3 Get_Stat(); // 数据采集函数
27 3 Send_Data(SENDDATA,strlen(StatusBuf),StatusBuf);
28 3 break;
29 3 default:
30 3 break; // 指令类型错误,丢弃当前帧
31 3 }
32 2 }
33 1 }
34
35 /* 初始化 */
36 void init(void)
37 {
38 1 P1 = 0xff;
39 1 DevNo = (P1&0x00111111); // 读取本机设备号
40 1
41 1 TMOD = 0x20;
42 1 SCON = 0x50;
43 1 TH1 = 0xfd;
44 1 TL1 = 0xfd;
45 1 TR1 = 1;
46 1 PCON = 0x00; // SMOD=0
47 1 EA = 0;
48 1
49 1 }
50
51 /* 接收数据帧函数,实际上接收的是主机的指令 */
52 bit Recv_Data(uchar *type)
53 {
54 1 uchar tmp,rCount,i;
55 1 uchar r_buf[RECFRMMAXLEN]; // 保存接收到的帧
C51 COMPILER V7.02b 485MON 12/10/2005 21:23:08 PAGE 2
56 1 uchar Flag_RecvOver; // 一帧接收结束标志
57 1 uchar Flag_StartRec; // 一帧开始接收标志
58 1 uchar CheckSum; // 校验和
59 1 uchar DataLen; // 数据字节长度变量
60 1
61 1 /* 禁止发送,允许接收 */
62 1 DE = 0;
63 1 RE = 0;
64 1
65 1 /* 接收一帧数据 */
66 1 rCount = 0;
67 1 Flag_StartRec = 0;
68 1 Flag_RecvOver = 0;
69 1 while (!Flag_RecvOver)
70 1 {
71 2 RI = 0;
72 2 while (!RI);
73 2 tmp = SBUF;
74 2 RI=0;
75 2
76 2 /* 判断是否收到字符'$',其数值为0x24 */
77 2 if ((!Flag_StartRec) && (tmp == 0x24))
78 2 {
79 3 Flag_StartRec = 1;
80 3 }
81 2
82 2 if (Flag_StartRec)
83 2 {
84 3 r_buf[rCount] = tmp;
85 3 rCount ++;
86 3
87 3 /* 判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位 */
88 3 if (tmp == 0x2A)
89 3 Flag_RecvOver = 1;
90 3 }
91 2
92 2 if (rCount == RECFRMMAXLEN) // 帧超长错误,返回0
93 2 return 0;
94 2 }
95 1
96 1 /* 计算校验和字节 */
97 1 CheckSum = 0;
98 1 DataLen = r_buf[3];
99 1 for (i=0;i++;i<3+DataLen)
100 1 {
101 2 CheckSum = CheckSum + r_buf[i+1];
102 2 }
103 1
104 1 /* 判断帧是否错误 */
105 1 if (rCount<6) // 帧过短错误,返回0,最短的指令帧为6个字节
106 1 return 0;
107 1 if (r_buf[1]!=DevNo) // 地址不符合,错误,返回0
108 1 return 0;
109 1 if (r_buf[rCount-2]!=CheckSum) // 校验错误,返回0
110 1 return 0;
111 1
112 1 *type = r_buf[2]; // 获取指令类型
113 1
114 1 return 1; // 成功,返回1
115 1 }
116
117 /* 发送数据帧函数 */
C51 COMPILER V7.02b 485MON 12/10/2005 21:23:08 PAGE 3
118 void Send_Data(uchar type,uchar len,uchar *buf)
119 {
120 1 uchar i,tmp;
121 1 uchar CheckSum = 0;
122 1
123 1 /* 允许发送,禁止接收 */
124 1 DE = 1;
125 1 RE = 1;
126 1
127 1 /* 发送帧起始字节 */
128 1 tmp = 0x24;
129 1 Send(tmp);
130 1
131 1 Send(DevNo); // 发送地址字节,也即设备号
132 1 CheckSum = CheckSum + DevNo;
133 1
134 1 Send(type); // 发送类型字节
135 1 CheckSum = CheckSum + type;
136 1
137 1 Send(len); // 发送数据长度字节
138 1 CheckSum = CheckSum + len;
139 1
140 1 /* 发送数据 */
141 1 for (i=0;i<len;i++)
142 1 {
143 2 Send(*buf);
144 2 CheckSum = CheckSum + *buf;
145 2 buf++;
146 2 }
147 1
148 1 Send(CheckSum); // 发送校验和字节
149 1
150 1 /* 发送帧结束字节 */
151 1 tmp = 0x2A;
152 1 Send(tmp);
153 1 }
154
155 /* 采集数据函数经过简化处理,取固定的10个字节数据 */
156 void Get_Stat(void)
157 {
158 1 StatusBuf[0]=DATA0;
159 1 StatusBuf[1]=DATA1;
160 1 StatusBuf[2]=DATA2;
161 1 StatusBuf[3]=DATA3;
162 1 StatusBuf[4]=DATA4;
163 1 StatusBuf[5]=DATA5;
164 1 StatusBuf[6]=DATA6;
165 1 StatusBuf[7]=DATA7;
166 1 StatusBuf[8]=DATA8;
167 1 StatusBuf[9]=DATA9;
168 1 }
169
170 /* 发送单字节数据 */
171 void Send(uchar m)
172 {
173 1 TI = 0;
174 1 SBUF = m;
175 1 while(!TI);
176 1 TI = 0;
177 1 }
178
179 /* 清除设备状态信息缓冲区函数*/
C51 COMPILER V7.02b 485MON 12/10/2005 21:23:08 PAGE 4
180 void Clr_StatusBuf(void)
181 {
182 1 uchar i;
183 1 for (i=0;i<STATUSMAXLEN;i++)
184 1 StatusBuf[i] = 0;
185 1 }
186
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 400 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 10 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 29
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 + -