Chinaunix首页 | 论坛 | 博客
  • 博客访问: 402569
  • 博文数量: 29
  • 博客积分: 2091
  • 博客等级: 大尉
  • 技术积分: 463
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 10:53
文章分类
文章存档

2012年(2)

2011年(6)

2010年(12)

2009年(9)

我的朋友

分类: C/C++

2010-08-16 16:02:37

At8051/52系统单片机因其性能可靠,价格低廉,开发容易(这个是最大优势了吧,国内大学,在80年代就开始教授8051单片机的开发,而时至今日,它仍然是大学中单片机课程的首选芯片),而得到广泛应用,在现今ARM7ARM9msp430等高性能32bit,16bit单片机流行的状况下,它依然有其不可替代性。至少本人在94年参加工作时,就是开发8051单片机程序(当时还没有keil c这样方便高效的开发环境,用的是汇编语言)16年后的今天,尽管有很多项目已经在用ARM9linux操作系统来开发了,但有些低成本,功能单一的项目,还是用8051来完成。

8051虽然好用,但有一个缺点,那就是只有一个RS232串口。而现在,有很多时候都需要有两个串口。这时,大家自然就想要用软件方法来模拟一个串口,这种程序,网上有很多,其主要原理就是利用定时器的定时功能,在定时中断到后,对串行数据的每一位进行定时发送和定时采集。这种程序的缺点,那就是在时序上很难做到准确,因为单片机响应中断也是要花一定时间,且时间不定,而且这种不准确还会累积。这个缺点,在模拟发送时,没多大关系,因为每发送一字节的起始位时,时序上的误差都是从0开始的,在一个字节内,累积误差也不会大于1bit的时间宽度,因而不会影响接收方的接收。但在接收数据时,此误差没有归零的机会,会一直累积下去,另外,在接收时,起始位是靠程序以查询方式进行监测的,如果单片机负载相重,则有可能检测到起始位的时间靠近起始位的后部,使得误差影响更为严重,甚至丢失起始位,在通信的字串较短,波特率较低时,尚能可靠通信,但字串稍长,波特率较高时,则不能可靠通信。

那么,要改进这种模拟的方法,就需要在接收时,做到快速响应起始位,定时器每当收到起始位时都归零处理。方法就是利用收的起始位引起中断,在中断响应中归零定时器。我们可以利用8051的处部中断来实现。将单片机用于接收的脚与外部中断脚连接起来,这样,当起始位到来时,就会引发外部中断。单片机响应外部中断时再归零定时器,这样,就可以做到可靠接收。我用这种方法可以38400波特率一次接收200字节,表现十分稳定,从无误码出现。

阅读(2533) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~