找回密码
 立即注册
查看: 37|回复: 6

学习STC8H8K64U

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-14 15:50:00
已绑定手机

5

主题

4

回帖

41

积分

新手上路

积分
41
发表于 昨天 15:59 | 显示全部楼层 |阅读模式
系统时钟
一、学习目标
  • 了解系统时钟概念
  • 了解时钟周期概念
  • 了解指令周期(机器周期)概念

二、学习内容
(一)时钟与周期
  • 系统时钟
系统时钟是计算机中用于控制各个设备协调工作的“节拍器”。
它是 CPU 的主频,是 CPU 和外设工作的基础,常用单位为 Hz(赫兹),如 1MHz、10MHz 等。
系统时钟的时钟信号通常由晶振提供。
STC8H 单片机支持 外部晶振内部晶振 两种时钟源,可以通过相应配置来选择。
  • 时钟周期
时钟周期是系统时钟完成一个完整周期所需要的时间。
时钟周期的倒数就是时钟频率(每秒的时钟周期数)。
例如:
若 STC8H 时钟频率为 24MHz,则每个时钟周期时间为:
1 / 24MHz ≈ 41.67ns
  • 机器周期(指令周期)
机器周期也叫指令周期,是 CPU 执行一条指令所需的时间。
早期 STC 单片机的机器周期 = 12 个时钟周期。
现在的 STC8H 可以配置为两种模式:1T 模式12T 模式
  • 12T 模式:
    • 当系统时钟为 24MHz 时
    • 每个机器周期时间:12 × 41.67ns ≈ 500ns
  • 1T 模式:
    • 当系统时钟为 24MHz 时
    • 每个机器周期时间:1 × 41.67ns ≈ 41.67ns

(二)NOP 指令
NOP 指令是汇编中的一条指令,全称 “No Operation”,即“不做任何操作”。
特点:
  • 不改变寄存器内容;
  • 不修改存储器数据;
  • 常用于 延时调整代码执行节奏
在大多数处理器中,NOP 指令会被翻译为一条或多条机器指令,从而实现“什么都不干,但占用时间”的效果。
在 STC8H 单片机中:
  • NOP 指令是一条 1 字节长的指令;
  • 不进行任何运算,只消耗一个指令周期。
用途包括:
  • 作为程序中的微小延时单元(可以理解为“睡一个 NOP 指令周期”);
  • 用来填充未使用空间,使程序达到某种对齐要求,提升执行效率。

(三)库函数中的系统时钟配置
在 config.h 中配置系统主时钟频率,例如:
  1. //#define MAIN_Fosc                22118400L        // 定义主时钟
  2. //#define MAIN_Fosc                12000000L        // 定义主时钟
  3. //#define MAIN_Fosc                11059200L        // 定义主时钟
  4. //#define MAIN_Fosc                 5529600L        // 定义主时钟
  5. #define MAIN_Fosc                24000000L        // 定义主时钟
复制代码

根据实际使用的晶振或系统时钟设置 MAIN_Fosc。
注意:
系统时钟配置确定后,烧录软件中的时钟频率设置必须与这里保持一致,否则容易出现各种“诡异问题”(例如波特率不对、延时不准等)。

(四)测试不同时钟下的执行周期
思路:
让程序在一高一低两个电平之间快速翻转,并在中间插入一个指令周期(例如 NOP1),然后用示波器观察引脚电平的高、低电平宽度。切换不同主频,观察输出波形变化,从而直观体会主频不同带来的影响。
示例代码:
  1. #include "config.h"
  2. #include "GPIO.h"
  3. #include "delay.h"
  4. void GPIO_config(void) {
  5.     GPIO_InitTypeDef GPIO_InitStructure;     // 结构定义
  6.     GPIO_InitStructure.Pin  = GPIO_Pin_3;    // 指定要初始化的 IO
  7.     GPIO_InitStructure.Mode = GPIO_PullUp;   // GPIO_PullUp, GPIO_HighZ, GPIO_OUT_OD, GPIO_OUT_PP
  8.     GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); // 初始化
  9. }
  10. int main() {
  11.     GPIO_config();
  12.    
  13.     while (1) {
  14.         P53 = 1;
  15.         NOP1();   // 睡一个指令周期
  16.         P53 = 0;
  17.         //NOP1();
  18.     }
  19. }
