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