蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

news2024/11/27 10:33:38

题目要求:

一、基本要求

1.1 使用 CT107D 单片机竞赛板,完成“电子钟”功能的程序设计与调试;
1.2 设计与调试过程中,可参考组委会提供的“资源数据包”;
1.3 Keil 工程文件以准考证号命名,保存在以准考证号命名的考生文件夹中。

二、硬件框图

三、功能描述

3.1 初始化

1 )关闭蜂鸣器、继电器等无关外设;
2 )设备初始化时钟为 23 59 50 秒,闹钟提醒时间 0 0 0 秒。

3.2 显示功能

1) 时间显示格式
2) 温度显示格式

3.3 按键功能

1 )按键 S7 定义为“时钟设置”按键,通过该按键可切换选择待调整的
时、分、秒,当前选择的显示单元以 1 秒为间隔亮灭,时、分、秒
的调整需注意数据边界属性。
2 )按键 S6 定义为“闹钟设置”按键,通过该按键可进入闹钟时间设置
功能,数码管显示当前设定的闹钟时间。
3 )按键 S5 定义为“加”按键,在“时钟设置”或“闹钟设置”状态下,
每次按下该按键当前选择的单元(时、分或秒)增加 1 个单位。
4 )按键 S4 定义为“减”按键,在“时钟设置”或“闹钟设置”状态下,
每次按下该按键当前选择的单元(时、分或秒)减少 1 个单位。
5 )按键功能说明:
按键 S4 S5 的“加”、“减”功能只在“时钟设置”或“闹钟设置”
状态下有效;
在 “时钟显示”状态下,按下 S4 按键,显示温度数据,松开按键,
返回“时钟显示”界面。

3.4 闹钟提示功能

1 )指示灯 L1 0.2 秒为间隔闪烁,持续 5 秒钟;
2 )闹钟提示状态下,按下任意按键,关闭闪烁提示功能。

底层函数内容:


1.初始化底层驱动专用文件

比如先用3个IO口控制74HC138译码器,控制Y4为低电平;当Y4为低电平时,或非门74HC02控制Y4C为高电平,使74HC573的OE端口有效,OE端口有效时,可使用P0口控制LED的亮灭。
可以去多了解74HC138译码器,74HC02或非门,74HC573八路输出透明锁存器的相关内容会更好理解
#include <Init.h>

//关闭外设
void System_Init()
{
    P0 = 0xff;
    P2 = P2 & 0x1f | 0x80;
    P2 &= 0x1f;
    P0 = 0x00;
    P2 = P2 & 0x1f | 0xa0;
    P2 &= 0x1f;
}

#include <STC15F2K60S2.H>
void System_Init();

2.Led底层驱动专用文件

与初始化底层驱动专用文件同理,需要了解对应的锁存器控制,可以在使用的芯片数据手册查看
#include <Led.h>

void Led_Disp(unsigned char addr,enable)
{
    static unsigned char temp = 0x00;
    static unsigned char temp_old = 0xff;
    if(enable)
        temp |= 0x01 << addr;
    else
        temp &= ~(0x01 << addr);
    if(temp != temp_old)
    {
        P0 = ~temp;
        P2 = P2 & 0x1f |0x80;
        P2 &= 0x1f;
        temp_old = temp;
    }
}

#include <STC15F2K60S2.H>
void Led_Disp(unsigned char addr,enable);


3.按键底层驱动专用文件

(板子上的按键从按键4开始到按键19,可根据实际硬件修改)
#include "Key.h"
unsigned char Key_Read()
{
    unsigned char temp = 0;
    if(P33 == 0)temp = 4;
    if(P32 == 0)temp = 5;
    if(P31 == 0)temp = 6;
    if(P30 == 0)temp = 7;
    return temp;
}
//头文件
#include <STC15F2K60S2.H>

unsigned char Key_Read();

4.数码管底层驱动专用文件