复制代码

在不同主频下,用示波器观察 P5.3 引脚高电平和低电平的持续时间。
例如:
  • 24MHz 主频下的波形(此处可在富文本中插入示波器截图)
  • 12MHz 主频下的波形
  • 6MHz 主频下的波形
小结:
  • 主频越高,执行速度越快,同样一段代码用时越短;
  • 主频越高,电磁干扰也越强,设计和布线要求更高,更容易出现信号完整性问题。



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2025-11-14 11:03:11

801

主题

1万

回帖

2万

积分

管理员

积分
20518
发表于 昨天 16:11 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 图形化配置外设
推荐优先看printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
www.STCAI.com
下载 最新的 AiCube-ISP-V6.96F 或以上版本软件 !
下载 最新的 USB库函数,永远用最新的 USB库函数 !
下载 最新的 用户手册 !

下载 最新的 上机实践指导书 !



上面是 小李 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 小赵 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-11-14 16:30:25

12

主题

53

回帖

721

积分

版主

积分
721
发表于 昨天 16:30 | 显示全部楼层
请您后续打卡在同一帖子下,不同楼层回复,谢谢配合
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-14 15:50:00
已绑定手机

5

主题

4

回帖

41

积分

新手上路

积分
41
发表于 昨天 16:36 | 显示全部楼层
芯S*** 发表于 2025-11-14 16:30
请您后续打卡在同一帖子下,不同楼层回复,谢谢配合

好的谢谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-14 15:50:00
已绑定手机

5

主题

4

回帖

41

积分

新手上路

积分
41
发表于 昨天 16:45 | 显示全部楼层

GPIO 的理解


一、学习目标

  1. 了解 C51 中 GPIO 的工作模式。
  2. 熟悉芯片手册中 IO 口相关章节的阅读方法。
  3. 掌握如何把手册里的寄存器/模式说明,转换成真正可用的代码。

二、学习内容

(一)电灯案例代码解析

#include "STC8H.H"

int main() {
    P5M0 = 0x00;
    P5M1 = 0x00;

    P53 = 1;
    while(1) {}
}

逐行说明:

  • #include "STC8H.H"
    引入 STC8H 系列专用的头文件,里面定义了各个特殊功能寄存器、位定义等。
  • P5M0 = 0x00;
  • P5M1 = 0x00;
    配置 P5 端口所有引脚为某种工作模式(这里是“准双向口”模式,后面会详细解释)。
  • P53 = 1;
    设置 P5 端口的 3 号引脚(P5.3)为高电平,用来点亮 LED 或控制外接电路。

(二)头文件 STC8H.H

  • 针对 STC8H 系列的寄存器、位地址、特殊功能都在 STC8H.H 中定义。
  • 如果 Keil 没有配置 STC8 环境,工程里是无法直接 #include "STC8H.H" 的。
  • 一般情况下,此文件在 Keil 安装目录下:
    C51\INC\STC
    这个目录下还有其它 STC 系列的头文件,如果你使用其它 STC 芯片,就需要 include 对应型号的头文件。

(三)引脚工作模式

  1. 从手册中获取的信息

通过 STC-ISP 下载 STC8H 用户手册,打开 IO 口章节,可以看到:

  • 一个端口对应 8 个引脚(Pn.0 ~ Pn.7)。
  • 每个端口都有自己的配置寄存器。
  • 不同系列芯片,端口数量不完全相同。
  • 每个引脚可以配置为 4 种不同工作模式。
  1. 四种工作模式(用 PnM1 / PnM0 组合控制)

