SC9S08MG64 IIC总线寄存器配置与LCD驱动实战指南

天津理工大学 数据挖掘 习题 鸢尾花数据集简单处理,关联分析-----数据挖掘技术的基础知识 立即下载

1. 项目概述:为什么IIC总线是嵌入式工程师的必修课?

如果你在嵌入式领域摸爬滚打了一段时间,肯定对IIC(Inter-Integrated Circuit)总线不陌生。它就像电子设备内部低调而高效的“信使”,用两根线(SCL时钟线和SDA数据线)就能串联起传感器、存储器、显示屏等一大堆外设。我最早接触IIC是在一个温湿度监测项目上,当时为了驱动一块OLED屏和一颗温湿度传感器,对着数据手册和示波器波形调试了大半天,才真正搞明白那些起始信号、应答位和寄存器读写时序到底是怎么一回事。从那以后,无论是配置EEPROM、读取陀螺仪数据,还是驱动像SC9S08MG64这类MCU内置的LCD模块,IIC都成了我最信赖的通信协议之一。

这次,我们不谈那些泛泛而谈的理论,直接深入到飞思卡尔(现恩智浦)SC9S08MG64这款经典8位MCU的IIC模块内部,从最底层的寄存器配置讲起。你会发现,手册里那些看似枯燥的位域(Bit Field)和时序参数,实际上是你驯服这块芯片、实现稳定通信的“密码”。特别是当IIC总线需要驱动LCD这类对时序和信号完整性有要求的设备时,每一个寄存器的配置都至关重要。一个配置不当,轻则通信失败,重则导致屏幕闪烁、显示错乱。通过这篇文章,我希望你能不仅知道如何配置,更能理解 为什么 要这样配置,从而在面对任何带有IIC接口的设备时,都能胸有成竹。

2. IIC总线核心原理与SC9S08MG64模块架构解析

2.1 IIC通信协议的精髓:两根线与一套规则

IIC总线的优雅之处在于其极简的物理层和严谨的协议层。它仅需两根双向开漏线:

  • SCL (Serial Clock Line) :时钟线,由主设备产生,用于同步数据。
  • SDA (Serial Data Line) :数据线,用于传输地址和数据。

所有设备都通过上拉电阻连接到这两条线上,形成“线与”逻辑。这意味着任何设备都可以将线拉低(输出0),但只有当所有设备都释放时,线才能被上拉电阻拉高(状态1)。这个特性是实现多主仲裁的基础。

