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

上传人:牧羊曲112 文档编号:4937295 上传时间:2023-05-24 格式:DOCX 页数:6 大小:197.43KB
返回 下载 相关 举报
串口波特率与定时计数器的关系.docx_第1页
第1页 / 共6页
串口波特率与定时计数器的关系.docx_第2页
第2页 / 共6页
串口波特率与定时计数器的关系.docx_第3页
第3页 / 共6页
串口波特率与定时计数器的关系.docx_第4页
第4页 / 共6页
串口波特率与定时计数器的关系.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《串口波特率与定时计数器的关系.docx》由会员分享,可在线阅读,更多相关《串口波特率与定时计数器的关系.docx(6页珍藏版)》请在三一办公上搜索。

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

2、不能通信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的T

3、R1与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/C2,那么我们在串口通

4、信时,可以选择T2作为波特率发生器。3. 波特率的计算串口工作方式及对应的公式(formula)如下方式 0: baud rate = f/12,方式 2: baud rate = (2oD/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(倍频)T21200E6CCFEC82400F3E6FF644800F3FFB29600FFD911.0592M osci

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

6、: tri*/TMOD = 0X22;TL1 = 0xE6;TH1 = 0xE6;TR1 = 1;/*允许serial port中断,禁止T1中断*/IE = 0X90;/Deion: 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 = 0XC8;RCAP2H = 0XFE;RCAP2

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号