每个 IO 引脚有两个配置位:PnM1PnM0。两位不同组合,对应不同工作模式:

  • 准双向口(PnM1 = 0,PnM0 = 0)
    • 内部有弱上拉电阻;
    • 既能输入也能输出;
    • 灌电流可达约 20 mA,上拉电流约 270~150 uA。
    • 适合做普通 IO,简单点灯、按键等。
  • 推挽输出(PnM1 = 0,PnM0 = 1)
    • 内部为强上拉+强下拉结构;
    • 可输出较大电流(约 20 mA),但外部一定要有合适的限流电阻;
    • 适合需要较强驱动能力的场景(如直接驱动 LED、小继电器驱动前级等)。
  • 高阻输入(PnM1 = 1,PnM0 = 0)
    • 引脚呈高阻状态;
    • 电流基本不流入、不流出,只用于检测外部电平;
    • 适合作为纯输入端口使用。
  • 开漏输出(PnM1 = 1,PnM0 = 1)
    • 内部上拉电阻断开,仅提供“拉低”能力;
    • 要正确读外部状态或输出高电平,通常需要外接上拉电阻
    • 适合多机总线(如 I²C)、线与逻辑等。
  1. P5.3 不同模式的配置示例
P5M1 &= ~0x08;  P5M0 &= ~0x08; // 准双向口
P5M1 &= ~0x08;  P5M0 |=  0x08; // 推挽输出
P5M1 |=  0x08;  P5M0 &= ~0x08; // 高阻输入
P5M1 |=  0x08;  P5M0 |=  0x08; // 开漏输出

说明:

  • P5 表示端口 5。
  • 0x08 对应二进制 0000 1000,表示第 3 位,即 P5.3。
  • &= ~0x08:把这一位清零。
  • |= 0x08:把这一位置 1。
  1. 引脚编号与掩码值对应关系
  • 0 号引脚 → 0x01
  • 1 号引脚 → 0x02
  • 2 号引脚 → 0x04
  • 3 号引脚 → 0x08
  • 4 号引脚 → 0x10
  • 5 号引脚 → 0x20
  • 6 号引脚 → 0x40
  • 7 号引脚 → 0x80

只要记住这一列映射,就可以按同样方式配置任意端口、任意引脚的工作模式。


(四)软延时(软件延时)

  1. 概念

软延时:通过执行一段“什么实事都不干、只消耗时间”的代码来实现延时。
常用于:

  • 简单点灯/闪烁;
  • 上电初始化等待;
  • 按键消抖等。
  1. 借助 STC-ISP 工具生成延时代码

在 STC-ISP 中,可以根据:

  • 系统频率(主频);
  • 期望的延时时长;
  • 芯片型号(指令集);

自动生成相应的 C 语言延时函数。

要点:

  • 系统频率:必须和你烧录软件里的设置一致,否则延时时间会不准确。
  • 指令集/芯片型号:要选择包含你实际使用的芯片系列,这里用 STC-Y6(兼容 STC8H)。
  • 延时时长:根据实际需要选择,比如 1 秒(1000 ms)。
  1. 让 LED 每隔 1 秒闪烁一次的完整示例
#include "STC8H.H"

