STC12C5A60S2 单片机串口2的通信功能测试

笔记来自视频教程链接: https://www.bilibili.com/video/BV1Qq4y1Z7iS/?spm_id_from=333.880.my_history.page.click&vd_source=b91967c499b23106586d7aa35af46413

STC12C5A60S2 单片机串口2的通信功能测试_第1张图片
STC12C5A60S2 单片机串口2的通信功能测试_第2张图片
STC12C5A60S2 单片机串口2的通信功能测试_第3张图片
STC12C5A60S2 单片机串口2的通信功能测试_第4张图片
STC12C5A60S2 单片机串口2的通信功能测试_第5张图片

开启两个串口,进行测试。

STC12C5A60S2 单片机串口2的通信功能测试_第6张图片

使用串口二的接收中断,要把串口二中断使能给加进来。

 IE2 = 0x01;             //Enable UART2 interrupt

uart2.c 的代码如下:

#include "uart2.h"

extern void sendByte(unsigned char dat);

void uart2_init(void)  //[email protected]
{
	AUXR &= 0xF7;		//波特率不倍速
	S2CON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xFB;		//定时器时钟12T模式
	BRT = 0xFD;			//设置定时重载值
	AUXR |= 0x10;		//启动独立波特率发射器
	
	IE2 = 0x01;             //Enable UART2 interrupt
}

void uart2_SendByte(unsigned char dat)
{
		S2BUF = dat;
		
		while(!(S2CON & S2TI)); // S2CON & S2TI == 0 时,会一直等在这
		S2CON &= ~S2TI;         // 手动清 0
}

#if 0
void uart2_SendString(unsigned char *dat)
{
		while(*dat != '\0') 
		{
				uart2_SendByte(*dat++);
		}
}
#endif

char putchar(char c)
{
	uart2_SendByte(c);
	return c;
}

/*----------------------------
UART2 interrupt service routine
----------------------------*/
void Uart2() interrupt 8
{
		unsigned char dat;
	
    if (S2CON & S2RI)
    {
        S2CON &= ~S2RI;     //Clear receive interrupt flag
        dat = S2BUF;
				sendByte(dat);
    }
}

uart2.h 的代码如下:

#ifndef _UART2_H_
#define _UART2_H_

#include "stc12c5a60s2.h"

#define S2RI  0x01          //S2CON.0
#define S2TI  0x02          //S2CON.1
#define S2RB8 0x04          //S2CON.2
#define S2TB8 0x08          //S2CON.3

// 函数声明
extern void uart2_init(void);
extern void uart2_SendByte(unsigned char dat);
extern void uart2_SendString(unsigned char *dat);


#endif

工程是在(基于串口超时接收用户自定义通讯协议的编程实现——协议内 CRC16 校验及接收应答处理)基础上改的,代码已上传至CSDN资料库。

你可能感兴趣的:(单片机,嵌入式硬件)