分类: C/C++
2010-08-16 16:02:37
At8051/52系统单片机因其性能可靠,价格低廉,开发容易(这个是最大优势了吧,国内大学,在80年代就开始教授8051单片机的开发,而时至今日,它仍然是大学中单片机课程的首选芯片),而得到广泛应用,在现今ARM7,ARM9,msp430等高性能32bit,16bit单片机流行的状况下,它依然有其不可替代性。至少本人在94年参加工作时,就是开发8051单片机程序(当时还没有keil c这样方便高效的开发环境,用的是汇编语言)16年后的今天,尽管有很多项目已经在用ARM9,linux操作系统来开发了,但有些低成本,功能单一的项目,还是用8051来完成。
8051虽然好用,但有一个缺点,那就是只有一个RS232串口。而现在,有很多时候都需要有两个串口。这时,大家自然就想要用软件方法来模拟一个串口,这种程序,网上有很多,其主要原理就是利用定时器的定时功能,在定时中断到后,对串行数据的每一位进行定时发送和定时采集。这种程序的缺点,那就是在时序上很难做到准确,因为单片机响应中断也是要花一定时间,且时间不定,而且这种不准确还会累积。这个缺点,在模拟发送时,没多大关系,因为每发送一字节的起始位时,时序上的误差都是从0开始的,在一个字节内,累积误差也不会大于1bit的时间宽度,因而不会影响接收方的接收。但在接收数据时,此误差没有归零的机会,会一直累积下去,另外,在接收时,起始位是靠程序以查询方式进行监测的,如果单片机负载相重,则有可能检测到起始位的时间靠近起始位的后部,使得误差影响更为严重,甚至丢失起始位,在通信的字串较短,波特率较低时,尚能可靠通信,但字串稍长,波特率较高时,则不能可靠通信。
那么,要改进这种模拟的方法,就需要在接收时,做到快速响应起始位,定时器每当收到起始位时都归零处理。方法就是利用收的起始位引起中断,在中断响应中归零定时器。我们可以利用8051的处部中断来实现。将单片机用于接收的脚与外部中断脚连接起来,这样,当起始位到来时,就会引发外部中断。单片机响应外部中断时再归零定时器,这样,就可以做到可靠接收。我用这种方法可以38400波特率一次接收200字节,表现十分稳定,从无误码出现。