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