【蓝桥杯单片机组】(6)uart

(1)波特率的概念:1bps = 1 bit/s

(2)板载资源有两个串口,仅UART1可以通过USB连接电脑

(3)四种方式波特率计算公式:(fosc:晶振频率 )

方式1:baud = fosc / 12;

方式2:baud = (2^smod / 32) * (T1溢出率)

方式3:baud = (2^smod / 64) * fosc

方式4:baud = (2^smod / 32) * (T1溢出率)

(4)SMOD的设定位于PCON(电源管理寄存器中)PCON_D7

SMOD = 1 波特率加倍PCON &= 0x7f

SMOD = 0  波特率不变 PCON |= 0x80

(5)T1溢出率为T1定时器溢出的频率,即:T1溢出一次所需要的时间的倒数 

溢出率 = 1 / ( N * (12 / fosc))

(6)使用T1做时钟源的时候应当使用方式2,以避免重装计时器初值带来的时延,否则会产生累积误差。

(7)计算计数器初值方法(方式1):

设初值为x, T1 = (256 - x) * ( 12 / fosc)

baud = ( 2 ^ SMOD) / 32 * T1

需要使用的寄存器:SCON 串行口寄存器(可位寻址)

SCON D7 D6 D5 D4 D3 D2 D1 D0
  SM0 SM1 SM2 REN TB8 RB8 TI RI


SM0/SM1: 工作方式选择位

SM0 SM1 方式 功能说明
0 0 0 同步移位寄存器方式(用于拓展I/O口)
0 1 1 10位异步收发(1开始位,8位数据,1停止位)波特率可变(T1控制)
1 0 2 11位异步收发(9位数据)波特率固定
1 1 3 11位异步收发(9位数据)波特率可变(T1控制)

一般使用方式1

SM2: 多机通信控制位,SM2 = 1:收到的RB8(第9位数据)进入SBUF,并激活RI,引起中断

SM2 = 0:收到的RB8被丢弃

REN: 接收使能

TB8 / RB8:发送、接收到的第9位数据

TI :发送结束标志(在发送最后一位停止位开始时TI硬件置1,需要手动清零

RI:接收中断标志(在接受到最后一位停止位中间,RI硬件置1,需要手动清零


编程步骤:

(1)设定T1工作方式(方式2)

(2)为TH1 TL1装初值,开计数器

(3)为串口设定所使用的时钟源

sfr AUXR  = 0x8e;	
AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器

(4)设定SCON工作方式(主要:SM0 SM1 REN)

(5)开中断(总中断与串口中断)

P.S:善于使用STC - ISP中自带的波特率计算器


发送函数:

(1)送字符入SBUF

(2)等待TI变为1(while( ! TI ); )

(3)清零TI

接收中断:

(1)清零RI

(2)收SBUF中的数据


自己写的分片代码初始化:

void t1_init()
{
	TMOD = 0x20;		//M1 = 1; M0 = 0
	
	TH1 = 0xfd;
	TL1 = 0xfd;
	
	EA = 1;
	TR1 = 1	;
}

void uart_init()
{
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器

	SM0 = 0;
	SM1 = 1;		//方式1
	REN = 1;		//RECEIVE INTERRUPT

	ES = 1;			//uart interrupt
	EA = 1;
}


STC - ISP计算的初始化代码:

void UartInit(void)		//[email protected]
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

发送函数:

void trans_char(char t)
{
	SBUF = t;
	while(!TI);
	TI = 0;
}

void trans_str(char t[])
{
	char *p;
	p = t;
	while(*p != '\0')
	{
		trans_char(*p);
		p++;
	}	
}

中断:

void uart_isr() interrupt 4
{	

	RI = 0;
	rechar = SBUF;
	trans_char(rechar);	  	//验证

}

P.S:在开发板上需要讲J13跳线至MM

你可能感兴趣的:(蓝桥杯单片机组)