02- 模块化编程-002 DS1302数码显示时间与日期

news2024/11/5 18:42:00

1、数码显示时间日期的电路

 

2、电路原理简介

电路组件与功能

  1. 单片机( PIC16F887)

    • 作为系统的主控芯片,处理所有输入输出,进行时间控制和显示信息更新。
  2. DS1302(实时时钟芯片)

    • 用于记录当前的日期和时间。
    • 通过 SPI 接口与单片机连接,传输时间数据。
    • 需要接入一个电池(如 CR2032)以备份时间,即使在断电情况下也能保持计时。
  3. MAX7219(LED驱动芯片)

    • 驱动数码管显示器,以显示时间和日期信息。
    • 支持多个段显示,简化了与单片机的连接。
  4. 数码管

    • 用于显示时钟信息,例如小时、分钟、秒和日期。
    • 通过 MAX7219 进行控制和数据显示。
  5. 晶体振荡器(X2)

    • 连接在 DS1302 上,提供稳定的时钟信号(通常为 32.768 kHz)以确保时间准确计时。

连接说明

  • DS1302 连接

    • VCC 和 GND:连接到电源和接地。
    • SCLK:连接到单片机的 SPI 时钟引脚,控制时序。
    • IO:双向数据线,单片机与 DS1302 之间传输时间数据。
    • CE:使能信号,激活 DS1302 进行数据传输。
  • MAX7219 连接

    • DIN:连接单片机数据输出,用于发送显示数据。
    • CLK:连接到单片机时钟信号。
    • LOAD:控制数据加载信号,也连接到单片机。
  • 数码管连接

    • 通过 MAX7219 驱动各个段,便于显示时间和日期。
    • 具体连接方式根据显示要求进行布局。

工作原理

  1. 初始化

    • 系统开机后,单片机初始化 DS1302,从 DS1302 获取当前时间并更新到显示器上。
  2. 时间管理

    • DS1302 定期通过其内置时钟更新时间,单片机会定期读取这些数据并处理。
  3. 数据显示

    • MAX7219 根据单片机发送的信息实时更新数码管上的显示,展示当前时间(小时、分钟、秒)及日期(如“日期”)。
  4. 电池备份

    • 即使在断电情况下,加入的电池会保持 DS1302 的计时功能,使得时间不会丢失。

 

3、软件代码

3.1 DS1302.c

//***************************************************************************
//* 文件名: DS1302.c
//* 文件描述: DS1302 实时时钟模块
//* 编译环境: Windows XP + MPLAB IDE 8.83 + PICC 9.60
//* 编程者: bianjingyuan
//* 编程日期: 2020年10月08日
//* 版本号: 1.0
//*
//* 硬件资源分配:
//*   ds1302_clk   RE0    // 实时时钟时钟线引脚
//*   ds1302_io    RE1    // 实时时钟数据线引脚
//*   ds1302_rst   RE2    // 实时时钟复位线引脚
//***************************************************************************

#include "DS1302.h"

// 设置时间初始值数组 (秒、分、小时、星期、日、月、年)
const uchar time_set[7] = {0x00, 0x38, 0x12, 0x29, 0x09, 0x05, 0x06}; 

//********************************************************************
//* 函数名: ds1302_Open
//* 功能描述: 打开 DS1302
//* 函数说明: 将 DS1302 复位线和时钟线置为正确状态
//* 调用函数: 无
//* 全局变量: ds1302_rst、ds1302_io、ds1302_clk
//* 输 入: 无
//* 返回: 无
//********************************************************************
void ds1302_Open(void)
{
    ds1302_clk = 0;   // 时钟线拉低
    ds1302_rst = 0;   // 禁止 DS1302
    ds1302_io = 1;    // 释放数据总线
    ds1302_rst = 1;   // 使能 DS1302
}

//********************************************************************
//* 函数名: ds1302_close
//* 功能描述: 关闭 DS1302
//* 函数说明: 将 DS1302 复位线和时钟线置为正确状态
//* 调用函数: 无
//* 全局变量: ds1302_rst、ds1302_io、ds1302_clk
//* 输 入: 无
//* 返回: 无
//********************************************************************
void ds1302_close(void)
{
    ds1302_rst = 0;   // 禁止 DS1302
    ds1302_io = 1;    // 释放数据总线
    ds1302_clk = 1;   // 时钟线拉高
}