(这个板子使用的为共阳数码管,若使用的为共阴数码管要更换对应的段码表和位选表;与初始化底层驱动专用文件同理,需要了解对应的锁存器控制,可以在使用的芯片数据手册查看)
#include <Seg.h>
code unsigned char Seg_Dula[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xff,
//0x88, //A
//0x83, //b
//0xc6, //C
//0xa1, //d
//0x86, //E
//0x8e //F
0xbf, //-
0xc6
};
unsigned char Seg_Wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Seg_Disp(unsigned char wela,dula,point)
{
    P0 = 0xff;
    P2 = P2 & 0x1f | 0xe0;
    P2 &= 0x1f;
    P0 = Seg_Wela[wela];
    P2 = P2 & 0x1f | 0xc0;
    P2 &= 0x1f;
    P0 = Seg_Dula[dula];
    if(point)
        P0 &= 0x7f;
    P2 = P2 & 0x1f | 0xe0;
    P2 &= 0x1f;
}
//头文件
#include <STC15F2K60S2.H>

void Seg_Disp(unsigned char wela,dula,point);

5.//温度底层驱动专用头文件

/*    #     单总线代码片段说明
    1.     本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
    2.     参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
        中对单片机时钟频率的要求,进行代码调试和修改。
*/
/*    #     单总线代码片段说明
    1.     本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
    2.     参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
        中对单片机时钟频率的要求,进行代码调试和修改。
*/

#include "onewire.h"
sbit DQ = P1^4;

//单总线内部延时函数

void Delay_OneWire(unsigned int t)  
{
    unsigned char i;
    while(t--){
        for(i=0;i<12;i++);
    }
}

//单总线写操作

void Write_DS18B20(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ = 0;
        DQ = dat&0x01;
        Delay_OneWire(5);
        DQ = 1;
        dat >>= 1;
    }
    Delay_OneWire(5);
}

//单总线读操作

unsigned char Read_DS18B20(void)
{
    unsigned char i;
    unsigned char dat;
  
    for(i=0;i<8;i++)
    {
        DQ = 0;
        dat >>= 1;
        DQ = 1;
        if(DQ)
        {
            dat |= 0x80;
        }        
        Delay_OneWire(5);
    }
    return dat;
}

//DS18B20初始化

bit init_ds18b20(void)
{
      bit initflag = 0;
      
      DQ = 1;
      Delay_OneWire(12);
      DQ = 0;
      Delay_OneWire(80);
      DQ = 1;
      Delay_OneWire(10); 
    initflag = DQ;     
      Delay_OneWire(5);
  
      return initflag;
}

//函数名:读取温度函数

//入口参数:无
//函数功能:完成温度转换,并返回转换之后的温度数据
float Read_Temperature()
{
    unsigned char high,low;//返回温度数据的低八位和高八位
    init_ds18b20();//初始化
    Write_DS18B20(0xcc);//跳过ROM
    Write_DS18B20(0x44);//开始温度转换
    init_ds18b20();//初始化
    Write_DS18B20(0xcc);//跳过ROM
    Write_DS18B20(0xbe);//读取温度
    low = Read_DS18B20();//读取低位
    high = Read_DS18B20();//读取高位
    return ((high << 8) |low) / 16.0;//返回温度保留后两位精度数据

}
//头文件
#include <STC15F2K60S2.H>

float Read_Temperature();

6.//时钟底层驱动专用头文件

/*    #     DS1302代码片段说明
    1.     本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
    2.     参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
        中对单片机时钟频率的要求,进行代码调试和修改。

*/    
#include "ds1302.h"
#include <intrins.h>

sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;

//写字节

void Write_Ds1302(unsigned  char temp) 
{
    unsigned char i;
    for (i=0;i<8;i++)         
    { 
        SCK = 0;
        SDA = temp&0x01;
        temp>>=1; 
        SCK=1;
    }
}   


