在51单片机中波特率的计算方法
- 格式:doc
- 大小:77.00 KB
- 文档页数:4
STC单片机串口通信一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。
由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。
串口通信的工作原理请同学们参看教科书。
以下对串口通信中一些需要同学们注意的地方作一点说明:1、波特率选择波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。
MSC-51串行端口在四种工作模式下有不同的波特率计算方法。
其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。
在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1))其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;TH1——定时器的重载值。
在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。
这要根据系统的运作特点,确定通信的频率范围。
然后考虑通信时钟误差。
使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。
为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。
下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。
则TH1=256-62500/波特率根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。
列计数器重载值,通信误差如下表:因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
2、通信协议的使用通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
基于51单⽚机串⼝波特率⾃适应⽅法 在单⽚机中,UART是常⽤的通信⽅式。
最近在研究Bootloader需要设置UART的波特率⾃适应,通过查阅资料参考了⽹友的⽅法,故借此分享我的⽅法。
⼀般的,串⼝⾃适应波特率有以下2种⽅法。
⼀是通过具有独⽴的同步字符。
使⽤串⾏通讯前,要先进⾏同步操作,即接收端通过对⽐接收到的字符与同步字符的差异调整波特率,或者通过定时器测量同步字符的位宽计算波特率。
即将串⼝接收IO电平状态进⾏定时器计时,计算出最⼩脉宽时长,即⼀帧时长,就可算出其波特率值,这种⽅式需要特定的同步字符(如:0x55、0xAA等)或者增加检测的周期。
⼆是不需要独⽴的同步字符。
即不管波特率如何,可以直接通讯。
通讯命令前导字符固定,⽐如⼀些短消息模块使⽤AT指令集,每条指令都是以AT开始的,这样虽然是命令但是有同步的作⽤,不过要求必须在真实命令到来前调整波特率,这种⽅式需要的时间周期长,因为单⽚机需要不断调整波特率去接收判断传输的字符直到通讯成功,且判断必须快速准确。
由于⽅便需要,以下实验采⽤的是⽅法⼀,使⽤单⽚机SC95F8617作为串⼝实验对象。
实验条件:内部定时器⼀个。
实验⽅法:通过定时器,连续检测UART输⼊引脚RXD上的电平变化,得到RXD上最⼩的脉宽时长计算出波特率,以达到波特率⾃适应。
参考代码如下,最后返回的就是波特率数值,其中发送的同步字符为0x55:1#define SystemClock 32000000 //HRC=32MHz2#define UART_TX P21 //TX⼝3#define UART_RX P20 //RX⼝4#define UART_TX_INIT {P2CON &= ~(1<<1);P2PH |= (1<<1);} //TX设为输⼊上拉模式5#define UART_RX_INIT {P2CON &= ~(1<<0);P2PH |= (1<<0);} //RX设为输⼊上拉模式67//波特率⾃适应8//需要⽤到读IO电平9//通过检测到最⼩的脉宽时间10 unsigned long UART_Baud_Adapt(void)11 {12 unsigned long baudrate =0;13 unsigned long t1=0,t2,t=0;14 unsigned long oldLevel,newLevel;15 unsigned char i=0;16 UART_RX_INIT; //RX设为输⼊模式1718 oldLevel = UART_RX; //读取⼀次RX的电平19while(UART_RX == 1); //等待RX被拉低20 Timer0_Open();21 Timer0_Enable();22for(i=0;i<8;) //连续检测8次电平变化,检测1个字节23 {24 newLevel = UART_RX; // 读RX的电平25if(newLevel != oldLevel) // 如果有电平变化26 {27 t2 = (unsigned long)(TH0<<8)+TL0; // 读定时器中的值28 oldLevel = newLevel; // 更新为新的引脚值29if((t1 == 0)&&(t == 0)) // 第⼀个电平变化30 {31 t1 = t2; // 记录第⼀个时刻点32 }33else// 不是第⼀个电平变化34 {35if(t == 0) // 第⼀段电平36 {37 t = t2-t1; // 记录第⼀段电平所⽤时间38 }39else// 不是第⼀段电平40 {41if((t2-t1)< t)42 {43 t = t2-t1; // 保留电平脉宽的最⼩值44 }45 }46 t1 = t2; // 更新为新的时刻点47 }48 i++; // 电平变化数+149 }50 }51 Timer0_Close();52 baudrate = (unsigned long)(t*403/400); //计算时间53 baudrate = SystemClock/baudrate; //计算波特率54return baudrate;55 }56//Timer0设置57void Timer0_Open(void)58 {59 TMCON = 0X07; //不分频60 TMOD |= 0x01; //0000 0001;Timer0设置⼯作⽅式161 TH0=TL0=0;62 }63//使能Timer064void Timer0_Enable(void)65 {66 ET0 = 1; //定时器0允许67 TR0 = 1; //打开定时器068 }69//关闭Timer070void Timer0_Close(void)71 {72 ET0 = 0; //定时器0关闭73 TR0 = 0; //关闭定时器074 } 通过实际测试多个波特率,结果如下:波特率⾃适应实验对⽐发送同步字符波特率(bps)⾃适应⽅法计算得到的波特率(bps)480047649600958919200194173840038787115200122605256000240601 从上⾯测试数据可以看到这种⽅法计算出的低速波特率还是⽐较接近的,系统时钟越快,理论上计算出来的数据越接近。
第6章单片机串行通信系统习题解答一、填空题1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。
2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。
3.SCON中的REN=1表示允许接收。
4.PCON 中的SMOD=1表示波特率翻倍。
5.SCON中的TI=1表示串行口发送中断请求。
6.MCS-51单片机串行通信时,先发送低位,后发送高位。
7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。
8.设T1工作于定时方式2,作波特率发生器,时钟频率为11.0592MHz,SMOD=0,波特率为2.4K时,T1的初值为 FAH 。
9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。
10.MCS-51单片机串行方式0通信时,数据从 P3.0 引脚发送/接收。
二、简答题1.串行口设有几个控制寄存器?它们的作用是什么?答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。
其中PCON 中只有PCON.7的SMOD与串行口的波特率有关。
在SCON中各位的作用见下表:2.MCS-51单片机串行口有几种工作方式?各自的特点是什么?答:有4种工作方式。
各自的特点为:3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值? 答:串行口各种工作方式的波特率设置:工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。
工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。
当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64计算定时器的初值计算:4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少?并进行初始化编程。
一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。
由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。
串口通信的工作原理请同学们参看教科书。
以下对串口通信中一些需要同学们注意的地方作一点说明:1、波特率选择波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。
MSC-51串行端口在四种工作模式下有不同的波特率计算方法。
其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。
在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1))其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;TH1——定时器的重载值。
在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。
这要根据系统的运作特点,确定通信的频率范围。
然后考虑通信时钟误差。
使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。
为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。
下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。
则TH1=256-62500/波特率根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。
列计数器重载值,通信误差如下表:因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
2、通信协议的使用通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。
stc c51 串口通信协议常用校验计算以及一些常用方法一、引言随着现代通信技术的快速发展,串口通信在各领域得到了广泛应用。
STC C51 作为一种高性能、低功耗的单片机,其串口通信协议在实际工程中具有很高的实用价值。
本文将详细介绍STC C51 串口通信协议的常用校验计算方法及其实现,以期为相关领域的研究和应用提供参考。
二、STC C51 串口通信协议简介1.串口通信的基本原理串口通信是通过传输线将数据位按照位顺序依次传输的一种通信方式。
在数据传输过程中,通常采用异步串行通信和同步串行通信两种方式。
2.STC C51 串口通信的特点STC C51 单片机内部集成了异步串行通信模块,具有以下特点:(1)高速率:最高可达1Mbps;(2)低功耗:待机模式下电流小于1uA;(3)丰富的波特率选择:支持0-115200bps等多种波特率;(4)灵活的通信模式:支持多机通信、广播通信等;(5)内置硬件滤波器:可滤除噪声干扰,提高通信可靠性。
三、常用校验计算方法1.奇偶校验奇偶校验是一种简单而有效的校验方法。
在数据传输过程中,根据数据位中1的个数是否为奇数来判断数据是否正确。
若数据位中1的个数为奇数,则为奇校验;若为偶数,则为偶校验。
2.循环冗余校验(CRC)循环冗余校验是一种基于二进制多项式的校验方法。
发送方和接收方使用相同的生成多项式,对数据位进行异或操作,得到校验位。
接收方在接收到数据后,同样对数据位进行异或操作,若结果与接收到的校验位相同,则数据正确;否则,数据错误。
3.异或校验异或校验是一种基于异或运算的校验方法。
在数据传输过程中,发送方和接收方约定一个校验位,并对数据位进行异或操作。
接收方在接收到数据后,对数据位进行异或操作,若结果与接收到的校验位相同,则数据正确;否则,数据错误。
四、STC C51 串口通信协议的实现1.硬件配置为实现STC C51 串口通信,需要配置以下硬件:(1)串口通信模块:UART0、UART1 或UART2;(2)波特率发生器:用于产生不同的波特率;(3)电平转换器:用于匹配发送和接收端的电平;(4)滤波器:用于滤除噪声干扰。
51单片机各引脚及端口详解51单片机引脚功能:MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图:l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。
l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。
l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。
l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。
这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。
P0口有三个功能:1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口)2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用:其内部有上拉电阻。
P2口有两个功能:1、扩展外部存储器时,当作地址总线使用2、做一般I/O口使用,其内部有上拉电阻;P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。
有内部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的,即:编程脉冲:30脚(ALE/PROG)编程电压(25V):31脚(EA/Vpp)接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方式由第9脚(即RST/VPD)引入,以保护内部RAM中的信息不会丢失。
在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
51单片机串行口的工作方式解析方式0是外接串行移位寄存器方式。
工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。
波特率固定为fosc/12(即,TXD 每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。
每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。
实际应用在串行I/O口与并行I/O口之间的转换。
2)方式1方式1是点对点的通信方式。
8位异步串行通信口,TXD为发送端,RXD为接收端。
一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。
波特率由T1或T2的溢出率确定。
在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。
(1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。
发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA 无效,发送停止位,一帧结束,置TI=1。
(2)接收:REN=1后,允许接收。
接收器以所选波特率的16倍速率采样RXD端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。
由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。
接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。
此后:A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。
B、若RI=0、SM2=1,则只有停止位为1时,才有上述结果。
C、若RI=0、SM2=1,且停止位为0,则所接数据丢失。
在51单片机中波特率的计算方法
一、传统51单片机波特率的算法
传统51单片机的及其周期是晶振的1/12,一般在使用串口工作方式1使用时,波特率的计算公式:
)
2(12*32*2X fosc bps n SMOD -= 其中:
bps----------波特率(bit/s )
SMOD------波特率加倍位(PCON.7)
n-------------单次收发8为数据
X------------初值
当设定确定波特率时,需要计算初值,换算公式为:
12**32*22bps fosc X SMOD n
-= 误码率计算公式:
%100*1bps
bps bps WML -= 其中:
WML-------误码率
bps1---------实际波特率
Bps----------理论波特率
注意:误码率一般不要超过3%。
以下举例说明:
1、传统51单片机(机器周期是晶振的1/12),外部晶振11.1592MHz ,使用串口工作方式1(异步串口通信),bps=9600bit/s 。
求定时器1工作方式2的初值?
当设定SMOD=0时,根据初值计算公式:
25312*9600*3210*0592.11*226
08
=-=X 转换成HEX (十六进制)为0xfd 。
误码率为0
当设定SMOD=1时,根据初值计算公式:
25012*9600*3210*0592.11*226
18
=-=X
转换成HEX (十六进制)为0xfa 。
误码率为0
2、传统51单片机(机器周期是晶振的1/12),外部晶振11.1592MHz ,使用串口工作方式1(异步串口通信),bps=4800bit/s 。
求定时器1工作方式2的初值?
当设定SMOD=0时,根据初值计算公式:
25012*4800*3210*0592.11*226
08
=-=X 转换成HEX (十六进制)为0xfa 。
误码率为0
当设定SMOD=1时,根据初值计算公式:
24412*4800*3210*0592.11*226
18
=-=X 转换成HEX (十六进制)为0xf4。
误码率为0
二、STC 高性能系列的单片机
例如SCT12系列的单片机为12T 工作方式,即及其周期与外部晶振频率相同。
一般在使用串口工作方式1使用时,波特率的计算公式有两种,第一种是使用定时器1工作方式2作为波特率发生器,定时器1的初值计算:
bps fosc X SMOD *32*228
-= 对应波特率计算公式:
)
2(*32*2X fosc bps n SMOD -= 其中:
X-------------初值
fosc---------外部晶振频率
SMOD------波特率加倍位
bps----------波特率(bit/s )
N-------------数据位
另一种是使用STC12系列单片机内部独立波特率发生器。
使用方法按照对应数据手册即可。
举例说明:
3、STC12系列单片机的外部晶振为11.0592MHz ,串口使用工作方式1,定时器1工作方式2,计算定时器1 的初值?
当SMOD=0(波特率不加倍)时,使用初值计算公式:
2209600*3210*0592.11*226
08
=-=X 转换成HEX (十六进制)为0xdc 。
误码率为0.
当SMOD=1时,使用初值计算公式:
1849600*3210*0592.11*226
18
-=X 转换成HEX (十六进制)为0xb8。
误码率为0.
4、STC12系列单片机的外部晶振为12MHz ,串口使用工作方式1,定时器1工作方式2,计算定时器1 的初值?
当SMOD=0(波特率不加倍)时,使用初值计算公式:
9375.2169600*3210*12*226
08
=-=X 取值217
转换成HEX (十六进制)为0xd8。
使用初值217计算实际波特率
9615)
2172(*3210*12*2186
0=-=bps 误码率:
%3%15.0%100*9600
96009615%100*1<=-=-=bps bps bps WML 说明STC12系列单片机在使用外部晶振你12MHz 时,波特率9600bit/s 可行。
当SMOD=1时略。
上题设定bps=4800bit/s 时,计算初值:
875.1774800*3210*12*226
08
=-=X 取值177
转换成HEX (十六进制)为0xb1。
使用初值177计算实际波特率
69.4807)
1782(*3210*12*2186
0=-=bps 误码率:
%3%16.04800
480069.48071<=-=-=bps bps bps WML
说明STC12系列单片机在使用外部晶振你12MHz时,波特率4800bit/s 可行。
友情提示:方案范本是经验性极强的领域,本范文无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用。