//********************************************************************
//* 函数名: ds1302_write_byte
//* 功能描述: 向 DS1302 写入一个字节数据
//* 函数说明: 通过 DS1302 的时钟线和数据线发送一个字节数据
//* 调用函数: asm("NOP")
//* 全局变量: ds1302_clk、ds1302_io、CARRY
//* 输 入: unsigned char address
//* 返回: 无
//********************************************************************
void ds1302_write_byte(unsigned char address)
{
    unsigned char k, data;
    data = address;
    for (k = 8; k > 0; k--)   // 发送 8 位数据
    {
        ds1302_clk = 0;       // 时钟线拉低
        asm("NOP");           // 空操作
        data = data >> 1;     // 数据右移一位
        ds1302_io = CARRY;    // 将进位标志写入数据线
        ds1302_clk = 1;       // 时钟线拉高
        asm("NOP");           // 空操作
    }
}

//********************************************************************
//* 函数名: ds1302_read_byte
//* 功能描述: 从 DS1302 读取一个字节数据
//* 函数说明: 通过 DS1302 的时钟线和数据线读取一个字节数据
//* 调用函数: asm("NOP")
//* 全局变量: ds1302_io、TRISE1、dat
//* 输 入: 无
//* 返回: unsigned char 读取的数据
//********************************************************************
unsigned char ds1302_read_byte(void)
{
    unsigned char i, data;
    data = 0;
    dat = 0;
    ds1302_io = 1;    // 释放数据总线
    ds1302_clk = 0;   // 时钟线拉低
    TRISE1 = 1;       // 设置 RE1 为输入
    for (i = 8; i > 0; i--)  // 读取 8 位数据
    {
        data = ds1302_io;    // 读取数据线状态
        data = data << (8 - i);  // 左移相应位数
        dat = dat + data;    // 组合成一个字节
        ds1302_clk = 1;      // 时钟线拉高
        ds1302_clk = 0;      // 时钟线拉低
    }
    TRISE1 = 0;       // 设置 RE1 为输出
    return (dat);     // 返回读取的数据
}

//********************************************************************
//* 函数名: ds1302_write
//* 功能描述: 向 DS1302 写入数据
//* 函数说明: 先写入地址,再写入数据
//* 调用函数: ds1302_write_byte
//* 全局变量: ds1302_rst、ds1302_clk
//* 输 入: unsigned char add, unsigned char byte
//* 返回: 无
//********************************************************************
void ds1302_write(unsigned char add, unsigned char byte)
{
    ds1302_rst = 0;   // 禁止 DS1302
    ds1302_clk = 0;   // 时钟线拉低
    ds1302_rst = 1;   // 使能 DS1302
    ds1302_write_byte(add);   // 写入地址
    ds1302_write_byte(byte);  // 写入数据
    ds1302_rst = 0;   // 禁止 DS1302
}

//********************************************************************
//* 函数名: ds1302_read
//* 功能描述: 从 DS1302 读取数据
//* 函数说明: 先写入地址,再读取数据
//* 调用函数: ds1302_write_byte、ds1302_read_byte
//* 全局变量: ds1302_rst、ds1302_clk、ds1302_io、dat
//* 输 入: unsigned char add
//* 返回: unsigned char 读取的数据
//********************************************************************
unsigned char ds1302_read(unsigned char add)
{
    ds1302_rst = 0;   // 禁止 DS1302
    ds1302_clk = 0;   // 时钟线拉低
    ds1302_rst = 1;   // 使能 DS1302
    ds1302_write_byte(add);   // 写入地址
    ds1302_io = 1;    // 释放数据总线
    ds1302_read_byte();      // 读取数据
    ds1302_rst = 0;   // 禁止 DS1302
    return (dat);     // 返回读取的数据
}

