tag 标签: 波特率

相关帖子
相关博文
  • 热度 3
    2024-4-9 10:17
    308 次阅读|
    0 个评论
    工作中我们经常碰到这几个概念,由于这几个概念意思很接近,给我们带来很大的困惑,有时还把他们搞混,今天我们就来谈谈这几个概念,希望对大家理解他们能有所帮助。 在讲述这几个概念之前,我们先看看信号一般是如何在信道上传输的。 如上图所述,虽然我们只想传输bit0~bit7,但由于通信机制的限制,我们必须在bit0之前加上start bit或者起始帧,在bit7之后加上stop bit或者结束帧,以及其他冗余部分。以上图来做参考,我们看看上述概念都是如何定义的。 波特率(Baud or Baud rate),单位bps (bits per second)或者baud本身就是单位,即1baud = 1bps,波特率就是图中的t1,表示一秒钟最多可以传输多少个符号(码元)。 Symbol rate(符号速率,或者传码率,或者码元传输速率),单位sps(symbol per second),symbol rate就等于波特率,即符号速率(传码率)也对应图中的t1。 比特率(bit rate),单位bps( bits per second),比特率跟符号速率(传码率)意思很接近,像图中情况,你可以认为比特率=符号速率,因为图中一个符号表示一个比特。但有很多系统,一个符号可以表示多个bit,比如4PSK(QPSK),一个符号表示2个比特,因此比特率=2*符号速率。也有很多系统,多个符号表示一个bit,比如BLE coded PHY,8个符号表示一个bit,这个时候,比特率=符号速率/8。有时候,比特率也可以用来表示有效bit速率,比如上图,整个t2时间实际只传输了8bit数据(另外2bit数据属于无效数据),因此你可以认为bit rate = 8/10 symbol rate。 数据速率(data rate),单位bps( bits per second),data rate的具体内涵要看语境,有时候data rate = symbol rate,有时候data rate = bit rate。 吞吐率(data throughput),单位bps或者Bps(bits/bytes per second),吞吐率度量的是一个比较长的时间,是用户实际感受的最大“速度”,就如上图中的t3,把t3时间传输的全部有效字节除以t3,就是吞吐率。计算吞吐率时,不仅要扣除像start bit/stop bit这种冗余bits,还要扣除字节与字节之间的延时时间,以及块与块之间的延时时间,等等,因此吞吐率比数据速率要“慢”得多。 带宽(bandwidth),带宽有多重内涵,在计算机和网络领域,带宽基本等价于吞吐率,单位为bps或者Bps(bits/bytes per second),请参考上面“吞吐率”说明。在信号处理/射频/微电子学领域,带宽就是两个极限频率之差,如下图所示,B就是带宽。 极限频率之差,这才是带宽的本意,而吞吐率可以说是带宽的延伸义,为什么带宽可以延伸为“吞吐率”的意思?这个是由奈奎斯特(Nyquist)定理而来的,1924年,奈奎斯特推导出有限带宽无噪声信道的极限传码率,称为奈奎斯特定理。若信道带宽为W(单位Hz),则奈奎斯特定理的最大码元速率B(单位:sps或者baud)为: B = 2 W 从上述公式可知,带宽直接决定了信道的最高传码率,因此用带宽来表示吞吐率也就在情理之中了。 注:奈奎斯特定理其实就是香农采样定理的另一种表述,两者是等价的。 来源:nordicsemi
  • 热度 10
    2023-6-29 10:08
    803 次阅读|
    0 个评论
    前言 实现延时通常有两种方法:一种是硬件延时,要用到定时器 / 计数器,这种方法可以提高 CPU 的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 01 使用定时器 / 计数器实现精确延时 单片机系统一般常选用 11.0592MHz 、 12 MHz 或 6MHz 晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为 1 μ s 和 2 μ s ,便于精确延时。本程序中假设使用频率为 12MHz 的晶振。 最长的延时时间可达 216=65536 μ s 。若定时器工作在方式 2 ,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用 2 个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器 / 计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。 但应该注意, C51 编写的中断服务程序编译后会自动加上 PUSH ACC 、 PUSH PSW 、 POP PSW 和 POP ACC 语句,执行时占用了 4 个机器周期;如程序中还有计数值加 1 语句,则又会占用 1 个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。 02 软件延时与时间计算 在很多情况下,定时器 / 计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 短暂延时 可以在 C 文件中通过使用带 _NOP_( ) 语句的函数实现,定义一系列不同的延时函数,如 Delay10us( ) 、 Delay25us( ) 、 Delay40us( ) 等存放在一个自定义的 C 文件中,需要时在主程序中直接调用。如延时 10 μ s 的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( ) 函数中共用了 6 个 _NOP_( ) 语句,每个语句执行时间为 1 μ s 。主函数调用 Delay10us( ) 时,先执行一个 LCALL 指令 (2 μ s) ,然后执行 6 个 _NOP_( ) 语句 (6 μ s) ,最后执行了一个 RET 指令 (2 μ s) ,所以执行上述函数时共需要 10 μ s 。   可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用 ,以实现较长时间的延时;但需要注意,如在 Delay40us( ) 中直接调用 4 次 Delay10us( ) 函数,得到的延时时间将是 42 μ s ,而不是 40 μ s 。 这是因为执行 Delay40us( ) 时,先执行了一次 LCALL 指令 (2 μ s) ,然后开始执行第一个 Delay10us( ) ,执行完最后一个 Delay10us( ) 时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在 Delay80us( ) 中两次调用 Delay40us( ) ,则也要先执行一次 LCALL 指令 (2 μ s) ,然后执行两次 Delay40us( ) 函数 (84 μ s) ,所以,实际延时时间为 86 μ s 。简言之,只有最内层的函数执行 RET 指令。 该指令直接返回到上级函数或主函数。如在 Delay80 μ s( ) 中直接调用 8 次 Delay10us( ) ,此时的延时时间为 82 μ s 。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。 在 C51 中嵌套汇编程序段实现延时 在 C51 中通过预处理指令 #pragma asm 和 #pragma endasm 可以嵌套汇编语言语句。用户编写的汇编语言紧跟在 #pragma asm 之后,在 #pragma endasm 之前结束。 如: #pragma asm … 汇编语言程序段 … #pragma endasm 延时函数可设置入口参数,可将参数定义为 unsigned char 、 int 或 long 型。根据参数与返回值的传递规则,这时参数和函数返回值位于 R7 、 R7R6 、 R7R6R5 中。在应用时应注意以下几点: #pragma asm 、 #pragma endasm 不允许嵌套使用; 在程序的开头应加上预处理指令 #pragma asm ,在该指令之前只能有注释或其他预处理指令; 当使用 asm 语句时,编译系统并不输出目标模块,而只输出汇编源文件; asm 只能用小写字母,如果把 asm 写成大写,编译系统就把它作为普通变量; #pragma asm 、 #pragma endasm 和 asm 只能在函数内使用。 将汇编语言与 C51 结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。 使用示波器确定延时时间 利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个 I/O 口线如 P1.0 为高电平,在函数的最后清 P1.0 为低电平。在主程序中循环调用该延时函数,通过示波器测量 P1.0 引脚上的高电平时间即可确定延时函数的执行时间。方法如下: sbit T_point = P1^0; void Dly1ms(void) { unsigned int i,j; while (1) { T_point = 1; for(i=0;i<2;i++) { for(j=0;j<124;j++){;} } T_point = 0; for(i=0;i<1;i++) { for(j=0;j<124;j++){;} } } } void main (void) { Dly1ms(); } 把 P1.0 接入示波器,运行上面的程序,可以看到 P1.0 输出的波形为周期是 3ms 的方波。其中,高电平为 2ms ,低电平为 1ms ,即 for 循环结构“ for(j=0;j<124;j++) {;} ”的执行时间为 1ms 。通过改变循环次数,可得到不同时间的延时。当然,也可以不用 for 循环而用别的语句实现延时。这里讨论的只是确定延时的方法。 使用反汇编工具计算延时时间 用 Keil C51 中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用: for (i=0;i C:0x000FE4CLRA//1T C:0x0010FEMOVR6,A//1T C:0x0011EEMOVA,R6//1T C:0x0012C3CLRC//1T C:0x00139FSUBBA,DlyT //1T C:0x00145003JNCC:0019//2T C:0x00160E INCR6//1T C:0x001780F8SJMPC:0011//2T 可以看出, 0x000F ~ 0x0017 一共 8 条语句,分析语句可以发现并不是每条语句都执行 DlyT 次。核心循环只有 0x0011~0x0017 共 6 条语句,总共 8 个机器周期,第 1 次循环先执行“ CLR A ”和“ MOV R6 , A ”两条语句,需要 2 个机器周期,每循环 1 次需要 8 个机器周期,但最后 1 次循环需要 5 个机器周期。 DlyT 次核心循环语句消耗 (2+DlyT × 8+5) 个机器周期,当系统采用 12MHz 时,精度为 7 μ s 。 当采用 while (DlyT--) 循环体时, DlyT 的值存放在 R7 中。相对应的汇编代码如下: C:0x000FAE07MOVR6, R7//1T C:0x00111F DECR7//1T C:0x0012EE MOVA,R6//1T C:0x001370FAJNZC:000F//2T 循环语句执行的时间为 (DlyT+1) × 5 个机器周期,即这种循环结构的延时精度为 5 μ s 。 通过实验发现,如将 while (DlyT--) 改为 while (--DlyT) ,经过反汇编后得到如下代码: C:0x0014DFFE DJNZR7,C:0014//2T 可以看出,这时代码只有 1 句,共占用 2 个机器周期,精度达到 2 μ s ,循环体耗时 DlyT × 2 个机器周期;但这时应该注意, DlyT 初始值不能为 0 。 注意:计算时间时还应加上函数调用和函数返回各 2 个机器周期时间。 举例程序段落 系统频率: 6MHz Delay: MOV R5,#25 ; 5ms 延时 —— MOV 指令占用 1 机器周期时间 Delay1: MOV R6,#200 ; 200ms 延时 Delay2: MOV R7,#166 ; 1ms 延时常数 Delay3: NOP ;空指令,什么都不做,停留 1 机器周期时间 DJNZ R7,Delay3 ; R7 减 1 赋值给 R7 ,如果此时 R7 不等于零,转到 Delay3 执行。—— 2 机器周期时间 DJNZ R6,Delay2 DJNZ R5,Delay1 解析如下: 首先计算机器周期 T=12*1/f=2 μ s 。 注意 DJNZ R7,Delay3 每执行 1 次需要占用 NOP 的时间和 DJNZ 本身的时间共 3 个机器周期。 6 μ s 。那么 1ms 的时间需要 1ms*1000/6 μ s=166.67 ,取 166 。 注意 DJNZ R6,Delay2 是在 166 次循环后执行 1 次的 ( 时间为 MOV 机器周期 + 本身机器周期, 3*2=6 μ s) ,直到 166*200 次后, R6=0 ,才执行 DJNZ R5,Delay1 。 DJNZ R5,Delay1 是在 R5 不为 0 的时候循环回去。时间也为 6 μ s 。 时间总计: 166*200*25*6 μ s+200*25*6 μ s+25*6 μ s=5010150 μ s ,合计 5.01015ms( 编程的人都遇到过类似的潜逃循环,此程序忽略了执行 MOV 的时间,只计算了循环所用时间,即 166*200*25*6/1000000=4.98ms ,近似 5ms) 。 程序改进:去掉 NOP 命令,整数化 1ms 需要的延时常数。 Delay: MOV R5,#25 ; 5ms 延时 —— MOV 指令占用 1 机器周期时间 Delay1: MOV R6,#200 ; 200ms 延时 Delay2: MOV R7,#250 ; 1ms 延时常数 Delay3: ;NOP ;空指令,什么都不做,停留 1 机器周期时间 DJNZ R7,Delay3 ; R7 减 1 赋值给 R7, 如果此时 R7 不等于零,转到 Delay3 执行。—— 2 机器周期时间 DJNZ R6,Delay2 DJNZ R5,Delay1 此时时间总计: 250*200*25*4 μ s+200*25*6 μ s+25*6 μ s=5030150 μ s 。时间占用误差反而比未改进的时候大,可修正,将 R7-30150/(25*200*4)=248( 因为 R7=250 循环 1 次占用 2 个机器周期, 4 μ s ,计算等于 R7-1.5075, 将时间减小到小于 5ms ,剩余时间另补,取 248) 。则: 时间总计: 248*200*25*4 μ s+200*25*6 μ s+25*6 μ s=4990150 μ s , 需要补: 5000000-4990150=9850 μ s , 9850/2=4925 机器周期。 补一个 MOV R4,#200 , 4 个 NOP ,还需 4920 机器周期,将其约分,得到 24*205=4920 。 如何建立函数根据实际代码调整,如下: Delay: MOV R5,#25 ; 5ms 延时 —— MOV 指令占用 1 机器周期时间 Delay1: MOV R6,#200 ; 200ms 延时 Delay2: MOV R7,#250 ; 1ms 延时常数 Delay3: ;NOP ;空指令,什么都不做,停留 1 机器周期时间 DJNZ R7,Delay3 ; R7 减 1 赋值给 R7, 如果此时 R7 不等于零,转到 Delay3 执行。—— 2 机器周期时间 DJNZ R6,Delay2 DJNZ R5,Delay1 NOP NOP NOP NOP MOV R3,#6 Delayadd: MOV R4,#205 MOV R2,#0H DJNZ R3,Delayadd 解析 205*24 调整为 205*6 —— 这是因为 Delay 循环为 4 机器周期代码,因此将 24/4=6 。 请计算: 205*6*4=4920;4920+5=4925 。时间补充正好。 此时时间计算: 248*200*25*4 μ s+200*25*6 μ s+25*6 μ s=4990150 μ s+4925*2 μ s=5000000 μ s 合计 5ms 。 理论上 1 μ s 都不差 ( 仅为科学探讨,具体晶振频率的误差多大作者并不明确 ) 。 关注公众号“优特美尔商城”,获取更多电子元器件知识、电路讲解、型号资料、电子资讯,欢迎留言讨论。
  • 热度 8
    2023-5-23 11:46
    1081 次阅读|
    0 个评论
    比特率?波特率?频谱带宽?1分钟搞清!
    我们常说的千兆宽带、 100G 光网络,兆和 G 是指什么呢? 没错!是比特率( Bit Rate )!聪明的你已经答对啦!与比特率类似的还有波特率、频谱带宽。 但是比特率、波特率与频谱带宽关系,你知道多少? 别着急,下面文档君为你解密图片。 PART.01 什么是比特率和波特率? 宽带网络里面提及的千兆即 1000Mbit/s ,一般描述的是我们家网络端口每秒最大可接收 0 、 1 比特( bit )的数量,即每秒可接收 1000x106 个比特。显而易见,比特率越高,每秒传送的比特数量就越多。比特数量多,意味着单位时间获取的信息就多,网速自然就越快。 总的来说,比特率是每秒钟传送的比特数量,又称为传信率。比特率基本单位为 bit/s 或 bps ,全称为 bit per second 。如果每秒钟内传送的比特数量较多,比特率单位可换算为 Kbit/s 、 Mbit/s 、 Gbit/s 。此处的 K 、 M 、 G 分别代表 1000 ( 103 )、 1000000 ( 106 )、 1000000000 ( 109 )。 与比特率非常容易混淆的是波特率。 波特率定义是:每秒钟传送的符号(码元)数量,又称为传码率,单位是波特( Baud 、 B ,即 symbol/s )。在通信系统中,携带数据信息的信号单元称为码元,也称为符号( symbol )。 实际上波特( Baud )已经是表示速率了,可别把波特率翻译成 Baud Rate ,用 Baud 表示即可, Rate 是多余的。但是,中文已习惯叫波特率,所以还是用“波特率”的称呼表示“波特”。 我们举一个生活的例子,加深一下对这两个概念的理解。 通信系统有点像我们的公共交通运输系统。我们可以把通信系统中码元类比为公共交通车辆,例如公交车、地铁、的士 ……。通信系统所传输的比特数量类比为出行的人,则比特率为出行人口流动速度,波特率就是发车率。 PART.02 比特率和波特率是什么关系呢? 要讨论比特率与波特率的关系,需要先了解码元与比特的关系。就像刚才的例子中提及的公交车、地铁、的士可以搭乘不同数量的出行人员一样,不同码元也可以用不同位数的比特表示。码元所需要的比特位数,由码元支持的状态数量确定。 下面是 2 、 4 、 8 种状态的码元与比特位数关系表: 码元类型 码元状态 码元状态总数量 码元所需比特位数 2 种状态的码元 0 、 1 2 1 4 种状态的码元 00 、 01 、 10 、 11 4 2 8 种状态的码元 000 、 001 、 010 、 011 、 100 、 101 、 110 、 111 8 3 由此可得出,假设码元状态为 N ,则此码元所需要的比特位数如下: 画图表示码元、比特的传输关系如下: 从图很容易推出,已知波特率 Rs 、码元状态总数量 N 后,对应比特率 Rb 关系如下: 如果已知的是比特率 Rb 、码元状态总数量 N ,则对应波特率 Rs 关系如下: 上述比特率与波特率公式仅是考虑信息净荷,不考虑信号调制、也不考虑纠错编码等其它因素的公式。 当考虑码元多路传输时,比特率与波特率的关系会变成怎么样了呢? 例如我们采用偏振多路复用( PDM , Polarization Division Multiplexing )方式调制待传输的码元,则可以实现同时双路传输,使得信号的比特率提升了一倍。 偏振即利用光的偏振维度,在同一波长信道中,通过光的两个相互正交偏振态,同时传输两路独立数据信息,等于实现了双通道传输,因此可使得信号的比特率提升了一倍。 显然加入多路复用技术后,比特率 Rb 和波特率 Rs 关系变为: 当再考虑信息纠错编码时,比特率与波特率的关系又会变成怎么样了呢? 加上信息纠错编码等因素,则实际比特率也会根据纠错编码开销的比率增加。例如在 200G 光网络系统中,采用 16QAM 调制方法,编码纠错方法采用编码开销为 20% 的 SD-FEC ,波特率为 32GB ,图片,实际比特率为 258.48Gbit/s 。 PART.03 比特率、波特率、频谱带宽是什么关系呢? 频谱带宽其实是通信信号的最高频率与最低频率的差值。信号的波特率越高,在通信信道中传输此信号时,占用的通信信道频谱带宽就越大。就好比,在运输系统中,车型越大,行车占用的道路宽度就越大。 受硬件芯片处理速度的限制,为提升比特率,可通过提升波特率以及单个码元比特位数,进而提升比特率。此外,通信系统还要求设备芯片波特率 ≥信号波特率 ,通常芯片波特率有 45GB 、 69GB 、 96GB 、 128GB 。如果所设计的信号波特率大于设备芯片波特率,则说明此信号是无法实现的,因为没芯片可以支持此信号的产生。 同时根据香农定理和经验,信号所需的频谱宽度数值应大于信号波特率的 1.2 倍,才能保证信号可以被高质量传输。在不考虑其它影响传输的因素,我们可以根据香农定理和经验,粗略算出波特率与所需频谱带宽的关系。 例如:某 200G 光网络中,采用 27% 的 FEC 和 8QAM 调制技术,信号比特率约为 219Gbit/s ,则信号波特率和频率关系如下: 加上余量考虑,此时,推荐采用 62.5GHz 的频谱带宽,而不是 50GHz 的频谱带宽传输信号。 PART.04 总结 今天,文档君又和大家一起学到了知识: 比特率、波特率、频谱带宽是通信系统中的重要指标。 波特率越高,比特率越高,所占用的信道频谱带宽也越大。 关注公众号“优特美尔商城”,获取更多电子元器件知识、电路讲解、型号资料、电子资讯,欢迎留言讨论。
  • 热度 33
    2013-11-5 14:46
    7977 次阅读|
    9 个评论
    通常情况下MCU都提供了多种不同的时钟源以及多种不同的时钟分频系数,以让用户应用系统能工作在多种时钟速率下,同样也是为了让MCU的各种外设能有一个适合的时钟工作,如定时器如果时钟设置的过高会造成定时时间短,其它通信外设如UART,SPI,I2C则会因高时钟速度加快通信速度。在这种多种时钟选择的情况下就可能对串口波特率设置造成过大的误差而引起串口通信错误。 今天就遇到这样的一个问题,就是让C8051F9x系列单片机工作在24.5MHz的主频下,串口波特率为115200时串口始终通信有误码,而baudrate=9600时则又正常。这就是串口波特率误差过大引起的。正常情况下串口波特率误差不应该超过+/-2%-3%,如超过这个值就会出现串口通信不正常问题。 C8051串口波特率公式计算如下: UartBaudRate = T1_Overflow_Rate                 T1_Overflow_Rate = Timer1_clk / (256-TH1) 1.现主频为24.5MHz,12分频后作为Timer1时钟源,理想波特率为115200,则算得TH1=0xF8,经过将TH1代入上式中求得际UartBaudRate=127604,则误差率为(127604-115200)/115200=10.8%,远远超过了2%-3%的极限值。 2.主频为24.5MHz,12分频作Timer1时钟源,理想波特率为9600,则算得TH1=0x96,将TH1反代入上式求得实际UartBaudRate=9630,则误差率为(9630-9600)/9600=0.3%,远远小于2%-3%的范围。 这就是为什么将波特率设为115200后串口始终不能正常进行通信的原因了!! 所以说当我们想根据不同的时钟来设不同的波特率后在程序中一定要进行反代入一下将MCU自己将实际波特率求出来进行比较如果误差率超过2%-3%,则利用C和编译器中的报错机制将错误情况进行提示,免得出了问题后,自己查看所有程序,发现没什么问题呀!其它就是一个小问题隐藏起来了。  
  • 热度 17
    2012-5-24 09:38
    1049 次阅读|
    0 个评论
    http://forum.eet-cn.com/BLOG_ARTICLE_12453.HTM 大家好, 我们昨天为大家分享了如何实现W7100A中的UART。今天继续为大家分享第二部分,明天将会继续为大家分享最后一部分。 如何实现W7100A中的UART第一部分请参考: http://forum.eet-cn.com/BLOG_ARTICLE_12453.HTM   4.  2, 9位UART, 固定波特率   void Init_iMCU(void) { SCON = 0x90;        // 串行模式2, SM00 = 1, SM01 = 0, REN=1 PCON = 0x7F;          // f osc /64(SMOD = 0), f osc /32(SMOD = 1) } void PutByte(unsigned char byData) {        SBUF = byData;     // 向串行缓存器中写入数据        while(!TI);         // 等待所有的数据记录完成        TI = 0;             // 清除传输中断 }   unsigned char GetByte(void)    {        unsigned char byData;      // 等待数据接收        while(!RI);        RI = 0;                  //清除RI        byData = SBUF;                  //读取数据        return byData; }   void main() {       Init_iMCU();                      //调用Init_iMCU函数       while(1)  PutByte(GetByte());     //回送(Echo-back)接收到的数据 } 波特率的UART模式2是固定内部时钟的fosc/32或fosc/64。具体选择f osc /32还是f osc /64 要根据SMOD0的位来确定。考虑到W7100A的内部时钟,产生的高速波特率时钟的范围为2.7 ~ 1.4MHz。如同模式0的情况,一般不使用模式3,因为波特率是固定的且时钟频率过快。 在这些示例程序中,将SCON寄存器设定为0x90。为了设置波特率,还要设置SMOD0, PCON寄存器的最高位(波特率 = f osc /32)。其它实现输出信息的代码也和第2章中介绍的接收过程的程序类似。 5.  3, 9位UART, 可变波特率 5.1 定时器1(timer 1)时钟源   void Init_iMCU(void) { SCON = 0xD0;              // 串行模式3, SM00 = 1, SM01 =1, REN=1 TMOD |= 0x20;          // 定时器1(Timer1)模式2 PCON |= 0x80;          // SMOD0 = 1 TL1 = 0xFC;            // 波特率115200bps TH1 = 0xFC;            //请参考W7100A数据手册 TR1 = 1;                // 启动定时器1(Timer1) } void PutByte(unsigned char byData) {        SBUF = byData;     // 向串行缓存器中写入数据        while(!TI);         // 等待数据记录完成        TI = 0;             // 清除传输中断 }   unsigned char GetByte(void)    {        unsigned char byData;      //等待数据接收        while(!RI);        RI = 0;                  //清除RI        byData = SBUF;          // 读取数据        return byData; }   void main() {       Init_iMCU();                      //调用Init_iMCU函数       while(1)  PutByte(GetByte());     //回送(Echo-back)接收到的数据 } UART在模式3下,可以交换使用定时器1(Timer1)和定时器2(Timer2)来设定波特率的值。在这一章节,我们使用定时器1(Timer1)来设置波特率的值, 信息请参考W7100A数据手册。与模式1不同的是,停止位之前多了1位。这一增加位可以用作奇偶校验或者多重处理器通信, 详情请参考W7100A数据手册。 在示例程序中,将SCON寄存器设置为0xD0,定时器1(Timer1)工作在模式2下。为了能设置波特率,需要设置PCON寄存器的SMOD位,同时TH1寄存器的值设为0xFC。这样设置完成后,波特率的值为115200bps。其它实现输出信息的代码也和第2章中介绍的接收过程的程序类似。 5.2 定时器2(timer 2)时钟源   void Init_iMCU(void) { SCON = 0xD0;           // 串行模式3, SM00 = 1, SM01 =1, REN=1 T2CON = 0x30;          //定时器2(Timer2)波特率发生器模式 TH2 = 0xFF;             //波特率设定为115200bps TL2 = 0xE8;             // 请参考W7100A数据手册         RLDH = 0xFF;           // 波特率重载值设为115200bps RLDL = 0xE8;            // 波特率重载值设为115200bps TR2 = 1;                // 启动定时器2(Timer2) }   void PutByte(unsigned char byData) {        SBUF = byData;     // 向串行缓存器中写入数据        while(!TI);         // 等待数据记录完成        TI = 0;             // 清除传输中断 }   unsigned char GetByte(void)    {        unsigned char byData;      //等待数据接收        while(!RI);        RI = 0;                     //清除RI        byData = SBUF;           //读取数据        return byData; }   void main() {         Init_iMCU();                      //调用Init_iMCU函数         while(1)  PutByte(GetByte());     //回送(Echo-back)接收到的数据 } UART在模式3可以交换使用定时器1(Timer1)和定时器2(Timer2)来设置波特率。在这一章节,利用定时器2(Timer2)来设置波特率。更多的详细信息请参考W7100A数据手册。与模式1不同的是,在停止位之前多了1位,此位可以用于奇偶校验或者多重处理器通信。具体的细节可以参考W7100A数据手册。 在上面的程序中,将SCON寄存器设为0xD0,定时器2(Timer2)设定为波特率发生器模式。为了能够设定波特率,还需要将TH2和TL2的值分别设为0xFF和0xE8。都设置完成后,波特率的值就变成115200bps。重载值RLDH和RLDL也必须相应的设置为0xFF和0xE8。其它实现输出信息的代码也和第2章中介绍的接收过程的程序类似。
