串口波特率与定时计数器资料_第1页
串口波特率与定时计数器资料_第2页
串口波特率与定时计数器资料_第3页
串口波特率与定时计数器资料_第4页
串口波特率与定时计数器资料_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在基于单片机的系统开发时,经常采用UART串口,在系统中元件之间,或系统与系统之间进行通信。然而在写过(抑或是生搬硬套)若干串口通信程序之后,却越来越迷惘于串口波特率的设定与T/C间的关系,本文就此问题加以思考并给予验证。1. T1 作为波特率发生器在对TMOD进行设置时,若非特殊需要非常低的波特率,一般将T1的工作模式选为方式2:此时既省去了进入T1中断,利用软件重新设置TH1和TL1的不便,又保障了数据收发的正确性(因为晶振稳定)。此时问题来了,那么T0又该设置成什么方式呢?看下表:TMODTR1 = ?Communicate片内资源(8051)0x200不能通信T/C(1)1可以通信0x

2、210不能通信T/C(1)1可以通信0x220不能通信T/C(1)1可以通信0x230可以通信T/C(1),T(1):由T0拆分1可以通信由上表可看出,当T/C0工作于方式3时,T/C1只需设置好工作方式就可自动运行,而不需要"TR1 =1"命令。同时也发现,由于T0的拆分,片内仍存在着一个T/C,一个T,可以说,若使用T1作为串口的波特率发生器,最好使T0工作在方式3下,即TMOD = 0X23。正如老子所说"福兮祸之所伏",此做法也存在着一定的坏处:1. 由于T0的拆分所得的2个T均为8位,且无reload功能,功能减弱。2. 由于TH0占用了T1的

3、TR1与TF1,所以,在写程序时,容易搞混。当TMOD = 0x20,0x21,0x22时,TR1 = 1,开始串口通信,此时串口中断和T/C中断是并存的,一般做法是"ET1 = 0",禁止T1中断。2. T2 作为波特率发生器随着大规模集成电路的发展,8052系列增加了一个T/C2,从此也看出了,8051单片机在用T1作为波特率发生器的同时,拆分T0,以此来充当2个T/C用,是多么的落后。图1 T2在捕获模式下的逻辑图图2 T2在自动重载模式下的逻辑图图3 T2在波特率模式下的逻辑图T2的三种模式通过上面两图可以清楚的看出其工作原理。由于8052单片机增加了功能强大的T/

4、C2,那么我们在串口通信时,可以选择T2作为波特率发生器。3. 波特率的计算串口工作方式及对应的公式(formula)如下方式0: baud rate = f/12。方式2:baud rate = (2SMOD/64)*f方式1或3:T1 -> baud rate = (2SMOD/32) * f/12*(2n-x)T2 -> baud rate = f/32*65536-(RCAP2H,RCAP2L)常用波特率初值12M oscillator(1%误差以内)Baud rateT1(不倍频)T1(倍频)T21200E6CCFEC82400F3E6FF644800F3FFB29600

5、FFD911.0592M oscillator(无误差)Baud rateT1(不倍频)T1(倍频)T21200E8D0FEE02400F4E8FF704800FAF4FFB89600FDFAFFDC4. 程序实例以下两例分别为T1 T2作为波特率发生器时的设置函数:/Description: 12M oscillator,Baud rate = 1200/Author:/Date:09-9-17void uart_init (void)/*串口方式:8位UART,不启用多机通信,波特率不加倍*/SCON = 0x50;PCON = 0;/* T1作为波特率发生器计数源:T(内部晶振)方式2:

6、auto reload /gate=0: tr1*/TMOD = 0X22;TL1 = 0xE6;TH1 = 0xE6;TR1 = 1;/*允许serial port中断,禁止T1中断*/IE = 0X90;/Description: 12M oscillator,Baud rate = 1200/Author:/Date:09-9-17void uart_init (void)/*串口方式:8位UART,不启用多机通信,波特率不加倍*/SCON = 0x50;PCON = 0;/* T2作为波特率发生器计数源:T(内部晶振)Baud rate mode*/TH2 = 0XFE;TL2 = 0

7、XC8;RCAP2H = 0XFE;RCAP2L = 0XC8;T2CON = 0X34;/*允许serial port中断,禁止T2中断*/IE = 0X90;下面两例分别为串口接收和发送多个字节的程序,其中接收采用中断形式,发送采用查询方式。注意:在每发送完一个字节,程序都会进进入中断一次。/串口接收Unsigned char array10,* p = array;void uart_service() interrupt 4if(RI)*p+ = SBUF;RI = 0;/串口发送单个字节void sys_byte(unsigned char temp)/select = 0;/485发送时,75LBC184的发送接受选择口SBUF = temp;while(TI = 0);TI = 0;/select = 1;/串口发送多个字节void sys_bytes(unsigned char * temp,un

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论