//********************************************************************
//* 函数名: timeset
//* 功能描述: 设置 DS1302 的时间
//* 函数说明: 先允许写入时间,然后循环写入时间数据
//* 调用函数: ds1302_write
//* 全局变量: time_set
//* 输 入: 无
//* 返回: 无
//********************************************************************
void timeset(void)
{
    unsigned char i;
    ds1302_write(0x8e, 0x00);  // 允许写入时间
    for (i = 0; i < 7; i++)
        ds1302_write(0x80 + i + i, time_set[i]);  // 设置时间
}

//********************************************************************
//* 函数名: ds1302_read_time
//* 功能描述: 读取 DS1302 的当前时间
//* 函数说明: 循环读取 DS1302 的时间数据(BCD 码)
//* 调用函数: ds1302_read
//* 全局变量: timerbcd
//* 输 入: 无
//* 返回: 无
//********************************************************************
void ds1302_read_time(void)
{
    unsigned char i;
    for (i = 0; i < 7; i++)
        timerbcd[i] = ds1302_read(0x81 + i + i);  // 读取时间数据(BCD 码)
}

3.2 main.c

//********************************************************************
//* 文件名: main.c
//* 文件描述: PIC16F887A,用于子程序实现实时时钟DS1302的驱动及显示
//* 编译环境:Windows XP + MPLAB IDE 8.83 + Picc 9.60
//* 编程者:bianjingyuan
//* 编程日期:2024年10月30日
//* 版本号:1.0
//*******************************************************************/

// 引入头文件
#include "pic.h"
#include "DS1302.h"
#include "max7219.h"
#include "PIC16F887_Delay.h"

// 定义数据类型
#define uchar unsigned char 
#define uint  unsigned int
#define ulong unsigned long

// 定义单片机指令
#define nop    asm("NOP")      // 执行空操作指令
#define sleep  asm("sleep")    // 进入睡眠模式

// 定义DS1302引脚连接PIC16F887A
#define ds1302_clk  RE0        // 实时时钟时钟线引脚 
#define ds1302_io   RE1        // 实时时钟数据线引脚 
#define ds1302_rst  RE2        // 实时时钟复位线引脚 

// 定义数码管引脚连接 max7219 
#define din   RD5              // 数据输入引脚
#define clk_1 RD7=1            // 时钟高电平
#define clk_0 RD7=0            // 时钟低电平
#define load_1 RD6=1           // 锁存高电平
#define load_0 RD6=0           // 锁存低电平

// 定义芯片工作时的配置位
__CONFIG (0x3F3A); // 设置配置字

// 定义变量
uchar m, k, i, l, add, dat, c0; // 临时变量
uchar add8, add7, add6, add5, add4, add3, add2, add1; // 显示位数据
uchar timerbcd[7];  // 存放从DS1302读回的时间数据(BCD码)
uchar timerint[7]; // 存放将BCD码转换成十进制后的时间数据

// 系统初始化
void initial(void)
{
    // 配置OPTION寄存器
    OPTION = 0b11000010; // 设置看门狗定时器、定时器0预分频器等

    // 配置I/O口
    TRISA = 0b101111;   // 配置RA4为输出,其他为输入
    TRISB = 0b000000;   // 配置RB0和RB1为输入
    TRISC = 0b000000;   // 配置RC3和RC5为输入
    TRISD = 0b000000;   // 配置RD0和RD1为输入
    TRISE = 0b00001000; // 配置RE0、RE1和RE2为输出

    // 关闭所有中断
    INTCON = 0b00000000; // 关闭所有中断

    // 初始化端口
    PORTA = 0b00000000; // PORTA初始化为0
    PORTB = 0b00000001; // PORTB初始化为1
    PORTC = 0b00000000; // PORTC初始化为0
    PORTD = 0b00000000; // PORTD初始化为0
    PORTE = 0b00000000; // PORTE初始化为0

    // 配置ADC相关寄存器
    ADCON0 = 0b10000000; // 设置A/D转换通道为AN0,并使能A/D转换
    ADCON1 = 0b00001001; // 设置A/D转换参考电压为VDD和VSS
    ANSEL = 0b00001111;  // 设置RA0为模拟输入,RA2和RA3为模拟模块的VREF-和VREF+
    ANSELH = 0b00000000; // 设置所有PORTB和PORTC引脚为数字I/O
    ADRESH = 0b00000000; // 清空A/D转换结果高8位
    ADRESL = 0b00000000; // 清空A/D转换结果低8位

    // 初始化变量
    add1 = add2 = add3 = 0b00000000; // 初始化变量add1、add2和add3为0

    // 配置中断
    GIE = 0b00000000;    // 关闭总中断
    PEIE = 0b00000000;   // 关闭外围设备中断
    T0IE = 0b00000001;   // 开启定时器0中断
    T0IF = 0b00000000;   // 清除定时器0中断标志
    INTF = 0b00000000;   // 清除外部中断标志

    // 初始化定时器BCD值
    timerbcd[0] = 0b00000000; // 初始化定时器BCD数组的第一个元素为0
}