相关资源
  • 所需E币: 1
    时间: 2023-4-1 17:48
    大小: 140.85KB
    上传者: 张红川
    一种变波特率方式的单片机ISP设计.pdf
  • 所需E币: 0
    时间: 2022-8-10 23:50
    大小: 179.08KB
    上传者: samewell
    51波特率初值设定.rar
  • 所需E币: 0
    时间: 2022-3-10 21:05
    大小: 214.62KB
    上传者: samewell
    单片机辅助工具软件-51波特率初值设定.zip
  • 所需E币: 0
    时间: 2021-4-17 23:25
    大小: 178.37KB
    上传者: LGWU1995
    常用辅助开发软件_波特率初值设定
  • 所需E币: 0
    时间: 2021-3-14 10:33
    大小: 185.57KB
    上传者: czd886
    软件实现单片机串行通讯波特率的自动解调
  • 所需E币: 0
    时间: 2021-3-8 19:44
    大小: 359.93KB
    上传者: czd886
    STC单片机UART通信波特率误差容忍范围研究
  • 所需E币: 0
    时间: 2020-12-25 17:11
    大小: 1.6MB
    上传者: czd886
    基于FPGA的波特率连续可调的UART接口设计
  • 所需E币: 1
    时间: 2020-12-20 23:29
    大小: 170.38KB
    上传者: zendy_731593397
    设定80C51串行异步通讯的波特率
  • 所需E币: 1
    时间: 2020-9-3 12:46
    大小: 28.68KB
    上传者: symic
    AVR自适应波特率rar
  • 所需E币: 1
    时间: 2020-5-25 15:24
    大小: 34.67KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 3
    时间: 2019-12-26 01:38
    大小: 32KB
    上传者: 二不过三
    单片机定时器波特率设置……
  • 所需E币: 5
    时间: 2019-12-26 01:39
    大小: 8.59KB
    上传者: 二不过三
    计算51单片机波特率程序……
  • 所需E币: 3
    时间: 2019-12-26 01:39
    大小: 8.59KB
    上传者: quw431979_163.com
    计算MCS51单片机波特率的小程序……
  • 所需E币: 5
    时间: 2019-12-25 21:12
    大小: 17.5KB
    上传者: 二不过三
    现在有许多极好的编译程序能显示代码,在速度和尺寸两方面都是非凡有效的。现代的编绎器非常适应寄存器和变量的使用方面,比手动编译有较好的优越性,甚至在其它常规方面,所以C应是看代码方面最合适的。……
  • 所需E币: 4
    时间: 2019-12-25 21:01
    大小: 231.2KB
    上传者: 16245458_qq.com
    自动检测80C51串行通讯中的波特率……
  • 所需E币: 4
    时间: 2019-12-25 16:12
    大小: 26.85KB
    上传者: 2iot
    用FPGA器件实现UART核心功能的一种方法……
  • 所需E币: 4
    时间: 2019-12-25 16:04
    大小: 112.5KB
    上传者: quw431979_163.com
    51串口基本知识MCS-51单片机的串行口MCS-51串行口具有两条独立的数据线:发送端TXD、接收端RXD,允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输出,接收数据由RXD端输入。一、串行口的控制寄存器MCS-51单片机串行口是由缓冲器SBUF、移位寄存器、串行口控制寄存器SCON、电源控制寄存器PCON及波特率发生器T1组成。1.串行口数据缓冲器SBUFMCS-51单片机内的串行接口部分,具有两个物理上独立的缓冲器:发送缓冲器和接收缓冲器,以便能以全双工的方式进行通信。串行口的接收由移位寄存器和接收缓冲器构成双缓冲结构,能避免在接收数据过程中出现帧重叠。发送时因为CPU是主动的,不会发生帧重叠错误,所以发送结构是单缓冲的。在逻辑上,串行口的缓冲器只有一个,它既表示接收缓冲器,也表示发送缓冲器。两者共用一个寄存器名SBUF,共用一个地址99H。即:在完成串行口初始化后,发送数据时,采用MOVSBUF,A指令,将要发送的数据输入SBUF,则CPU自动启动和完成串行数据的输出;接收数据时,采用MOVA,SBUF指令,CPU就自动将接收到的数据从SBUF中读出。2.串行口控制寄存器SCON串行口控制寄存器SCON包含:串行口工作方式选择位、接收发送控制位、以及串行口状态标志位。其格式如下:|D7|D6|D5|D4|D3|D2|D1|D0||SM0|SM1|SM2|REN|TB8|RB8|TI|RI|①SM0SM1(SCON.7、SCON.6):串行口的工作方式选择位,其编码见表6-1。表6-1串行口的工作方式|SM0SM1……
  • 所需E币: 5
    时间: 2020-1-2 09:45
    大小: 175.44KB
    上传者: 二不过三
    自动检测80C51串行通讯中的波特率……
  • 所需E币: 4
    时间: 2019-12-25 10:22
    大小: 304.3KB
    上传者: 978461154_qq
    嵌入式系统——串行输入输出接口……
  • 所需E币: 3
    时间: 2019-12-24 23:33
    大小: 981.28KB
    上传者: 二不过三
    【技术应用笔记】ADuC703x系列LIN波特率计算AN-891应用笔记OneTechnologyWayP.O.Box9106Norwood,MA02062-9106,U.S.A.Tel:781.329.4700Fax:781.461.3113www.analog.comADuC703x系列LIN波特率计算作者:AudeRichard简介LIN帧报头本应用笔记旨在让用户熟悉用于ADI公司ADuC703x系标准LIN通信帧如图1所示,它分为如下部分:断开符号、列器件UART通信的除数值COMDIV0、COMDIV1和同步字节、受保护标识符、数据和校验和。COMDIV2的计算。本应用笔记假定用户熟悉本地互连网络(LIN)2.0规范。……