一次完整的IIC数据传输遵循固定的帧结构:

  1. 起始条件 (S) :SCL为高电平时,SDA出现一个下降沿。
  2. 从机地址帧 (7位或10位) :主设备发送目标从机的地址和一个读写位(R/W#)。读写位为0表示主设备要写入数据到从机,为1表示主设备要从从机读取数据。
  3. 应答位 (ACK/NACK) :每传输完一个字节(8位数据),接收方需要在第9个时钟脉冲期间将SDA拉低,作为应答信号(ACK)。如果接收方未拉低,则为非应答(NACK),通常表示传输结束或出错。
  4. 数据帧 :在地址得到应答后,开始传输数据字节,每个字节后同样跟随一个应答位。
  5. 停止条件 (P) :SCL为高电平时,SDA出现一个上升沿。

注意 :起始和停止条件都是由主设备产生的特殊信号。在SCL为高期间,SDA的稳定变化被定义为数据;而SDA在SCL为高时的跳变则被定义为起始或停止信号,这是协议区分数据与控制的关键。

2.2 SC9S08MG64的IIC模块功能框图与工作模式

SC9S08MG64的IIC模块(型号S08IICV2/V5)是一个功能相当完整的控制器,其内部结构可以简化理解为几个核心部分的协同工作:

  • 时钟与控制单元 :这是模块的“心脏”,负责产生内部时序、检测总线上的起始/停止信号、控制传输流程。它直接受 IICC1 (控制寄存器1)中的 IICEN (模块使能)和 MST (主模式选择)位控制。
  • 数据移位寄存器 :与 IICD (数据I/O寄存器)关联。当你要发送一个字节时,CPU将数据写入 IICD ,硬件会自动将这个字节从高位(MSB)到低位(LSB)依次移到SDA线上。接收时过程相反。
  • 地址比较器 :模块的“耳朵”。它持续监听总线上的地址帧,并将其与 IICA1 (地址寄存器1)和 IICA2 (地址寄存器2,如果使能)中预设的从机地址进行比较。一旦匹配,就会设置 IICS (状态寄存器)中的 IAAS (被寻址为从机)位,并可能产生中断。
  • 仲裁与状态逻辑 :模块的“大脑”。在多主竞争总线时,它通过比较自身输出与总线实际电平来判断是否丢失仲裁( ARBL 位)。同时,它管理着 TCF (传输完成)、 BUSY (总线忙)等关键状态标志。
  • 可编程滤波器 (IICFLT) :模块的“噪声过滤器”。它可以屏蔽SCL和SDA线上短于设定时间的毛刺脉冲,对于工作在电气环境复杂的工业场景中的设备至关重要。

模块支持几种主要的MCU功耗模式:

  • 运行模式 (Run) :全功能工作。
  • 等待模式 (Wait) :CPU暂停,但IIC模块仍可工作,并能产生中断唤醒CPU。
  • 停止模式 (Stop3) :模块大部分关闭以省电,但 地址匹配唤醒功能 可以保持使能(通过 IICC1 中的 WUEN 位)。这意味着即使MCU深度睡眠,当总线上出现呼叫本机地址的帧时,IIC模块能立即唤醒MCU。这对于电池供电的传感器节点是极其有用的功能。

3. 寄存器深度配置指南与实战计算

理解了框架,我们进入实战环节:配置寄存器。手册上的表格和位描述是“是什么”,而我们要弄懂“怎么配”和“为什么这么配”。

3.1 通信速率的核心:IICF频率分频寄存器详解

IIC的通信波特率由 IICF 寄存器决定。它不是直接设置波特率数值,而是通过两个参数:乘法因子 MULT 和时钟速率分频值 ICR ,共同从系统总线时钟(Bus Clock)分频得到。

计算公式是手册的灵魂: IIC 波特率 = 总线速度 (Hz) / (MULT × SCL分频值)

这里 SCL分频值 需要根据你选择的 ICR 值,去查表获得(例如手册中的Table 12-4)。 MULT 可以是1、2或4。

实战计算示例 : 假设你的SC9S08MG64系统总线时钟为8MHz(这是很多应用中的常见值),目标IIC波特率为标准的100kbps。

  1. 查表与试算 :翻阅手册Table 12-4,我们需要找到一组 MULT 和 ICR ,使得 8,000,000 / (MULT × SCL分频值) ≈ 100,000 。
  2. 寻找匹配 :
    • 若选 MULT=2 ( MULT[1:0]=01 ),则公式变为 8,000,000 / (2 × SCL分频值) = 100,000 ,解得所需 SCL分频值 = 40 。
    • 查表, ICR=0x0B 时, SCL分频值 = 40 。同时,该行还给出了 SDA保持时间=9 , SCL起始保持时间=16 , SCL停止保持时间=21 。
  3. 计算实际时序 :根据手册公式:
    • SDA保持时间 = 总线周期 × MULT × SDA保持值 = (1/8,000,000) × 2 × 9 = 2.25 µs
    • SCL起始保持时间 = (1/8,000,000) × 2 × 16 = 4.0 µs
    • SCL停止保持时间 = (1/8,000,000) × 2 × 21 = 5.25 µs
  4. 配置代码 :因此,配置 IICF 寄存器为 0x4B ( MULT=01 , ICR=0x0B )。

避坑指南 :波特率计算不能只看中心值。IIC标准对上升时间、下降时间、保持时间都有要求。选择 ICR 时,务必用上述公式验算SDA保持时间等参数是否满足你所有从设备数据手册中最严苛的时序要求。在总线负载重(电容大)导致边沿变缓时,过短的保持时间容易导致数据采样错误。

3.2 核心控制与状态:IICC1、IICS、IICD寄存器联动

这三个寄存器是编程时打交道最频繁的。

IICC1 (控制寄存器1) - 模式开关

  • IICEN :总开关,必须先置1才能操作其他寄存器。
  • MST :主从模式切换。 从0写1会产生起始信号(S);从1写0会产生停止信号(P) 。这是软件模拟起停信号的关键。
  • TX :传输方向。在主模式下,发起传输前必须根据本次操作是读还是写来设置此位。在从模式下,当 IAAS 被置位后,应读取 IICS 中的 SRW 位,然后据此设置 TX 位,以匹配主设备的期望。
  • TXAK :应答控制。当本机作为接收方时,此位决定在下一个(或当前,取决于 FACK )应答周期是发出ACK(0)还是NACK(1)。 在主机接收最后一个字节前,应将其设为1以发出NACK,通知从机结束发送 。
  • RSTA :重复起始。当总线已由本机控制(为主机且总线忙),向此位写1可以产生一个重复起始信号(Sr),用于在不释放总线的情况下切换读写方向。

IICS (状态寄存器) - 状态监视器

  • TCF :字节传输完成标志。当8位数据+1位ACK/NACK传输完毕,此位自动置1。 清除方法是:在发送模式下写 IICD 寄存器;在接收模式下读 IICD 寄存器 。这是驱动状态机的重要标志。
  • IAAS :被寻址为从机。当接收到与本机地址匹配的呼叫地址时置位。此时应检查 SRW 位并配置 IICC1 中的 TX 位,然后操作 IICD 寄存器进行数据收发。
  • BUSY :总线忙状态。由硬件根据检测到的起停信号自动设置和清除。在尝试发起传输前,应先检查此位。
  • ARBL :仲裁丢失。在多主竞争时,如果本机输出高电平但检测到SDA为低,说明有其他主机赢得了总线,此位置1。 必须由软件写1清除 。
  • IICIF :中断标志。当 TCF 、 IAAS 或 ARBL 等事件发生时置位。需要在中断服务程序中 写1清除 。
  • RXAK :接收应答。发送完一个字节(地址或数据)后,此位反映从机是否给出了ACK。如果为1(无应答),通常意味着寻址失败或从机忙,主机应发出停止信号终止传输。

IICD (数据I/O寄存器) - 数据通道 这是一个有“副作用”的寄存器。读写它不仅是存取数据,更是触发传输动作的命令。

  • 主机发送模式 :在设置好地址和方向( TX=1 )后,向 IICD 写入第一个字节,这个字节必须是 7位从机地址 + R/W位 。这会启动整个传输过程。后续写入的数据字节才是真正的用户数据。
  • 主机接收模式 :在发送完地址(R/W位为1)并收到ACK后,将 TX 位改为0(接收模式),然后 读取 IICD 寄存器 。这个读操作会触发硬件自动产生SCL时钟,从总线上读入下一个字节。 特别注意 :在接收最后一个字节前,应先设置 TXAK=1 ,这样在读完最后一个字节后,主机会回复NACK,从机便会释放SDA线。

3.3 高级功能配置:地址扩展、滤波与SMBus

IICA2与IICC2 - 地址与扩展

  • IICA2 :第二地址寄存器。当 IICSMB 中的 SIICAEN 使能时,模块会响应 IICA1 和 IICA2 两个地址,这在模拟多从机或响应SMBus设备默认地址时有用。
  • IICC2 :
    • ADEXT :置1启用10位地址模式。此时,完整的10位从机地址高3位存放在 IICC2 的 AD[10:8] ,低7位存放在 IICA1 的 AD[7:1] 。10位地址的传输需要两个地址帧,协议更复杂,但可以连接更多设备。
    • GCAEN :通用呼叫地址使能。置1后,模块会响应地址 0x00 。这在广播消息时使用。

IICFLT - 抗干扰滤波器 在电机、继电器等噪声源附近,总线容易受到毛刺干扰。 IICFLT 寄存器可以设置滤除特定宽度的干扰脉冲。

  • FLT[4:0] :设置过滤的毛刺宽度,单位是IPBus时钟周期(或半周期,取决于芯片具体设计)。例如,设置 FLT=0x04 ,表示滤除宽度小于等于4个IPBus时钟周期的毛刺。
  • 配置心得 :滤波器的设置需要在可靠性和速度间权衡。设置过大会过滤掉有效的窄脉冲,导致通信失败;设置过小则无法抵抗干扰。通常从中间值开始测试,在嘈杂环境中适当增大。 务必查阅你所用MCU的具体手册,确认其滤波时钟源是IPBus时钟还是其半频 ,这对计算实际过滤时间至关重要。

IICSMB - SMBus兼容性设置 SMBus是基于IIC的衍生协议,增加了超时、警报等机制,主要用于智能电池管理等。

  • FACK :快速NACK/ACK使能。普通模式下,ACK/NACK在接收字节 后 的下一个周期发出。当 FACK=1 时,ACK/NACK的发送被推迟,直到软件写入 TXAK 位后才发出。这给了CPU时间检查数据(如CRC)后再决定是否应答,用于Packet Error Checking (PEC)。
  • SHTF2 , SLTF :高/低电平超时标志。SMBus要求信号线持续低电平或高电平不能超过一定时间(通常35ms),否则视为总线错误。这些标志位和对应的超时寄存器( IICSLTH/L )用于实现此功能。
  • ALERTEN :SMBus警报响应地址使能。使能后,模块会响应特定的SMBus警报地址。

4. 实战:配置IIC以驱动LCD模块的完整流程

现在,我们将理论应用于一个具体场景:使用SC9S08MG64作为主机,通过IIC总线配置一个支持IIC接口的LCD驱动器(例如常见的PCF8576或HT16K33)。虽然SC9S08MG64自身有LCD驱动模块,但许多外置LCD模组使用IIC接口以节省IO口。

4.1 硬件连接与初始化步骤

  1. 硬件连接 :

    • 将MCU的IIC引脚(例如PTB4/SCL, PTB5/SDA)连接到LCD驱动器的对应引脚。
    • 务必在SCL和SDA线上各接一个上拉电阻(通常4.7kΩ至10kΩ)到VDD 。这是IIC总线正常工作的必要条件。
    • 确保两地共良好。
  2. 软件初始化序列 :

// 假设总线时钟为8MHz,目标IIC波特率100kbps
void IIC_Init(void) {
    // 1. 使能IIC模块的时钟门控(在SIM或SCGC寄存器中,具体见芯片手册)
    SIM_SCGC1 |= SIM_SCGC1_IIC_MASK;

    // 2. 配置GPIO引脚为IIC功能(复用功能)
    PTBDD &= ~((1<<4) | (1<<5)); // 先将方向设为输入(高阻)
    PTBPE |= (1<<4) | (1<<5);    // 使能内部上拉(如果引脚支持且需要)
    // 配置引脚控制寄存器,将PTB4/5设置为IIC的SCL/SDA功能(具体寄存器名查手册)

    // 3. 禁用IIC模块以进行配置(IICEN=0)
    IICC1 &= ~IICC1_IICEN_MASK;

    // 4. 配置IICF寄存器设置波特率 (MULT=2, ICR=0x0B for 100kbps @8MHz)
    IICF = 0x4B; // 二进制 0100 1011

    // 5. 配置从机地址(本例中MCU作为主机,此地址在主机模式下通常无效,但建议设置)
    IICA1 = 0xC0; // 假设设置一个未冲突的地址,如0x60 (7位地址左移1位后)

    // 6. (可选)配置滤波、SMBus等高级功能
    IICFLT = 0x04; // 使能滤波器,滤除短毛刺
    // IICSMB = ... // 如需SMBus功能则配置

    // 7. 使能IIC模块中断(如果使用中断驱动)
    // IICC1 |= IICC1_IICIE_MASK;

    // 8. 最后,使能IIC模块
    IICC1 |= IICC1_IICEN_MASK;
}

4.2 实现基本的字节写入与读取函数

以下是采用查询(非中断)方式的基础函数,这是理解IIC操作的基础。

// 产生起始条件并发送从机地址(写)
uint8_t IIC_StartWrite(uint8_t slaveAddr) {
    // 等待总线空闲
    while(IICS & IICS_BUSY_MASK);

    // 设置为主发送模式,这将自动产生起始信号(S)
    IICC1 |= IICC1_MST_MASK | IICC1_TX_MASK;

    // 将要寻址的从机地址和写位(0)组合并写入IICD,启动传输
    // 7位地址左移1位,最低位为0表示写
    IICD = (slaveAddr << 1);

    // 等待地址帧发送完成
    while(!(IICS & IICS_TCF_MASK));

    // 检查是否收到从机的应答
    if(IICS & IICS_RXAK_MASK) {
        // 无应答,寻址失败
        IICC1 &= ~IICC1_MST_MASK; // 产生停止信号
        return 1; // 返回错误码
    }
    return 0; // 成功
}

// 发送一个数据字节
uint8_t IIC_WriteByte(uint8_t data) {
    IICD = data; // 写入数据,触发发送
    while(!(IICS & IICS_TCF_MASK)); // 等待发送完成
    if(IICS & IICS_RXAK_MASK) {
        // 从机无应答,可能从机忙或数据错误
        return 1;
    }
    return 0;
}

// 产生重复起始条件并发送从机地址(读)
uint8_t IIC_RepeatStartRead(uint8_t slaveAddr) {
    // 此时总线应处于忙状态(本机是主机)
    // 发送重复起始信号
    IICC1 |= IICC1_RSTA_MASK;

    // 切换为接收模式(TX=0)
    IICC1 &= ~IICC1_TX_MASK;

    // 发送从机地址和读位(1)
    IICD = (slaveAddr << 1) | 0x01;

    while(!(IICS & IICS_TCF_MASK));
    if(IICS & IICS_RXAK_MASK) {
        IICC1 &= ~IICC1_MST_MASK; // 停止
        return 1;
    }
    return 0;
}

// 读取一个数据字节,ackFlag=1发送ACK,=0发送NACK(通常用于最后一个字节)
uint8_t IIC_ReadByte(uint8_t ackFlag) {
    uint8_t data;

    // 在读取操作前,设置好应答位。注意:对于最后一个字节,应发送NACK
    if(ackFlag) {
        IICC1 &= ~IICC1_TXAK_MASK; // 下次接收发ACK
    } else {
        IICC1 |= IICC1_TXAK_MASK;  // 下次接收发NACK
    }

    // 读取IICD寄存器会触发硬件接收下一个字节
    data = IICD;
    while(!(IICS & IICS_TCF_MASK)); // 等待接收完成

    return data;
}

// 产生停止条件
void IIC_Stop(void) {
    IICC1 &= ~IICC1_MST_MASK; // 清除MST位,产生停止信号(P)
    // 可选:等待停止信号完成(BUSY位清零)
    while(IICS & IICS_BUSY_MASK);
}

4.3 驱动LCD的典型操作序列

假设我们要驱动一个IIC接口的LCD,其7位从机地址为 0x3E ,内部有一个命令寄存器(写 0x00 )和一个数据寄存器(写 0x40 )。

void LCD_Init(void) {
    uint8_t slaveAddr = 0x3E; // 7位地址

    // 1. 发送初始化命令序列
    if(IIC_StartWrite(slaveAddr) != 0) goto error;
    IIC_WriteByte(0x00); // 选择命令寄存器
    IIC_WriteByte(0x38); // 功能设置:8位,2行,5x8点阵
    IIC_WriteByte(0x0C); // 显示开,光标关,闪烁关
    IIC_WriteByte(0x01); // 清屏
    IIC_WriteByte(0x06); // 输入模式:地址递增,显示不移位
    IIC_Stop();

    delay_ms(5); // 等待清屏等操作完成

    // 2. 显示字符串
    const char *msg = "Hello IIC!";
    if(IIC_StartWrite(slaveAddr) != 0) goto error;
    IIC_WriteByte(0x00); // 命令寄存器
    IIC_WriteByte(0x80); // 设置DDRAM地址到第一行行首

    IIC_StartWrite(slaveAddr); // 或者用重复起始,这里重新开始
    IIC_WriteByte(0x40); // 选择数据寄存器
    while(*msg) {
        IIC_WriteByte(*msg++);
    }
    IIC_Stop();
    return;

error:
    // 错误处理,例如重试或点亮错误LED
    IIC_Stop();
}

5. 调试技巧与常见问题排查实录

即使按照手册配置,在实际调试中依然会遇到各种问题。以下是我在多年项目中积累的排查清单。

5.1 问题排查速查表

现象 可能原因 排查步骤与解决方案
通信完全无响应,示波器看不到波形 1. 模块未使能 ( IICEN=0 )。
2. 时钟门控未打开。
3. GPIO引脚未正确复用为IIC功能。
4. 上拉电阻未接或开路。
1. 检查 IICC1 寄存器的 IICEN 位。
2. 检查系统时钟门控寄存器(如 SIM_SCGC1 )。
3. 用万用表测量引脚电压,配置为GPIO输出高低电平测试。
4. 检查SCL/SDA线电压,空闲时应为VDD(上拉后)。
能看到起始信号,但地址无应答 (NACK) 1. 从机地址错误。
2. 从机设备未上电或损坏。
3. 总线电平不匹配(如MCU 3.3V,从机5V)。
4. 波特率过高,从机跟不上。
1. 核对从机数据手册的7位地址,注意是否需左移一位。
2. 检查从机电源、复位引脚。
3. 使用逻辑分析仪解码地址帧,确认发送值。
4. 降低 IICF 设置的波特率(如降到10kbps)测试。
能收到ACK,但后续数据出错 1. 时序不满足从机要求(保持时间、建立时间)。
2. 总线电容过大,边沿太缓。
3. 中断服务程序处理太慢,导致超时。
4. 未正确处理 TCF 标志。
1. 用示波器测量SDA在SCL高电平期间的稳定时间,对照从机时序参数。
2. 减小上拉电阻值(如从10kΩ换为4.7kΩ),加速上升沿。
3. 在状态查询循环中加入超时机制,防止死等。
4. 确保在 TCF=1 后及时读写 IICD 以清除该标志。
多主系统中频繁仲裁丢失 1. 软件响应太慢,在对方发送时尝试发送。
2. 中断优先级低,未能及时处理总线事件。
1. 检测到 ARBL 丢失后,应尽快转为从机接收模式,并清除 ARBL 标志。
2. 优化代码,在非关键时段操作IIC。
通信偶尔失败,受环境干扰 1. 总线布线过长,靠近噪声源。
2. 未启用或未正确配置输入滤波器( IICFLT )。
1. 缩短总线长度,远离电机、电源线。
2. 适当增加 IICFLT 的滤波值,并确认滤波时钟源频率。
从机模式无法被寻址 1. IICA1 地址寄存器设置错误。
2. 未使能从机地址匹配唤醒( WUEN )或在停止模式下模块未供电。
1. 确认写入 IICA1 的是7位地址(通常手册给的),而非左移后的8位值。
2. 检查 IICC1 中的 WUEN 位,并确保在停止模式下IIC模块仍有供电(参考芯片电源模式章节)。

5.2 调试工具与技巧

  1. 示波器是首选 :观察SCL和SDA的实际波形。检查起始/停止信号是否标准,数据在SCL高电平期间是否稳定,ACK/NACK脉冲是否正常。测量上升/下降时间是否过长(通常应小于1µs)。
  2. 逻辑分析仪解码 :使用带IIC协议解码功能的逻辑分析仪,可以直观看到地址、数据、ACK位的值,极大提升调试效率。Saleae逻辑分析仪配合软件是性价比很高的选择。
  3. 软件模拟IIC作为对比 :当硬件IIC调不通时,可以先用两个GPIO口模拟IIC时序(“bit-banging”)驱动同一个从设备。如果模拟能成功,就能100%确定是硬件IIC模块的配置问题,而非硬件连接或从机问题。
  4. 加入超时机制 :所有 while 循环等待标志位(如 TCF , BUSY )的地方,必须加入超时计数器。否则一旦从机故障不回应,程序就会永远卡死。
uint32_t timeout = 100000; // 超时计数
while(!(IICS & IICS_TCF_MASK) && timeout--);
if(timeout == 0) {
    // 超时处理:复位IIC模块,发送停止信号等
    IIC_Recovery();
    return ERROR_TIMEOUT;
}
  1. 注意寄存器访问顺序 :有些操作对顺序敏感。例如,在从发送模式下,必须在 IAAS 置位后、读取 SRW 位并设置 TX 位 之前 ,就读取一次 IICD 寄存器(这是一个虚拟读,用于清除 IICIF 并准备硬件),否则后续传输可能出错。务必仔细阅读手册中关于“清除中断标志”和“初始化数据传输”的步骤说明。

调试IIC就像侦探破案,需要根据现象(波形、状态位)结合协议规则(时序、帧格式)和硬件配置(寄存器)进行逻辑推理。每一次成功的调试,都会让你对这根“两根线”的总线有更深的理解。

python实验3(含代码/截图/实验总结) 立即下载

相关推荐

天津理工大学操作系统实验一 处理机调度实验 python实验代码 含tkinter窗口可视化

天津理工大学操作系统实验一,刘凤连老师要求输出结果以窗口形式显示,工作量知识量多了不少。本实验本人使用python编写,利用tkinter模块完成可视化窗口,稍微有些粗糙,有兴趣的同学可以通过自学相关知识略做更改。

目前最值得学习的9种非主流的开发语言

原文:9 cutting-edge programming languages worth learning now 作者:Peter Wayner 翻译:Vincent 译者注:从事主流开发语言的人员有很多,但是除了这些语言,我们也应该了解一些其他的,这样,我们才能根据场景的不同决定采用哪一种。本文中作者为我们列举了9种语言的应用场景。以下为译文。 目前比较流行的开发语言...

博客 1585

天津理工大学操作系统实验报告实验一.pdf

天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf天津理工大学操作系统实验报告实验一.pdf

盘点日渐衰落的八种编程语言

今天给大家盘点日渐衰落的八种编程语言,有你在用的吗,一起来看看吧

IT技术分享社区 892

天津理工大学编译原理实验2

可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器: (1)E→E+T | E-T | T (2)T→T*F | T/F | F (3)F→P^F | P (4)P→(E) | i

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

话说80后非主流编程语言-Python [转]

天津理工大学 王小明(网络管理学生) 1272

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3083

“非工业主流”编程语言

什么是“非工业主流”编程语言。我不知道如何下一个严格的定义。简单地说,就是不被绝大多数程序员所使用的编程语言。看看tiobe的语言排行榜,你可以了解我在讲什么。Java、C、VB、C++和PHP占据了70%的份额,它们是当之无愧的工业主流语言。而 Ruby尽管连连升级,排名13位,份额也不过是0.804%,Lisp/Scheme连连下挫,目前仅为0.586%,如果你仔细寻找,在The N...

ao1227的博客 259

学术规范与论文写作(雨课堂)研究生 全部答案

1:如何造就优秀的学术论文 论文语法判断题 :全部是错的 2:如何撰写学术论文 3: SCI论文写作经验分享 4:论文写作与投稿技巧 5:学术伦理道德 答案仅供参考,研究生生活不易,大家如果有时间的话,还是可以学习学习的,毕竟老师讲的不错。加油,希望读研的每一个人都能顺利毕业! ...

Always-Learning 13万+

别再搞混了!Vue3里xgplayer播放FLV视频与FLV直播流,配置到底差在哪?

本文详细解析了在Vue3项目中使用xgplayer播放FLV视频与FLV直播流的配置差异,帮助开发者避免常见错误。通过对比点播与直播的核心协议差异、插件选择及配置参数,提供实战代码示例和性能优化技巧,确保流畅播放体验。特别针对直播流场景,深入讲解专属配置和问题排查方法。

weixin_28687331的博客 150

BT雷人的程序语言(大全)[coolshell]

还记得以前本站的BT雷人的程序语言吗?除了那几个Brainfuck,LOLCODE和WhiteSpace,我以为这些是比较BT的语言,但是自从这两天我在网上看到一些(见文章最后的参考一节),我发现我错了,这个世界上,只有更变态,没有最变态。不相,你看看下面这些,简直变态到了极致啊

2115

MICCAI‘23 | TSegFormer:基于几何引导Transformer的口内扫描3D牙齿分割

光学口内扫描仪(IOS)在数字牙科中广泛应用于提供牙冠和牙龈的详细3D信息。准确的3D牙齿分割对于各种牙科应用至关重要,但现有方法在复杂边界处容易出错,并且在不同患者之间表现不佳。本文提出了TSegFormer,它通过多任务3D Transformer架构捕捉IOS点云中不同牙齿和牙龈之间的局部和全局依赖关系。此外,作者设计了一种基于新颖点曲率的几何引导损失,以端到端方式优化边界,避免了耗时的后处理,从而实现临床适用的分割。

小白学视觉 290

对5种主流编程语言的吐槽

不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,小编也慢慢的掌握了这些编程语言。接下来要为大家,介绍五款让人又爱又恨的编程语言! 1.C 语言 C 语言给人的感觉,就是一位神秘莫测而又高冷型的女生形象。这是因为 c 语言相比其他编程语言难度高一些,这也就多了一丝神秘,每当以为快要接近它时,它又狠心的推开!狠心的 C! 语!言

程序人生的博客 2764

Matlab:Matlab 软件学习之Matlab内置的各种系统的简介、案例应用(基于Simulink模糊控制仿真/二阶瞬态震荡电路案例)之详细攻略

选择左上角要编辑变量的图标,给定当前变量的论域Range,设置隶属函数类型type(八种隶属函数类型以供选择),最后选中某个隶属度函数(选中为红色),移动绘图区的每个隶属度函数的三个端点(竖向为权重)。(1)、首先在模糊规则编辑器左边选择一个输入变量,并选中它的一个语言值(隶属函数),然后编辑器右边选择一个输出变量,并选中它的一个语言值(隶属函数),然后将这种关系添加到模糊规则中。制定完成后,会形成模糊规则矩阵,系统会根据模糊输入量(如r1、r2),经过模糊规则(如45条),进而确定输出量(Y1、Y2)。

走向CTO之路 1122

凝聚态物理新引擎:AI 驱动材料预测与相变识别大突破

摘要:本文深入探讨 AI 在凝聚态物理中的创新应用。在材料性质预测方面,AI 借助数据收集、特征提取和模型训练,能依据材料微观信息准确预估其宏观性质,以石墨烯为例验证了高效性。对于拓扑相变识别,AI 通过分析量子力学数据,利用机器学习算法判别相变节点,助力拓扑绝缘体研究。尽管面临数据质量、模型可解释性等挑战,但未来多模态数据融合、可解释 AI 等发展方向,将推动 AI 与凝聚态物理深度融合,助力探索物质奥秘与新材料研发。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1825

您最喜欢的“非主流”编程语言是什么?

忘记Python&#65292;JavaScript&#65292;Java&#21644;&#20854;他&#27969;&#34892;的语言-您最&#21916;欢的“非主&#27969;&#8...

专业的开发者“讨论” 276

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

k8291121的博客 1099

世界上最好的编程语言

原文 http://blog.segmentfault.com/jysperm/1190000000400854 谈到这个话题,一定会有两种人跳出来。 一种人说,PHP 是世界上最好的编程语言;另一种人说,编程语言都大同小异,掌握了思想,什么都简单了。 首先我认为所有切实存在,功能重叠的事物,都是可以比较优劣的,有时不说出真相,只是真相太残酷。『优秀』并非...

weixin_30657541的博客 995

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python学习实验报告(第二周)

一、实验内容 1. 编写程序,用一个变量存储以下信息:学号,姓名,所在学院,专业名称。 class student: def __init__(self, num, name, academy, major): self.num = num self.name = name self.academy = academy self.major = major s1 = student("1", "张三", "软件学院", "软件工程")

qq_54176467的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

天津理工大学python期末复习

Python 3期末复习 常见问题总结 字符串操作 字符串的翻转 如:s1=“dkvkwd”,实现字符串的翻转并输出。 s1="dkvkwd" #第一种方式,通过对字符串的切片 print(s1[-1::-1]) #dwkvkd #第二种方式,将字符串放进列表中。利用reverse方法翻转,并用join方法拼接 l=list(s1) l.reverse() s2=''.join(l) print(s2) #dwkvkd 字符串的大小写转换 如:s1=“Constains drop wears th

qq_43600941的博客 1745

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

天津理工大学信息检索(数据分析)Python 期末考试复习

课程代码:0661283 环境:jupyter-notebook 主要总结一些菜鸟教程上的题或者课后题。 学习参考:https://www.515code.com/posts/aibyzrwu/ 第二章课后题 2-5 精确计算 2除以6,要求结果输出 1/3(分数形式) from fractions import Fraction a = Fraction(2,6) print(a) 2-8 字符串倒序 s1 = "map" # 方法1 print(s1[::-1]) # 方法2 l = list(s1)

banana_xray的博客 7150
上一篇: MCU定时器深度解析:从计数模式到PWM应用实战
下一篇: 嵌入式MCU底层开发:RS08指令集与时钟系统实战解析
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值