蓝桥杯篇---IAP15F2K61S2串口


文章目录


前言

本文仅仅简单介绍了IAP15F2K61S2的串口的使用。


简介

IAP15F2K61S2 是一款基于8051内核的单片机,内置一个全双工的串行通信接口(UART) ,支持异步串行 通信。串口通信是单片机与外部设备 (如PC、传感器、其他单片机等)进行数据交换的常用方式。

串口通信的基本参数

1.波特率

波特率:数据传输速率,常见值有9600、19200、38400、57600、115200等。

2.数据位

数据位:每帧数据的位数,通常为8位

3.停止位

停止位:每帧数据结束的标志位,通常为1位

4.校验位

校验位:用于错误检测,可以是无校验、奇校验或偶校验

串口相关寄存器

1.SCON

SCON(串口控制寄存器):配置串口的工作模式和状态

2.SBUF

SBUF(串口数据缓冲器):用于发送和接收数据。

3.PCON

PCON(电源控制寄存器):包含波特率加倍控制位(SMOD)。

4.TMOD

TMOD(定时器模式寄存器):用于配置定时器以生成波特率

5.TH1/TL1

TH1/TL1:定时器1的初值寄存器,用于波特率生成

串口使用步骤

1.配置波特率

配置波特率:通过定时器1设置波特率。

2.配置串口模式

配置串口模式:设置 SCON 寄存器

3.使能串口中断

使能串口中断:如果需要中断方式接收数据,需配置 IE 寄存器。

4.发送数据

发送数据:将数据写入 SBUF

5.接收数据

接收数据:从 SBUF 读取数据

6.处理中断

处理中断:在中断服务函数中处理接收或发送完成事件

示例代码:串口发送与接收

以下代码展示了如何使用串口在 IAP15F2K61S2 上实现数据的发送与接收。

c 复制代码
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

void UART_Init() {
    SCON = 0x50;  // 串口模式1,8位数据,1位停止位
    TMOD |= 0x20; // 定时器1,模式2(8位自动重装)
    TH1 = 0xFD;   // 波特率9600
    TL1 = 0xFD;
    ES = 1;       // 使能串口中断
    EA = 1;       // 使能总中断
    TR1 = 1;      // 启动定时器1
}

void UART_SendByte(uchar dat) {
    SBUF = dat;   // 将数据写入SBUF
    while (!TI);  // 等待发送完成
    TI = 0;       // 清除发送中断标志
}

void UART_SendString(char *str) {
    while (*str) {
        UART_SendByte(*str++);  // 逐个发送字符
    }
}

void UART_ISR() interrupt 4 {
    if (RI) {     // 如果接收中断标志置位
        RI = 0;   // 清除接收中断标志
        P1 = SBUF; // 将接收到的数据输出到P1口
    }
}

void main() {
    UART_Init();  // 初始化串口
    UART_SendString("Hello, World!\n");  // 发送字符串

    while (1);    // 主循环,等待中断
}
代码说明
UART_Init:
设置串口为模式1(8位数据,1位停止位)。
配置定时器1为模式2(8位自动重装),设置波特率为9600。
使能串口中断和总中断。
启动定时器1。

UART_SendByte:
将数据写入 SBUF,启动发送。
等待发送完成(TI = 1),并清除发送中断标志。

UART_SendString:
逐个发送字符串中的字符。

UART_ISR:
串口中断服务函数,接收数据并将其输出到P1口。

main:
初始化串口,发送字符串 "Hello, World!",进入主循环等待中断。

示例代码:串口接收数据并回显

以下代码展示了如何使用串口在 IAP15F2K61S2 上实现数据接收并回显。

c 复制代码
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

void UART_Init() {
    SCON = 0x50;  // 串口模式1,8位数据,1位停止位
    TMOD |= 0x20; // 定时器1,模式2(8位自动重装)
    TH1 = 0xFD;   // 波特率9600
    TL1 = 0xFD;
    ES = 1;       // 使能串口中断
    EA = 1;       // 使能总中断
    TR1 = 1;      // 启动定时器1
}

void UART_SendByte(uchar dat) {
    SBUF = dat;   // 将数据写入SBUF
    while (!TI);  // 等待发送完成
    TI = 0;       // 清除发送中断标志
}

void UART_ISR() interrupt 4 {
    if (RI) {     // 如果接收中断标志置位
        RI = 0;   // 清除接收中断标志
        UART_SendByte(SBUF);  // 将接收到的数据回显
    }
}

void main() {
    UART_Init();  // 初始化串口
    while (1);    // 主循环,等待中断
}
代码说明
UART_Init:
初始化串口,设置波特率为9600。

UART_SendByte:
发送一个字节的数据。

UART_ISR:
串口中断服务函数,接收数据并回显。

main:
初始化串口,进入主循环等待中断。

注意事项

1.波特率设置

波特率设置:波特率需要与通信设备一致,否则会导致通信失败。

2.中断优先级

中断优先级:如果有多个中断,需合理设置中断优先级

3.数据缓冲区

数据缓冲区:在实际应用中,可能需要使用缓冲区来存储接收到的数据

4.错误处理

错误处理:在实际应用中,需考虑**通信错误(如帧错误、溢出错误)**的处理。


总结

通过以上代码和说明,你可以在 IAP15F2K61S2 上实现串口通信功能,包括数据发送、接收和回显。实际开发中可以根据需求扩展功能,如协议解析、数据校验等。

相关推荐
hello_simon1 小时前
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
职场和发展·pdf·word·学习方法·word转pdf·石墨文档·word转换
FreakStudio1 小时前
开源一款串口舵机驱动扩展板-FreakStudio多米诺系列
单片机·嵌入式·大学生·电子diy
艾格北峰2 小时前
STM32 物联网智能家居 (六) OLED显示设备
arm开发·stm32·单片机·嵌入式硬件·物联网·智能家居
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
夏天的阳光吖4 小时前
C++蓝桥杯基础篇(四)
开发语言·c++·蓝桥杯
测试19985 小时前
接口测试工具:Postman
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
weixin_535854225 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘
热爱嵌入式的小许6 小时前
STM32 HAL库&标准库+ESP8266+机智云
stm32·单片机·嵌入式硬件·stm32移植机智云·stm32连接机智云·hal库移植机智云·标准库移植机智云
无际单片机编程6 小时前
面对STM32的庞大体系,如何避免迷失在细节中?
java·stm32·单片机·嵌入式硬件·嵌入式开发
StickToForever7 小时前
第4章 信息系统架构(二)
经验分享·笔记·学习·职场和发展