/********************************************************************
//* 文件名: main.c
//* 文件描述: DS1302时钟模块读取和显示程序
//* 编译环境: Windows XP + MPLAB IDE 8.83 + PICC 9.60
//* 编程者: bianjingyuan
//* 编程日期: 2023-05-01
//* 版本号: 1.0
//********************************************************************/

// 主函数
void main()
{
    initial(); // 系统初始化
    // 初始化DS1302引脚
    ds1302_clk = 0; // 设置时钟线低电平
    ds1302_io = 0;  // 设置数据线低电平
    ds1302_rst = 0; // 设置复位线低电平
    max7219_int();  // 初始化数码管芯片
    ds1302_Open();  // 打开DS1302
    timeset();      // 设置时间(如需设置时间,取消注释)

redo: 
    nop; // 空操作
    ds1302_read_time(); // 读取DS1302时间
    ds1302_write(0x8e, 0x80); // 禁止写入DS1302

    // 将BCD码转换为十进制
    for (i = 7; i > 0; i--)
    {
        timerint[7 - i] = timerbcd[7 - i] & 0x0f; // 取个位数据
        k = timerbcd[7 - i] >> 4; // 取十位数据
        timerint[7 - i] = (10 * (k & 7)) + (timerint[7 - i]); // 转换为十进制
    }

    // 将时间数据分别存入显示数据数组
    c0 = timerint[0]; // 秒
    add7 = c0 / 10;   // 秒的十位
    add8 = c0 % 10;   // 秒的个位
    c0 = timerint[1]; // 分
    add5 = c0 / 10;   // 分的十位
    add6 = c0 % 10;   // 分的个位
    c0 = timerint[2]; // 时
    add3 = c0 / 10;   // 时的十位
    add4 = c0 % 10;   // 时的个位
    c0 = timerint[3]; // 日
    add1 = c0 / 10;   // 日的十位
    add2 = c0 % 10;   // 日的个位

    // 发送显示数据到数码管芯片
    send(0x01, add1); delayms(5);//显示日期
    send(0x02, add2); delayms(5);
    send(0x03, add3); delayms(5);//显示小时
    send(0x04, add4); delayms(5);
    send(0x05, add5); delayms(5);//显示分钟
    send(0x06, add6); delayms(5);
    send(0x07, add7); delayms(5);//显示秒
    send(0x08, add8); delayms(5);

    goto redo; // 循环显示
}

4、代码解析

4.1 ds1302.c

        此代码实现了与实时时钟模块DS1302的通信和控制,可以设置和读取DS1302的时间数据。主要功能包括:

        1. 初始化DS1302的时钟线和复位线,使能或禁止DS1302。
        2. 向DS1302写入数据,包括地址和时间值,以设置时间。
        3. 从DS1302读取数据,获取当前时间。时间数据以BCD码格式存储。
        4. 提供时间设置函数`timeset`和时间读取函数`ds1302_read_time`,方便外部调用实现时间管理功能。

        通过该程序,用户可以方便地控制DS1302,设置或获取所需的时间信息。特别是在需要实时时钟功能的嵌入式应用中,该程序可以起到关键作用。