//向DS1302寄存器写入数据

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
     RST=0;    _nop_();
     SCK=0;    _nop_();
     RST=1;     _nop_();  
     Write_Ds1302(address);    
     Write_Ds1302(dat);        
     RST=0; 
}

//从DS1302寄存器读出数据

unsigned char Read_Ds1302_Byte ( unsigned char address )
{
     unsigned char i,temp=0x00;
     RST=0;    _nop_();
     SCK=0;    _nop_();
     RST=1;    _nop_();
     Write_Ds1302(address);
     for (i=0;i<8;i++)     
     {        
        SCK=0;
        temp>>=1;    
         if(SDA)
         temp|=0x80;    
         SCK=1;
    } 
     RST=0;    _nop_();
     SCK=0;    _nop_();
    SCK=1;    _nop_();
    SDA=0;    _nop_();
    SDA=1;    _nop_();
    return (temp);            
}

//设置时钟,可以根据数据手册调整要设置的时钟状态,这里设置的为时分秒

void Set_Rct(unsigned char*ucRct)//unsigned char* ucRtc指向我存放时分秒的数组指针
{
    unsigned char i;

    Write_Ds1302_Byte(0x8e,0x00);
    for(i=0;i<3;i++)
    Write_Ds1302_Byte(0x84-2*i,ucRct[i]);
    Write_Ds1302_Byte(0x8e,0x80);
}

//读取时钟

void Read_Rct(unsigned char*ucRct)
{
    unsigned char i;
    for(i=0;i<3;i++)
    ucRct[i] = Read_Ds1302_Byte(0x85-2*i);
}
//头文件
#include <STC15F2K60S2.H>

void Write_Ds1302(unsigned  char temp) ;
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte ( unsigned char address );
void Set_Rct(unsigned char*ucRct);
void Read_Rct(unsigned char*ucRct);

工程主函数内容:

1.头文件声明(把需要用到的头文件添加进来)

//头文件声明区
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include "Init.h"//初始化底层驱动专用头文件
#include "Led.h"//Led底层驱动专用头文件
#include "Key.h"//按键底层驱动专用头文件
#include "Seg.h"//数码管底层驱动专用头文件
#include "ds1302.h"//时钟底层驱动专用头文件
#include "onewire.h"//温度底层驱动专用头文件

2.变量声明(把需要用到的所有变量现在这里进行声明)

