📄 comm485.lst
字号:
168 1 TCON_ENABLE_TIMER = 0; //停止定时器
169 1 rs_f_TI_enable = 1; //允许发送
170 1 rs_f_RI_enable = 0; //禁止接收
171 1
172 1 rs_shift_count = 0; //清移位计数器
173 1 rs_f_TI = 1; //发送一个字符完毕标志
174 1 TCON_ENABLE_TIMER = 1; //启动定时器
175 1 }
176
177 void soft_rs232_interrupt( void )
178 {
179 1 /************************ 接收 ****************************/
C51 COMPILER V7.06 COMM485 12/15/2008 11:34:39 PAGE 4
180 1 if (rs_f_RI_enable == 1)
181 1 {
182 2 if (rs_shift_count == 0) //移位计数器==0, 表示检测到起始位的起点
183 2 {
184 3 if ( rs_RXD == 1 )
185 3 {
186 4 soft_receive_enable (); //起始位错, 从新开始
187 4 }
188 3 else
189 3 {
190 4 //下次中断在数据位或停止位中的某时刻发生
191 4 rs_timerL += rs_FULL_BIT_L;// + 0x10;
192 4 rs_timerH = rs_FULL_BIT_H;
193 4 rs_shift_count++;
194 4 rs_BUF = 0; //清移位缓冲变量
195 4 }
196 3 }
197 2 else
198 2 {
199 3 rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生
200 3 rs_timerH = rs_FULL_BIT_H;
201 3
202 3 rs_shift_count++; //2--9:数据位 10:停止位
203 3
204 3 if ( rs_shift_count == 9)
205 3 {
206 4 rs_BUF = rs_BUF >> 1; //接收第8位
207 4 rs_BUF_bit7 = rs_RXD;
208 4 if( ReceivePoint < rs_RECEIVE_MAX)
209 4 { //保存收到的字节
210 5 rs232buffer[ReceivePoint++] = rs_BUF;
211 5 }
212 4 else
213 4 {
214 5 rs_f_RI_enable = 0; //缓冲区满, 禁止接收
215 5 }
216 4 }
217 3 else
218 3 {
219 4 if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7
220 4 {
221 5 rs_BUF = rs_BUF >> 1;
222 5 rs_BUF_bit7 = rs_RXD;
223 5 }
224 4 else
225 4 { //收到停止位,继续检测 PC 机发出的下一个起始位
226 5 soft_receive_init();
227 5 }
228 4 }
229 3 }
230 2 TCON_TFx = 0; //清定时器中断标志
231 2 }
232 1 else
233 1 {
234 2 /************************ 发送 ****************************/
235 2 if (rs_f_TI_enable == 1)
236 2 {
237 3 rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻
238 3 rs_timerH = rs_FULL_BIT_H;
239 3
240 3 rs_shift_count--; //0:停止位末尾时刻到
241 3 //1:发送停止位
C51 COMPILER V7.06 COMM485 12/15/2008 11:34:39 PAGE 5
242 3 //2--9:发送数据位
243 3 if (rs_shift_count > 9) //错误状态
244 3 {
245 4 rs_shift_count = 9;
246 4 rs_BUF = 0xFF;
247 4 }
248 3
249 3 if (rs_shift_count > 1) //2--9:发送数据位
250 3 {
251 4 ACC = rs_BUF;
252 4 ACC = ACC >> 1;
253 4 rs_TXD = CY;
254 4 rs_BUF = ACC;
255 4 }
256 3 else
257 3 {
258 4 if (rs_shift_count == 0) //0:停止位末尾时刻到
259 4 {
260 5 rs_TXD = 1;
261 5 rs_f_TI = 1; //已发送完毕一个字节
262 5 }
263 4 else
264 4 {
265 5 rs_TXD = 1; //1:发送停止位
266 5 }
267 4 }
268 3 }
269 2 }
270 1 }
271
272 //由收转到发时,要先调用 soft_send_enable ()
273 void rs_send_byte(uint8 SendByte) //发送一个字节
274 {
275 1 while ( rs_f_TI == 0); //等待发送完毕前一个字节
276 1 rs_TXD = 1;
277 1 rs_timerL = rs_START_BIT_L; //下次中断在起始位的末尾时刻
278 1 rs_timerH = rs_START_BIT_H;
279 1 rs_BUF = SendByte;
280 1 rs_shift_count = 10;
281 1 rs_TXD = 0; //发送起始位
282 1 rs_f_TI = 0; //清已发送完毕一个字节的标志
283 1 }
284
285 void initiate_MCU (void) //系统初始化
286 {
287 1 soft_rs232_init(); //串口初始化
288 1 EA = 1; //开中断
289 1 }
290
291 void main (void)
292 {
293 1 //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
294 1 //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
295 1 //数据块。
296 1
297 1 uint8 i;
298 1 initiate_MCU(); //系统初始化
299 1
300 1 soft_send_enable (); //允许发送,禁止接收
301 1 for (i=0; i < rs_RECEIVE_MAX; i++ )
302 1 {
303 2 COMEN = 0;
C51 COMPILER V7.06 COMM485 12/15/2008 11:34:39 PAGE 6
304 2 rs_send_byte(i);
305 2 }
306 1 while ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕
307 1
308 1 while(1)
309 1 {
310 2 COMEN = 1;
311 2 soft_receive_enable (); //启动并开始接收,禁止发送
312 2 while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满
313 2
314 2 soft_send_enable (); //允许发送,禁止接收
315 2 for (i=0; i < rs_RECEIVE_MAX; i++ )
316 2 {
317 3 COMEN = 0;
318 3 rs_send_byte(rs232buffer[i]);
319 3 }
320 2 while ( rs_f_TI == 0) ; //等待最后一个字节发送完毕
321 2 ReceivePoint = 0;
322 2 COMEN = 1;
323 2 }
324 1 }
325
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 380 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 ----
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 + -