关于串口的波特率有些问题搞不明白,于是在此请教各位,恳请各位的解答。
波特率的设置是用的TH1、TL1来装载相应的初值。
一般书上用串口时,定时器都设置为工作方式2,因为他可以自动重装初值,但是下面官方所给的代码里用的定时方式0,是不可以自动重装初值的,而书上又明确说,定时器在每次计数溢出后,TH1和TL1都会清0。所以这是为什么呢?波特率的设置只需要在一开始给定就行了吗?
我觉得我肯定理解错了定时器T1和波特率之间的关系。
如果是这样的话,那他们两者之间的关系又是什么样的呢?求解,谢谢!
代码如下(此段代码效果:通过串口调试助手发送数字1~8,板子上面的对应指示灯亮):
#include "STC15F2K60S2.h " //定义51单片机特殊功能寄存器
#include "absacc.h"
#define BAUD 9600 //波特率
#define SYSTEMCLOCK 11059200L //系统时钟频率
bit rxc = 0; //数据接收标志位
char rx = '1';//接收到的数据
void uart_sendstring(unsigned char *str); //数据发送
//主函数
void main(void)
{
SCON = 0x50;
AUXR = 0x40; //1T
TMOD = 0x00; //
TL1 = (65536 - (SYSTEMCLOCK/4/BAUD)); //
TH1 = (65536 - (SYSTEMCLOCK/4/BAUD))>>8;
TR1 = 1;
ES = 1;
EA = 1;
while(1)
{
if(rxc == 1){
rxc = 0;
switch(rx){
case '1':
{
XBYTE[0x8000] = 0xFE;
uart_sendstring("1");
}
break;
//...省略一段
default:
uart_sendstring("error\r\n"); //输入其他数据返回error
break;
}
ES = 1;
}
}
}
//串口中断服务函数
void isr_uart(void) interrupt 4
{
if(RI)
{
RI = 0; //清除接收标志位
rx = SBUF;
ES = 0;
rxc = 1;
}
}
//通过串口发送字符串
void uart_sendstring(unsigned char *str)
{
unsigned char *p;
p = str;
while(*p != '\0')
{
SBUF = *p;
while(TI == 0); //等待发送标志位置位
TI = 0;
p++;
}
}
查看了一下关于STC15系列的单片机手册,和书上学的51单片机不太一样。这里的定时器在模式0下也是可以自动重装的,且是16位,计算公式也与一开始书上学的不太一样。这个事情教会我要学会看用户手册。