4.2 main.c

        该程序基于PIC16F887A微控制器实现对DS1302实时时钟芯片的驱动。通过读取DS1302的时间数据,将其转换为十进制后,利用MAX7219驱动数码管显示时间。主要功能包括:

        1. 初始化PIC16F887A的相关I/O端口及ADC模块。
        2. 初始化并打开DS1302实时时钟模块。
        3. 定义并使用定时器中断实现对时间的读取与显示。
        4. 将从DS1302读取的BCD码格式时间数据转换为十进制。
        5. 利用MAX7219芯片实现时间数据的数码管显示。

5、硬件资源分配表

序号单片机引脚功能定义字符串替代定义功能内容备注
1RE0ds1302_clk-DS1302时钟线连接DS1302
2RE1ds1302_io-DS1302数据线连接DS1302
3RE2ds1302_rst-DS1302复位线连接DS1302
4RD5din-数据输入引脚连接MAX7219
5RD7clk_1/clk_0-时钟高低电平连接MAX7219
6RD6load_1/load_0-锁存高低电平连接MAX7219

        通过控制DS1302的时钟线、数据线和复位线,实现对实时时钟芯片的初始化、读写操作。通过控制MAX7219的数码管引脚,实现时间的数码管显示。
 

6、软件流程图

 

7、仿真运行结果

 好了,暂时这些,下一次使用液晶来显示时间与日期。20241103

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕设课设—Java聊天室(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方 java计算机毕设课设—Java聊天室(附源码、文章、相关截图、部署视频) Java聊天室系统是一个基于Java语言开发的在线即时通讯平台&#xff0c;旨在为用户提供一个简单、易用的实时交流环境。该系统支持多用户同时在线交流&…

编译原理第一次实验报告

源代码及附件&#xff1a;编译原理实验一源程序及附件资源-CSDN文库实验题目 实验要求 实验设计 前两部分指出了实验的宏观把控&#xff0c;为了具体实施实验&#xff0c;我们需要预先为实验做出如下设计&#xff1a; 本次实验我选取了C语言的一个子集进行设计词法分析器&…

Llama 3.2 Vision Molmo:多模态开源生态系统基础

编者按&#xff1a; 视觉功能的融入对模型能力和推理方式的影响如何&#xff1f;当我们需要一个既能看懂图像、又能生成文本的 AI 助手时&#xff0c;是否只能依赖于 GPT-4V 这样的闭源解决方案&#xff1f; 我们今天为大家分享的这篇文章&#xff0c;作者的核心观点是&#xf…

C++_day01

目录 0. 课前须知 1. C发展历史&#xff08;了解&#xff09; 2. C特点&#xff08;熟悉&#xff09; 3. 面向对象核心术语&#xff08;熟悉&#xff09; 4. 开发环境 5. 新建项目 4. 开发环境 5. 新建项目 0. 课前须知 C的思维与C语言完全不同&#xff0c;不能生搬硬套。 C偏向…

安娜的档案(Anna’s Archive) 镜像网站/国内最新可访问入口(持续更新)

安娜的档案&#xff08;Anna’s Archive&#xff09;是一个颇受关注的资源库。它涵盖了广泛的内容&#xff0c;可能包括各类文献、资料等。其特色在于丰富的信息储备和一定的系统性。安娜的档案&#xff08;Anna’s Archive&#xff09;用户可以从中获取多样的知识和数据&#…

Linux 下执行定时任务之 Systemd Timers

不知道 ECS 因为什么缘故&#xff0c;上面安装的 MySQL 服务老是不定期挂掉&#xff0c;本来想通过 Linux 得 Cron 配置个半小时的定时检测任务&#xff0c;结果一直没有执行&#xff0c;因此又尝试使用了 Systemd Timers 进行了重新配置&#xff0c;简要做个记录。 Systemd Ti…

【星闪EBM-H63开发板】AT固件的接口简介

引言 前面介绍了星闪EBM-H63开发板的透传固件&#xff0c;现在介绍一下AT固件。AT固件比透传固件要复杂的多&#xff0c;都让功能也多很多&#xff0c;可以配置很多星闪相关的参数。AT固件没有AT命令模式和数据模式切换的问题&#xff0c;因为收发的数据是出现在AT命令中的。 …

51单片机教程(四)- 点亮LED灯

1、项目分析 让输入/输出口的P1.0连接一盏LED灯进行点亮。 2、技术准备 1 LED组成 ​ 说明 二极管有 P型 和 N型材料构成&#xff0c;通常是&#xff1a;硅/锗 掺杂其他元素&#xff08;硼、磷等&#xff09; 电子是带负电的&#xff0c;是负电荷的载体&#xff0c;电子流…

开源库 FloatingActionButton

开源库FloatingActionButton Github:https://github.com/Clans/FloatingActionButton 这个库是在前面这个库android-floating-action-button的基础上修改的&#xff0c;增加了一些更强大和实用的特性。 特性&#xff1a; Android 5.0 以上点击会有水波纹效果 可以选择自定义…

Ubuntu 24.04上启用 root 用户通过 SSH 和图形界面进行登录

一、启用 root 用户的密码登录 设置 root 用户密码&#xff1a; 在终端中输入以下命令为 root 用户设置一个密码&#xff1a; testtest-virtual-machine:~$ sudo passwd root [sudo] test 的密码&#xff1a; 新的密码&#xff1a; 无效的密码&#xff1a; 密码是一个回文…

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…

基于vue框架的的考研信息共享平台v0eyp(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;国家政策,用户,院校政策,院校信息,考研资料,资料分类,考研论坛 开题报告内容 基于Vue框架的考研信息共享平台开题报告 一、研究背景与意义 随着考研人数的逐年增长&#xff0c;考研学生对高效、便捷、个性化的信息获取需求愈发强烈。…

区别:矩阵合同和矩阵酉相似

矩阵的合同和酉相似在许多方面具有相似性&#xff0c;但也有明显的区别。 定义 矩阵合同&#xff1a;给定矩阵 A 和 B &#xff0c;若存在一个非奇异矩阵 P &#xff0c;使得 则称矩阵 A 和 B 是合同的。合同变换常用于实对称矩阵的特征问题等。 酉相似&#xff1a;给定矩阵 …

海的回忆:海滨学院班级记忆录技术实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

半个月,练完这50个Python实战项目你就牛了!

今日精选50个Python实战项目&#xff0c;边做边学&#xff0c;让Python技能突飞猛进&#xff01; 好记性不如烂笔头&#xff0c;实践是提升技能的王道&#xff01;这70个项目涵盖广泛&#xff0c;难度亲民&#xff0c;特别适合Python新手入门与进阶。它们不仅实用性强&#xf…

贪心算法习题其三【力扣】【算法学习day.20】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【Python游戏开发】石头剪刀布游戏(附完整Python完整代码)

石头剪刀布游戏:Pygame实现 结果图前言核心函数思考步骤实现原理和公式代码实现结论结果图 前言 石头剪刀布是一种经典的猜拳游戏,简单易玩但却蕴含着一定的策略性。本文将介绍如何使用Python和Pygame库开发一个简单的石头剪刀布游戏,并探讨其中的核心功能实现和思考过程。 …

Python | Leetcode Python题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution:def countArrangement(self, n: int) -> int:f [0] * (1 << n)f[0] 1for mask in range(1, 1 << n):num bin(mask).count("1")for i in range(n):if mask & (1 << i) and (num % (i …

阿里云k8s-master部署CNI网络插件遇到的问题

问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件&#xff0c;可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行&#xff0c;k8s-master都是Not ready的状态 ca…

【数据结构与算法】第8课—数据结构之二叉树(堆)

文章目录 1. 树1. 什么是树&#xff1f;1.2 树的相关概念1.3 树的表示法 2. 二叉树2.1 特殊的二叉树2.2 二叉树的性质2.3 二叉树的存储结构 3. 实现顺序结构二叉树3.1 堆的概念3.2 堆的实现3.2.1 堆的数据结构3.2.2 堆的初始化3.2.3 堆插入数据3.2.4 删除堆顶数据3.2.5 堆的判空…