串口波特率与定时计数器的关系

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

串口波特率与定时计数器的关系在基于单片机的系统开发时,经常采用UART串口,在系统中元件之间,或系统与系统之间进行通信。然而在写过(抑或是生搬硬套)若干串口通信程序之后,却越来越迷惘于串口波特率的设定与T/C间的关系,本文就此问题加以思考并给予验证。1.T1作为波特率发生器在对TMOD进行设置时,若非特殊需要非常低的波特率,一般将T1的工作模式选为方式2:此时既省去了进入T1中断,利用软件重新设置TH1和TL1的不便,又保障了数据收发的正确性(因为晶振稳定)。此时问题来了,那么T0又该设置成什么方式呢?看下表:TMODTR1=?Communicate片内资源(8051)0x200不能通信T/C(1)1可以通信0x210不能通信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的TR1与TF1,所以,在写程序时,容易搞混。当TMOD=0x20,0x21,0x22时,TR1=1,开始串口通信,此时串口中断和T/C中断是并存的,一般做法是ET1=0,禁止T1中断。2.T2作为波特率发生器随着大规模集成电路的发展,8052系列增加了一个T/C2,从此也看出了,8051单片机在用T1作为波特率发生器的同时,拆分T0,以此来充当2个T/C用,是多么的落后。图1T2在捕获模式下的逻辑图图2T2在自动重载模式下的逻辑图图3T2在波特率模式下的逻辑图T2的三种模式通过上面两图可以清楚的看出其工作原理。由于8052单片机增加了功能强大的T/C2,那么我们在串口通信时,可以选择T2作为波特率发生器。3.波特率的计算串口工作方式及对应的公式(formula)如下方式0:baudrate=f/12。方式2:baudrate=(2SMOD/64)*f方式1或3:T1--baudrate=(2SMOD/32)*[f/[12*(2n-x)]]T2--baudrate=f/[32*[65536-(RCAP2H,RCAP2L)]]常用波特率初值12Moscillator(1%误差以内)BaudrateT1(不倍频)T1(倍频)T21200E6CCFEC82400F3E6FF644800F3FFB29600FFD911.0592Moscillator(无误差)BaudrateT1(不倍频)T1(倍频)T21200E8D0FEE02400F4E8FF704800FAF4FFB89600FDFAFFDC4.程序实例以下两例分别为T1T2作为波特率发生器时的设置函数://Deion:12Moscillator,Baudrate=1200//Author://Date:09-9-17voiduart_init(void){/*串口方式:8位UART,不启用多机通信,波特率不加倍*/SCON=0x50;PCON=0;/*T1作为波特率发生器计数源:T(内部晶振)方式2:autoreload//gate=0:tr1*/TMOD=0X22;TL1=0xE6;TH1=0xE6;TR1=1;/*允许serialport中断,禁止T1中断*/IE=0X90;}//Deion:12Moscillator,Baudrate=1200//Author://Date:09-9-17voiduart_init(void){/*串口方式:8位UART,不启用多机通信,波特率不加倍*/SCON=0x50;PCON=0;/*T2作为波特率发生器计数源:T(内部晶振)Baudratemode*/TH2=0XFE;TL2=0XC8;RCAP2H=0XFE;RCAP2L=0XC8;T2CON=0X34;/*允许serialport中断,禁止T2中断*/IE=0X90;}下面两例分别为串口接收和发送多个字节的程序,其中接收采用中断形式,发送采用查询方式。注意:在每发送完一个字节,程序都会进进入中断一次。//串口接收Unsignedchararray[10],*p=array;voiduart_service()interrupt4{if(RI){*p++=SBUF;RI=0;}}//串口发送单个字节voidsys_byte(unsignedchartemp){//select=0;//485发送时,75LBC184的发送接受选择口SBUF=temp;while(TI==0);TI=0;//select=1;}//串口发送多个字节voidsys_bytes(unsignedchar*temp,unsignedcharlength){//select=0;//485发送时,75LBC184的发送接受选择口while(length--){SBUF=*temp++;while(TI==0);TI=0;}//select=1;}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功