51 芯片的串口能够作业在几个不同的作业形式下,其作业形式的设置便是运用SCON 寄存器。它的各个位的详细界说如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 为串行口作业形式设置位,这样两位能够对应进行四种形式的设置。串行口作业形式设置。
波特率在运用串口做通讯时,一个很重要的参数便是波特率,只要上下位机的波特率相同时才能够进行正常通讯。波特 率是指串行端口每秒内能够传输的波特位数。这儿所指的波特率,如规范9600 不是每秒种能够传送9600个字节,而是指每秒能够传送9600 个二进位,而一个字节要8 个二进位,如用串口形式1 来传输那么加上开端位和中止位,每个数据字节就要占用10 个二进位,9600 波特率用形式1 传输时,每秒传输的字节数是9600÷10=960 字节。
51芯片的串口作业形式0的波特率是固定的,为fosc/12,以一个12M 的晶振来核算,那么它的波特率能够到达1M。形式2的波特率是固定在fosc/64 或fosc/32,详细用那一种就取决于PCON 寄存器中的SMOD位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。
形式1和形式3的波特率是可变的,取决于守时器1或2(52芯片)的溢出速率,便是说守时器 1每溢出一次,串口发送一次数据。那么咱们怎样去核算这两个形式的波特率设置时相关的寄存器的值呢?能够用以下的公式去核算。
上式中如设置了PCON寄存器中的SMOD位为1时就能够把波特率提高2倍。通常会运用守时器1作业在守时器作业形式2下,这时守时值中的TL1做为计 数,TH1做为主动重装值,这个守时形式下,守时器溢出后,TH1的值会主动装载到TL1,再次开端计数,这样能够不必软件去干涉,使得守时更准确。在这 个守时形式2下守时器1溢出速率的核算公式如下:
溢出速率=(计数速 率)/(256-TH1初值)
溢出速 率=fosc/[12*(256-TH1初值)]
上式中的“计数速率”与所运用的晶体振动器频率有关,在51 芯片中守时器发动后会在每一个机器周期使守时寄存器TH 的值添加一,一个机器周期等于十二个振动周期,所以能够得知51芯片的计数速率为晶体振动器频率的1/12,一个12M 的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M 晶体是为了得到规范的无差错的波特率,那么为何呢?核算一下就知道了。如咱们要得到9600 的波特率,晶振为11.0592M 和12M,守时器1 为形式2,SMOD 设为1,别离看看那所要求的TH1 为何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的核算能够看出运用12M晶体的时分核算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有必定的差错存在不能发生准确的9600 波特率。当然必定的差错是能够在运用中被承受的,就算运用11.0592M 的晶体振动器也会因晶体自身所存在的差错使波特率发生差错,但晶体自身的差错对波特率的影响是十分之小的,能够忽略不计。