蓝桥杯单片机----学习八之串口通信(STC15F2K60S2)

一、原理介绍

        串口通信是通过串行接口传输数据,一次一位地传输,蓝桥杯主控芯片所用的串口标准为UART中断机制,在特定事件发生时,暂停当前程序,转而执行中断服务程序,处理完再返回原来的任务。串口中断是嵌入式系统和单片机中用于高效处理串口通信的一种机制。其核心原理是通过硬件触发中断事件,通知CPU及时处理串口数据的接收或发送,避免持续轮询(Polling)造成的资源浪费。

1. 串口中断的触发条件

串口中断的触发通常由以下事件引起:

  • 数据接收完成:当串口接收缓冲区(RX Buffer)中有新数据到达时,硬件会自动触发接收中断。

  • 数据发送就绪:当串口发送缓冲区(TX Buffer)为空时,硬件触发发送中断,表示可以继续发送新数据。

  • 通信错误:如奇偶校验错误、帧错误、噪声错误等,触发错误中断。

2. 中断处理流程

(1)接收中断流程
  1. 数据到达:外部设备通过串口发送数据,逐位传输到接收引脚(RX)。

  2. 硬件检测:串口控制器(如UART)检测到数据接收完成,将数据存入接收缓冲区。

  3. 中断触发:若接收中断已使能(通过寄存器配置),硬件向CPU发送中断请求(IRQ)。

  4. 中断响应:CPU暂停当前任务,跳转到中断服务程序(ISR)

  5. 读取数据:在ISR中,程序从接收缓冲区读取数据并进行处理(如存入内存或解析)。

  6. 清除中断标志:处理完成后,清除中断标志位,退出中断,CPU恢复原任务。

(2)发送中断流程
  1. 发送请求:程序将待发送数据写入发送缓冲区(TX Buffer)。

  2. 数据发送:串口控制器逐位发送数据到发送引脚(TX)。

  3. 缓冲区空:当发送缓冲区为空时,硬件触发发送中断。

  4. 中断响应:CPU跳转到ISR,检查是否有新数据需要发送。

  5. 填充数据:若有新数据,继续写入发送缓冲区;若无,关闭发送中断。

  6. 清除标志:退出中断,恢复原任务。

二、相关寄存器

1、SCON控制寄存器

 

SM2:允许方式2或方式3多机通信控制位。

REN:1—允许串行接收状态,可启动RxD,开始接收信息,0—禁止接收。

TB8:在方式2或3,存放发送的第9位数据。

RB8:在方式2或3,存放接收的第9位数据

TI:发送中断请求标志位。发送数据结束置1,需要软件清0。

RI:接收中断请求标志位。接收数据结束置1,需要软件清0。

2、PCON电源控制寄存器

3、SBUF数据缓冲寄存器

STC15系列单片机的串行口1(SBUF)实际是2个缓冲器。写SBUF写入数据后,数据会自动发送。有数据接收时会存在读SBUF中,可从读SBUF中获取接收到的数据。1个是只读寄存器,1个是只写寄存器。

4、辅助寄存器AUXR

T0x12、T1x12:选择定时器0、1为波特率发生器 。0为12分频,1为不分频。

UART_M0x6:串口模式0的通信速度设置位。

T2R:定时器2允许控制位。

T2_C/~T:控制定时器2用作定时器或计数器。

T2x12:定时器2速度控制位。

EXTRAM:内部/外部RAM存取控制位。

S1ST2:串口1波特率发生器的控制位。0为定时器1,1为定时器2。

5、中断相关寄存器

三、程序

初始化

void Uart1_Init(void)	//9600bps@12.000MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xD9;			//设置定时初始值
	TH1 = 0xD9;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	ES = 1;				//使能串口1中断
}
void Send_Byte(unsigned char dat)
{
	SBUF = dat;		//将数据放入
	while(TI == 0);	//当TI==1,表示数据发送完成
	TI = 0;	//手动置0
}

void Send_String(unsigned char *s)
{
	while(*s != '\0')
		Send_Byte(*s++);	//发送多个数据
}

通过上节的超声波程序,并发送距离

void Task_collect()
{
	if(dis_count >= 200)
	{
		dis_count=0;
		Distance = GetDis();
		sprintf(string,"%d\r\n",Distance);	//将得出的距离放入数组
		Send_String(string);	//发送
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值