void Delay1000ms()      //@11.0592MHz
{
    unsigned char i, j, k;

    i = 57;
    j = 27;
    k = 112;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

int main() {
    P5M1 &= ~0x08;  P5M0 &= ~0x08; // 准双向口
    //P5M1 &= ~0x08;  P5M0 |=  0x08; // 推挽输出
    //P5M1 |=  0x08;  P5M0 &= ~0x08; // 高阻输入
    //P5M1 |=  0x08;  P5M0 |=  0x08; // 开漏输出

    while (1) {
        P53 = 1;        // 开灯
        Delay1000ms();  // 延时 1 秒
        P53 = 0;        // 关灯
        Delay1000ms();  // 再延时 1 秒
    }
}

你可以把被注释掉的几行模式配置依次打开测试,观察在不同模式下点灯有无差别、是否稳定,顺便加深对各种模式的理解。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-14 15:50:00
已绑定手机

5

主题

4

回帖

41

积分

新手上路

积分
41
发表于 昨天 16:52 | 显示全部楼层

库函数


一、学习目标

  1. 理解为什么需要学习库函数。
  2. 掌握基于库函数进行开发的大致流程。
  3. 会用常用库函数做 IO 操作(例如点灯、延时)。

二、学习内容

(一)开发过程回顾:以“点灯”为例

典型步骤:

  1. 查看原理图,找到控制 LED 的引脚。
  2. 查芯片手册:
    • 配置该引脚工作模式;
    • 控制该引脚输出高/低电平。

其中:

  • 第 1 步属于 硬件/开发板设计 范畴;
  • 第 2 步是 软件代码编写 范畴。

本质上,我们现在的做法是:

  • 面向芯片手册开发(也叫 面向寄存器开发)。
  • 换芯片就得换:
    • #include <STC8H.H> 这一类头文件;
    • 查新的数据手册,使用新寄存器名、位定义、配置方式。

如果连 STC8H.H 这种厂商提供的头文件都没有:

  • 你就得完全根据数据手册,自己用 sfr / sbit 把寄存器地址、位挨个定义出来,然后再写代码。

下面是一个 不依赖头文件、完全用寄存器定义 的点灯示例:

sfr     P5M1   = 0xC9;
sfr     P5M0   = 0xCA;
sfr     P5     = 0xC8;
sbit    P53    = P5^3;

void Delay1000ms()      //@11.0592MHz
{
    unsigned char i, j, k;

    i = 57;
    j = 27;
    k = 112;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

int main() {
    //P5M1 &= ~0x08;  P5M0 &= ~0x08; // 准双向口
    P5M1 &= ~0x08;  P5M0 |=  0x08; // 推挽输出
    //P5M1 |=  0x08;  P5M0 &= ~0x08; // 高阻输入
    //P5M1 |=  0x08;  P5M0 |=  0x08; // 开漏输出
  
    while (1) {
        P53 = 1;     // 开灯
        Delay1000ms();
        P53 = 0;     // 关灯
        Delay1000ms();
    }
}

说明:

  • sfr 关键字:定义一个 特殊功能寄存器(Special Function Register),如端口寄存器、定时器寄存器等。
  • sbit 关键字:定义寄存器中的某一位,方便按位读写。

通过 sfr / sbit,我们可以:

  • 直接访问和控制单片机内部的各种功能模块;
  • 但完全依赖手册、地址、位定义,工作量大且易出错

(二)使用库函数点灯

  1. 导入库函数文件

从 STC 官方库函数压缩包中,拷贝以下文件到你的工程目录(或某个公共目录):

  • Config.h
  • Type_def.h
  • GPIO.h
  • GPIO.c
  1. 新建工程 & 添加文件
  • 新建 main.c
  • 在工程中把 Config.h / Type_def.h / GPIO.h / GPIO.c 全部加进来;
  • 编译后能看到 GPIO.c 已经在工程文件树中。
  1. main.c 中用库函数控制 LED
#include "Config.h"
#include "GPIO.h"

void Delay500ms()       //@11.0592MHz
{
    unsigned char data i, j, k;

    i = 29;
    j = 14;
    k = 54;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void GPIO_config() {
    GPIO_InitTypeDef gpioInit;

    gpioInit.Mode = GPIO_OUT_PP;   // 推挽输出
    gpioInit.Pin  = GPIO_Pin_3;    // P5.3
    GPIO_Inilize(GPIO_P5, &gpioInit);
}

void main() {
    //方式一:宏配置准双向
    //P5_MODE_IO_PU(GPIO_Pin_3);

    //方式二:用初始化函数配置推挽输出
    GPIO_config();
  
    while (1) {
        P53 = 1;
        Delay500ms();
      
        P53 = 0;
        Delay500ms();
    }
}

对比“纯寄存器写法”:

  • 现在只需要关心:
    • 我想把哪个 IO 设成什么模式?
    • 调哪个初始化函数?
  • 底层 P5M0 / P5M1 这些寄存器由库函数来配置。

(三)什么是“库函数”?

简单讲:

库函数就是别人已经写好的一组通用功能代码,你只需要 调用,不用自己从零写。

特点:

  1. 简化编程难度
    • 不必记一堆寄存器名、位含义;
    • 避免很多手误、低级错误。
  2. 提高可读性
    • GPIO_Inilize(GPIO_P5, &gpioInit);P5M1 / P5M0 直观多了。
  3. 节省时间
    • 常用功能已经调试好,可直接拿来用。
  4. 更易移植
    • 换同系列/同厂芯片时,库函数接口可以基本不变;
    • 只需替换底层库实现或配置。
  5. 更安全
    • 避免自己写寄存器操作时产生的溢出、死循环等隐蔽 bug。

但也要注意:

  • 对时间极端敏感的场景(比如极限优化中断响应),直接寄存器操作有时更高效
  • 实战里经常是:
    • 大部分用库函数保证效率和可靠性;
    • 少量关键路径用寄存器精调。

(四)使用 Delay 模块做延时

在库函数里,延时也通常封装成一个独立模块,方便复用。

  1. 拷贝延时模块文件

把库里这两个文件拷贝到工程:

  • Delay.c
  • Delay.h
  1. 在需要延时的 C 文件中包含头文件
#include "Delay.h"
  1. 使用库函数进行延时
delay_ms(250);   // 延时 250 ms(这里支持 1~255 ms)

注意:

  • 延时函数内部是按你工程里配置的系统时钟来算时间的;
  • 主频配置要和下载器/ISP 中的主频设置一致,否则延时会不准。

三、面向库函数 vs 面向寄存器

可以简单理解:

  • 面向寄存器开发
    • 查手册 → 记寄存器名和位 → 自己写 sfr / sbit / 位操作。
    • 优点:灵活、精细、极限优化时更适合。
    • 缺点:难度大、易出错、可读性差、移植麻烦。
  • 面向库函数开发
    • 调库里的初始化函数、设置结构体参数;
    • 大部分时候不直接碰寄存器。
    • 优点:简单、易读、可移植性好、开发快。
    • 缺点:极端场景下可能不如手写寄存器“极限压榨”性能。

实际项目里通常是 两者结合

  • 先用库函数快速把功能跑起来;
  • 确认瓶颈后,再在个别关键模块用寄存器级优化。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-14 15:50:00
已绑定手机

5

主题

4

回帖

41

积分

新手上路

积分
41
发表于 昨天 16:54 | 显示全部楼层

中断系统 INT

一、学习目标

  1. 理解中断的概念,掌握中断的分类和优先级。
  2. 理解中断的响应机制和处理方法。

二、学习内容

(一)中断的概念

中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。

当中央处理机 CPU 正在处理某件事情的时候,外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理这个紧急事件。处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为“中断”。

实现这种功能的部件称为“中断系统”,向 CPU 发出中断请求的请求源称为“中断源”。

微型机的中断系统一般允许多个中断源。当几个中断源同时向 CPU 请求中断、要求为它服务时,就存在一个问题:CPU 优先响应哪一个中断源?

通常根据中断源的重要程度和紧急程度排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是先响应优先级别最高的中断请求。

当 CPU 正在处理一个中断源请求(执行相应的中断服务程序)的时候,如果又发生了另外一个优先级比它还高的中断源请求,且 CPU 能够:

  1. 暂停当前正在执行的中断服务程序,
  2. 转去处理优先级更高的中断请求,
  3. 处理完以后再回到原来较低优先级的中断服务程序继续执行,

这样的过程称为“中断嵌套”。具有中断嵌套功能的中断系统称为多级中断系统,没有中断嵌套功能的称为单级中断系统。

用户可以通过总中断允许位 EA(IE.7)或相应中断的允许位来屏蔽相应的中断请求,也可以通过打开相应的中断允许位,使 CPU 响应对应的中断请求。

每一个中断源都可以用软件独立控制为“开中断”或“关中断”状态。部分中断的优先级别也可以用软件设置。

规则总结:

  1. 高优先级的中断请求可以打断低优先级的中断。
  2. 低优先级的中断请求不能打断高优先级的中断。
  3. 当两个相同优先级的中断同时产生时,由查询次序决定系统先响应哪个中断。

(此处原文包含中断系统结构相关示意图,可在富文本中插入示意图。)


(二)中断源

能向 CPU 提出中断请求的信号源称为“中断源”。

STC8H 中的中断源种类较多(如外部中断、定时器中断、串口中断等),具体可以参考芯片手册中的中断源表格和功能说明,在富文本中可插入该表格或图片作为辅助理解。


(三)中断寄存器

通过 STC8H 的用户手册可以查询所有与中断相关的寄存器,以及对应的中断请求位信息。

例如:中断允许寄存器 IE、中断优先级寄存器 IP 以及扩展中断控制寄存器等。

相关资料可参考:
STC8H 数据手册(PDF):
http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf


(四)中断函数

在 C 语言中,可以通过关键字 interrupt 定义中断函数。

示例:

void UART1_int (void) interrupt 0
{
}

说明:

  1. UART1_int 是中断函数的名称,可以根据需要自行命名。
  2. interrupt 关键字用于声明当前函数为中断函数。
  3. 0 是中断号(中断入口向量编号),需要根据实际业务、查阅用户手册后确定。

中断函数可以理解为“回调函数”:

  • 函数定义好之后,何时被调用不是由我们在主程序中直接调用决定的,而是由硬件事件触发、由系统自动调用。
  • 我们只需要关心“什么事件会触发这个中断函数”,并在中断函数中编写需要执行的业务逻辑。

(五)验证 UART 串口的中断函数

示例需求:
接收数据时点亮 LED,发送数据时熄灭 LED。

相关寄存器与位定义:

sfr     P5M1   = 0xC9;
sfr     P5M0   = 0xCA;
sfr     P5     = 0xC8;
sbit    P53    = P5^3;

sfr     T2L    = 0xD7;
sfr     T2H    = 0xD6;
sfr     AUXR   = 0x8E;

sfr     IE     = 0xA8;
sbit    EA     = IE^7;
sbit    ES     = IE^4;

sfr     SCON   = 0x98;
sfr     SBUF   = 0x99;
sbit    RI     = SCON^0;
sbit    TI     = SCON^1;

UART 中断服务函数:

void uart_hello(void) interrupt 4 {
    if (RI) {
        // 如果接收标志位 RI 触发了中断,打开灯
        RI = 0;
        P53 = 1;   // 开
    } 

    if (TI) {
        // 如果发送标志位 TI 触发了中断,关掉灯
        TI = 0;
        P53 = 0;   // 关
    }
}

简单延时函数(约 1000 ms,@11.0592MHz):

void Delay1000ms()      //@11.0592MHz
{
    unsigned char i, j, k;

    i = 57;
    j = 27;
    k = 112;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

主函数示例:

int main() {
    // P5.3 推挽输出,用作 LED 指示灯
    P5M1 &= ~0x08;
    P5M0 |=  0x08;

    // 串口 1 配置
    SCON = 0x50;

    // 波特率发生器配置:使用定时器 2
    // 65536 - 11059200 / 115200 / 4 = 0xFFE8
    T2L  = 0xE8;
    T2H  = 0xFF;
    AUXR = 0x15;   // 启动定时器 2,选择波特率时钟等

    // 开总中断与串口中断
    EA = 1;
    ES = 1;

    P53 = 0;       // 初始灯灭

    while (1) {
        // 休眠 1000 ms
        Delay1000ms();

        // 发送一个数据 0x11
        SBUF = 0x11;

        // 将 TI 位置 1(实际上只要给 SBUF 赋值,硬件会自动置位 TI)
        TI = 1;
    }
}

本例中完成的内容包括:

  1. 配置 UART 初始化(包括波特率定时发生器)。
  2. 查询并使用几个关键寄存器地址:如 SBUF、IE 等。
  3. 在中断服务函数中根据接收/发送标志位控制 LED 的亮灭,用于直观验证中断触发情况。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-11-15 01:54 , Processed in 0.119990 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表