//变量声明区
unsigned char Key_Val,Key_Old,Key_Down,Key_Up;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量
unsigned char Seg_Buf[8] = {10,10,10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Point[8] = {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组

unsigned char Seg_Disp_Mode;//数码管显示模式变量 0-时间相关 1-温度相关
unsigned char Seg_Index;//时间相关显示内容 0-时钟显示 1-时钟设置 2-闹钟设置
unsigned char ucRct[3] = {0x23,0x59,0x50};//实时时钟数据数组 上电默认时间23:59:55
unsigned char ucRct_Set[3] = {0x23,0x59,0x50};//时钟数据设置数组
unsigned char ucRct_Index;//时钟设置数组指针
unsigned int Timer_500ms;//五百毫秒计时变量
bit Seg_Star_Flag;//数码管闪烁标志位
unsigned char Alarm[3] = {0x00,0x00,0x00};//闹钟数据储存数组
unsigned char Alarm_Set[3] = {0x00,0x00,0x00};//闹钟数据设置数组
unsigned char* Data_Flag[3] = {ucRct,ucRct_Set,Alarm_Set};//简化程序专用指针数组
bit Beep_Flag;//闹钟使能标志位 0-不使能 1-使能
unsigned int Timer_200ms;//两百毫秒计时变量
bit Led_Star_Flag;//Led闪烁标志位
unsigned char Temperature;//实时温度储存变量

3.按键处理函数(在这里编写按键控制的函数)

//键盘处理函数
void Key_Proc()
{
    unsigned char i;//For循环专用变量
    if(Key_Slow_Down)return;
    Key_Slow_Down = 1;//键盘减速程序
    Key_Val = Key_Read();//实时读取键码值
    Key_Down = Key_Val & (Key_Val ^ Key_Old);//捕捉按键下降沿
    Key_Up = ~ Key_Val & (Key_Val ^ Key_Old);//捕捉按键上升沿
    Key_Old = Key_Val;//辅助扫描变量
    
    if(Beep_Flag == 1)//闹钟使能状态
    {
        if(Key_Down != 0)//按下任意按键
            Beep_Flag = 0;//关闭闹钟
        return;//跳出按键子程序 避免执行下面的语句
    }
    if(Seg_Index == 0)//处于非设置界面
    {
        if(Key_Old == 4)
            Seg_Disp_Mode = 1;
        else
            Seg_Disp_Mode = 0;
    }
    switch (Key_Down)
    {
        case 7://时钟设置
            if(Seg_Disp_Mode == 0)//处于时钟相关界面
            {
                if(Seg_Index == 0)//处于时钟显示界面
                {
                    for(i=0;i<3;i++)
                        ucRct_Set[i] = ucRct[i];//读取实时数据
                    Seg_Index = 1;//切换到时钟设置界面
                }
                else if(Seg_Index == 1)//处于时钟设置界面
                {
                    if(++ucRct_Index == 3)
                    {
                        Set_Rct(ucRct_Set);//保存时钟数据
                        ucRct_Index = 0;//切换到时钟显示界面
                        Seg_Index = 0;//指针复位
                    }
                }
            }
            break;
        case 6://闹钟设置
            if(Seg_Disp_Mode == 0)//处于时钟相关界面
            {
                if(Seg_Index == 0)//处于时钟显示界面
                    Seg_Index = 2;//切换到闹钟设置界面
                else if(Seg_Index == 2)//处于闹钟设置界面
                {
                    if(++ucRct_Index == 3)
                    {
                        for(i=0;i<3;i++)
                        Alarm[1] = Alarm_Set[i];//保存闹钟数据
                        ucRct_Index = 0;//切换到时钟显示界面
                        Seg_Index = 0;//指针复位
                    }
                }
            }
            break;
        case 5://参数自加
            if(Seg_Disp_Mode == 0)//时钟相关
            {
//                if(Seg_Index == 1)//设置时钟
//                {
//                    ucRct_Set[ucRct_Index]++;
//                    if(ucRct_Set[ucRct_Index] % 16 == 0x0a)//16进制 (9+1)=A
//                        ucRct_Set[ucRct_Index] += 6;//16进制(A+6)=10
//                    if(ucRct_Set[ucRct_Index] == (ucRct_Index?0x60:0x24))//使用BCD码的形式存储,用十六进制计算显示
//                        ucRct_Set[ucRct_Index] = (ucRct_Index?0x59:0x23);
//                }
                Data_Flag[Seg_Index][ucRct_Index]++;
                if(Data_Flag[Seg_Index][ucRct_Index] % 16 == 0x0a)//16进制 (9+1)=A //使用BCD码的形式存储,用十六进制计算显示
                    Data_Flag[Seg_Index][ucRct_Index] += 6;//16进制(A+6)=10
                if(Data_Flag[Seg_Index][ucRct_Index] == (ucRct_Index?0x60:0x24))//设置上限
                    Data_Flag[Seg_Index][ucRct_Index] = (ucRct_Index?0x59:0x23);
                    
            }
            break;
            case 4:
            if(Seg_Disp_Mode == 0)//时钟相关
            {
//                if(Seg_Index == 1)//设置时钟
//                {
//                    ucRct_Set[ucRct_Index]--;
//                    if(ucRct_Set[ucRct_Index] % 16 == 0x0f)//16进制 (10-1)=F //BCD码需要手动进行十进制进位
//                        ucRct_Set[ucRct_Index] -= 6;//16进制 (F-6)=9
//                    if(ucRct_Set[ucRct_Index] == 0xf9)//16进制(0-7)=FFFF FFFF FFFF FFF9 取最后两位
//                        ucRct_Set[ucRct_Index] = 0;
//                }
                Data_Flag[Seg_Index][ucRct_Index]--;
                if(Data_Flag[Seg_Index][ucRct_Index] % 16 == 0x0f)//16进制 (10-1)=F //BCD码需要手动进行十进制进位
                    Data_Flag[Seg_Index][ucRct_Index] -= 6;//16进制 (F-6)=9
                if(Data_Flag[Seg_Index][ucRct_Index] == 0xf9)//16进制(0-7)=FFFF FFFF FFFF FFF9 取最后两位 //设置下限
                    Data_Flag[Seg_Index][ucRct_Index] = 0;
                
            }
            break;
    }
}

4.信息处理函数(需要使用到到的函数进行简单的预处理)

//信息处理函数
void Seg_Proc()
{
    unsigned char i;//For循环专用变量
    if(Seg_Slow_Down)return;
    Seg_Slow_Down = 1;//数码管减速程序
    
    //数据读取区域
    Read_Rct(ucRct);//实时读取时钟数据
    Temperature = Read_Temperature();//实时读取温度数据
    //数据显示区域
//    if(Seg_Disp_Mode == 0)//时钟  
//        switch (Seg_Index)
//        {
//            case 0://时钟显示
//                Seg_Buf[2] = Seg_Buf[5] = 11;
//                for(i=0;i<3;i++)
//                {
//                    Seg_Buf[3*i] = ucRct[i] / 16;
//                    Seg_Buf[3*i+1] = ucRct[i] % 16;
//                }
//                break;
//            case 1://时钟设置
//                Seg_Buf[2] = Seg_Buf[5] = 11;
//                for(i=0;i<3;i++)
//                {
//                    Seg_Buf[3*i] = ucRct_Set[i] / 16;
//                    Seg_Buf[3*i+1] = ucRct_Set[i] % 16;
//                }
//                Seg_Buf[3*ucRct_Index] = Seg_Star_Flag?10:ucRct_Set[ucRct_Index] / 16;
//                Seg_Buf[3*ucRct_Index+1] = Seg_Star_Flag?10:ucRct_Set[ucRct_Index] % 16;
//                break;
//        }
/* 
            遇到在某个状态下显示格式不变 
            但是显示数据数组需要发生改变时
            可以将这些数组按照顺序放入一个指针数组内
            然后通过访问指针数组达到简化程序的目的
        */
        if(Seg_Disp_Mode == 0)//时钟
        {
            Seg_Buf[2] = Seg_Buf[5] = 11;
            for(i=0;i<3;i++)
                {
                    Seg_Buf[3*i] = Data_Flag[Seg_Index][i] / 16;
                    Seg_Buf[3*i+1] = Data_Flag[Seg_Index][i] % 16;
                }
                if(Seg_Index >0)//闪烁使能
                {
                    Seg_Buf[3*ucRct_Index] = Seg_Star_Flag?10:Data_Flag[Seg_Index][ucRct_Index] / 16;
                    Seg_Buf[3*ucRct_Index+1] = Seg_Star_Flag?10:Data_Flag[Seg_Index][ucRct_Index] % 16;
                }
        }
        else//温度
        {
            for(i=0;i<5;i++)
                Seg_Buf[i] = 10;
            Seg_Buf[5] = Temperature / 10;
            Seg_Buf[6] = Temperature % 10;
            Seg_Buf[7] = 12;
        }
}

5.其他函数(其他编写的函数,在这里书写会比较方便理解)

//其他函数
void Led_Prov()
{
    if(Alarm[0] == ucRct[0] && Alarm[1] == ucRct[1] && Alarm[2] == ucRct[2])//闹钟使能
        Beep_Flag = 1;
    if((ucRct[2] % 16)== (Alarm[2] % 16 + 5))//过五秒后
        Beep_Flag = 0;    
    ucLed[0] = Led_Star_Flag & Beep_Flag;//只有在闹钟使能条件下闪烁 //char 和bit 不能相乘,所以把*改成&
}


6.定时器中断初始化函数

(这个可以使用STC的定时器计算那里生成c代码,后面要自己添加ET0,EA打开中断)
//定时器中断初始化函数
void Timer0Init(void)        //1毫秒@12.000MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;        //定时器中断0打开
    EA = 1;             //总中断打开
}

7.定时器1中断服务函数

(为了定时执行特定的任务,如此处设置了定时的时间触发了数码管和LED产生特定反应)//中断在测试时可以先注释掉,但是这里按键状态有延时,测试按键时可以解除注释

//定时器中断服务函数
void Timer0server()interrupt 1
{
    if(++Key_Slow_Down == 10)Key_Slow_Down = 0;//键盘减速专用
    if(++Seg_Slow_Down == 200)Seg_Slow_Down = 0;//数码管减速时间过长有时候会影响数码管的刷新,有问题的时候减短减速时间
    if(++Seg_Pos == 8)Seg_Pos = 0;//数码管显示专用
    Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
    Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
    if(++Timer_500ms == 500)
    {
        Timer_500ms = 0;
        Seg_Star_Flag ^= 1;
    }
    if(++Timer_200ms == 200)
    {
        Timer_200ms = 0;
        Led_Star_Flag ^= 1;
    }
}


8.主函数Main(调用书写的函数实现所需的相应功能)

//Main
void main()
{   
    Set_Rct(ucRct);//上电初始化实时时钟
    Timer0Init();
    Sys_Init();
    while(1)
    {
        Key_Proc();
        Seg_Proc();
        Led_Prov();
    }
}

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

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

相关文章

032-安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期 #知识点&#xff1a; 1、JavaEE-HTTP-Servlet技术 2、JavaEE-数据库-JDBC&Mybatis 演示案例&#xff1a; ➢JavaEE-HTTP-Servlet&路由&周期 ➢JavaEE-数据库-JDBC&Mybat…

MiniCPM:揭示端侧大语言模型的无限潜力

技术博客链接&#xff1a; &#x1f517;https://shengdinghu.notion.site/MiniCPM ➤ Github地址&#xff1a; &#x1f517;https://github.com/OpenBMB/MiniCPM ➤ Hugging Face地址&#xff1a; &#x1f517;https://huggingface.co/openbmb/MiniCPM-2B-sft-bf16 1 …

目标检测及相关算法介绍

文章目录 目标检测介绍目标检测算法分类目标检测算法模型组成经典目标检测论文 目标检测介绍 目标检测是计算机视觉领域中的一项重要任务&#xff0c;旨在识别图像或视频中的特定对象的位置并将其与不同类别中的对象进行分类。与图像分类任务不同&#xff0c;目标检测不仅需要…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

RabbitMQ——基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

一、集群简介 1.1 集 群架构 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时&#xff0c;此时可以通过 RabbitMQ 集群来进行扩展&#xff0c;从而达到提升吞吐量的目的。 RabbitMQ 集群是一个或多个节点的逻辑分组&#xff0c;集群中的每个节点都是对等的&#xff0c;每…

职业性格测试在求职应聘跳槽中的应用

人的性格总是千奇百怪&#xff0c;有的人总是想迎接挑战&#xff0c;超越自己&#xff0c;不停的奔着高处走&#xff0c;然而有的人总是喜欢随遇而安&#xff0c;踏踏实实一辈子&#xff0c;有份安稳的工作&#xff0c;有吃有喝就好。那么对于哪些喜欢迎接挑战&#xff0c;但又…

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…

MyBatis一些常见知识点!

什么是 ORM 框架&#xff1f; MyBatis 有哪些优缺点&#xff1f; 典型回答&#xff1a; ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;框架是一种将关系型数据库中的数据 与 应用程序中的对象进行映射的技术。它通过在程序代码中定义的类和属…

Unity类银河恶魔城学习记录1-12 PlayerComboAttack源代码 P39

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttack.cs using System.Collections; using System.Collect…

七月论文审稿GPT第2.5版:微调GPT3.5 turbo 16K和llama2 13B以扩大对GPT4的优势

前言 我司自去年7月份成立大模型项目团队以来&#xff0c;至今已有5个项目组&#xff0c;其中 第一个项目组的AIGC模特生成系统已经上线在七月官网第二项目组的论文审稿GPT则将在今年3 4月份对外上线发布第三项目组的RAG知识库问答第1版则在春节之前已就绪至于第四、第五项目…

LLaVA:GPT-4V(ision) 的新开源替代品

LLaVA&#xff1a;GPT-4V(ision) 的新开源替代品。 LLaVA &#xff08;https://llava-vl.github.io/&#xff0c;是 Large Language 和Visual A ssistant的缩写&#xff09;。它是一种很有前景的开源生成式 AI 模型&#xff0c;它复制了 OpenAI GPT-4 在与图像对话方面的一些功…

(5)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—12种聚类算法说明与归纳

目录 一、12种聚类(无监督学习)算法说明和区分比较 聚类算法的类型(一) ​编辑导入函数库 加载数据集 ​编辑 (1)K-Means --Centroid models (2)Mini-Batch K-Means -- Centroid models (3)AffinityPropagation (Hierarchical) -- Connectivity models (4)Mean Shift…

最新GPT4.0使用教程,AI绘画,GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

算法练习-三数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围

文章目录 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围214.1 性能因素214.2 调优范围确定 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围 数据库性能调优通常发生在用户对业务的执行效率不满意&#xff0c;期望通过调优加快业务执行的情况下。正…

机器学习的整个流程

机器学习的整个流程定义了数据科学团队执行以创建和交付机器学习模型的工作流。此外&#xff0c;机器学习流程还定义了团队如何协作合作&#xff0c;以创建最有用的预测模型。 机器学习high level的流程 机器学习流程的关键步骤包括问题探索&#xff08;Problem Exploration&a…

《dx12 龙书》第四部分学习笔记——预备知识(下)

7、多重采样技术的原理 由于屏幕中显示的像素不可能是无穷小的&#xff0c;所以并不是任意一条直线都能在显示器上“平滑”而完美地呈现出来。即为以像素矩阵 &#xff08;matrix of pixels&#xff0c; 可以理解为“像素2D数组”&#xff09;逼近直线的方法所产生的“阶梯” &…

C# 使用 MailKit 接收邮件(附demo)

C# 使用 MailKit 接收邮件&#xff08;附demo&#xff09; 介绍安装包&#xff08;依赖&#xff09;案例简单代码 获取附件核心代码完整代码 介绍一下POP3 介绍 MailKit 是一个开源的 C# 邮件处理库&#xff0c;用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使…

linux实时调度

面对陌生的知识体系&#xff0c;应该从什么角度来 简介 一、进程管理基本概念 在单处理器系统上&#xff0c;在给定时刻只有一个程序可以运行&#xff0c;在多处理器系统上&#xff0c;可以真正并行运行的进程数据&#xff0c;取决于物理CPU的数目&#xff1b; 进程优先级 …

jss/css/html 相关的技术栈有哪些?

js 的技术组件有哪些&#xff1f;比如 jQuery vue 等 常见的JavaScript技术组件&#xff1a; jQuery&#xff1a; jQuery是一个快速、小巧且功能丰富的JavaScript库&#xff0c;用于简化DOM操作、事件处理、动画效果等任务。 React&#xff1a; React是由Facebook开发的用于构…