蓝桥杯第十一届电子类单片机组程序设计

目录

前言

单片机资源数据包_2023(点击下载)

一、第十一届比赛原题

1.比赛题目

2.赛题解读

1)计数功能

2)连续按下无效按键

二、部分功能实现

1.计数功能的实现

2.连续按下无效按键的处理

3.其他处理

1)对于小数的处理

2)对于高位为0时熄灭的处理

3)对于连续5s,V小于Vp的处理

三、完整代码

main.c

iic.c

iic.h


前言

虽然第十一届省赛题目跟十四届相比,也很简单,但是里面确实也需要许多特殊的处理,这里也跟大家分享一下,我对里面的一些特殊处理的方式。

老规矩,先放资源链接

单片机资源数据包_2023(点击下载)

一、第十一届比赛原题

1.比赛题目

2.赛题解读

平平常常的四个菜单,简简单单按键功能,只是对参数的加减,这次题目难就难在计数和LED显示部分。所以如果能把按键和数码管写好,按键功能实现,感觉冲个省二都没问题了。这里只针对上边两个部分进行介绍:

1)计数功能

计数界面:

计数规则

从图上可以看出,它想表达的计数时机,其实就是当VAIN3电压值从高于Vp,也就是电压参数或者说电压预支,到低于电压阈值之后,计数就+1,当然从低于阈值到高于阈值这个过程计数不会增加,这个VAIN3就是PCF8591的第三个通道。对应到板子上的话,就是读取到的电位计的电压。其实这个跟第十四届从亮到暗或者从暗到亮有异曲同工之妙,相当于第十四届是这个的升级版。我把第十四届的链接放在下边,感兴趣的可以去瞅瞅。至于这个计数怎么实现,下边会介绍。

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

2)连续按下无效按键

题目上的要求如下

指示灯 L3: 连续 3 次以上(含 3 次) 的无效按键操作触发 L3 点亮,直到出现有效的按键操作, L3 熄灭。
之前的题目要求,只说某某按键的功能只在某某菜单才可以生效之类的,当然这个题目也有这样要求,如果在当前菜单按下某个按键后,不会响应,或者说当前按下的按键,没有在它指定的菜单时,那就应该记为一次“无效按键操作”。

除此之外呢,我个人感觉比如一些本身就没有功能,题目没有用到的按键按下之后,也应该被标记为“无效的按键操作”,因为题目上也没写使用哪些按键完成操作。

同样的,具体的实现下边会提到。

二、部分功能实现

1.计数功能的实现

要想精确计数,我们肯定得实时读取电压值V,这个肯定是不可避免的了。我们知道PCF8591读取到的都是数字量(取值0到255),我们需要先把它转化为模拟量,加上题目要求的Vp以及需要显示的电压值要精确到小数点后两位,这里在转换时就直接把V的值扩大100倍方便计算和处理。

unsigned char ad=0;//读取到的AD值
unsigned int V=0;//当前读取到的电压值,由AD值转化而来。为便于显示小数点后两位,电压的数值扩大了100倍
ad=get_pcf(3);//读取ad
V=(unsigned int)(ad*100/255*5);//获得当前读取到的电压,为方便保留小数点后两位,这里已经扩大100倍

读取的处理,我放在了定时器里。大致思路如下:

1)定义一个标志位is_up,当读取到的电压值V高于Vp,并且is_up=0时,则将is_up置为1,也就是记录第一个状态:当前电压值高于Vp

2)当当前电压值V低于阈值Vp,并且is_up=1,则将is_up置为0,并且计数+1.

这样就是实现了,只有当电压从高于阈值跳到低于阈值时,计数才会+1了。具体代码如下:

if(is_up==0&&V/10>Vp)//如果当前电压V小于Vp,则is_up置为1(记录此时前一次电压大于Vp的状态)
{
    is_up=1;
}
else if(is_up==1&&V/10<Vp)//如果上一次电压V大于Vp,且下一次电压V小于Vp,则计数+1
{
    is_up=0;//记录此时电压小于Vp
    count++;//计数+1
}
 

2.连续按下无效按键的处理

如果是按照我之前写代码的习惯的话,我都是在按键处理函数中,先读取按键,再根据读取到的按键的键值,对其进行处理,最后将按键的键值清零。

这里对无效的按键处理也用了类似的方法。如果按下了按键,并且这个按键被某个if  else if语句处理了,则将按键的键值清零。如果所有的按键处理都进行完了,并且此时按键的键值还不为0,则说明按下了一个没有被处理的按键,或者说是“无效的按键”,因为它没产生任何效果嘛,此时记录错误按键次数的标志位count_wrong就+1.同时将按键键值清零。如果count_wrong大于三,也就是连续三次都按下了无效的按键,则将点亮L3的标志位置1(题目要求的,连续三次无效按键就点亮L3)。

至于对于按下有效按键的处理那就好办了,只要在按键处理时的每一次处理之后,加上count_wrong清零,以及将点亮L3的标志位置为0即可。这里就把题目中用到的按键操作也都写出来,方便演示对于按下有效按键的处理了。

 代码如下:

void get_key(void)
{
    unsigned char key_P3=P3;
    unsigned char key_P4=P4;
    static unsigned char count_wrong=0;//记录连续多少次按错了按键(也就是按下了不被处理的按键)
    
    P3=0xFF;
    P4=0xFF;
    
    P44=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=7;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=6;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=5;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=4;}
    
    P42=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=11;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=10;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=9;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=8;}
    
    P35=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=15;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=14;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=13;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=12;}
    P35=1;
    
    P34=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=19;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=18;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=17;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=16;}
    P34=1;
    
    //S12 切换菜单
    if(key_value==12)
    {
        if(mod==0)
            mod=1;
        else if(mod==1)
        {
            mod=2;
            write_at(0,Vp);//当退出参数界面时,记录一次当前Vp参数到AT24C02
        }
        else if(mod==2)
            mod=0;
        key_value=0;
        count_wrong=0;//读取到的有效的按键,错误按键记录清零(下同)
        is_led3_on=0;//熄灭L3
    }
    
    else if(mod==2&&key_value==13)
    {
        count=0;//情况记录次数
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    else if(mod==1&&key_value==16)
    {
        Vp= Vp<50 ? Vp+5:0;
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    else if(mod==1&&key_value==17)
    {
        Vp=Vp>0 ? Vp-5:50;
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    if(key_value!=0)//如果走到这一步,key_value还不为0,则说明读取到的按键未被处理,也就是题目上说的无效的按键
    {
        if(++count_wrong>=3)
        {
            is_led3_on=1;
        }
    }
    
    key_value=0;
    P3=key_P3;
    P4=key_P4;
}

3.其他处理

其他大部分处理前面的文章都已经提到了,这里一一列举出来,并做简单介绍:

1)对于小数的处理

处理方式就是扩大相应倍数,比如要求精确到小数点后一位,就把它扩大十倍。同时在Seg_Table修改一下,将Seg_Table中10到19显示为0.到9.。显示第一位显示对应的数据+10,即可把小数点显示出来。具体可以从下边那篇文章中的目录中寻找

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

2)对于高位为0时熄灭的处理

我们需要判断这个数的大小,主要是位数,这里可以用到三目运算符,以获得其位数信息。比如对于(倒数)第三位数码管,如果value/100还大于0,则说明这位需要显示数据value/100%10(也有可能会显示0欧),想反,如果value/100等于0,则这位数码管就需要熄灭,而非显示数据.

这样判断可能会消耗一些单片机算力,但是我目前还不知道其他有效的方法,也欢迎大家不吝赐教。具体介绍可以看下边这篇文章

蓝桥杯第十四届电子类单片机组决赛程序设计_蓝桥杯第十四届单片机资源包-CSDN博客

示例代码:

Nixie_num[1]=count/10000000>0 ? count/10000000%10:20;
Nixie_num[2]=count/1000000>0 ? count/1000000%10:20;
Nixie_num[3]=count/100000>0 ? count/100000%10:20;
Nixie_num[4]=count/10000>0 ? count/10000%10:20;
Nixie_num[5]=count/1000>0 ? count/1000%10:20;
Nixie_num[5]=count/100>0 ? count/100%10:20;
Nixie_num[6]=count/10>0 ? count/10%10:20;
Nixie_num[7]=count/1>0 ? count/1%10:20;
 

3)对于连续5s,V小于Vp的处理

总的来说就是,当L1标志位为0,并且V小于Vp,则开始计数,当计数够5s了,就将L1标志位置为1,否则重新计数。

if(is_led1_on==0&&V/10<Vp)//如果当前电压小于Vp,则开始计数
{
    if(++count_5s>5000)//当过来5s当前电压还小于Vp,则点亮L1
        is_led1_on=1;
}
else//如果不满足上述条件,则一切清零重来
{
    count_5s=0;
    is_led1_on=0;
}
 

三、完整代码

main.c

#include <stc15.h>
#include <intrins.h>
#include "iic.h"
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xFF,
0xC1,//U 21
0x8C,//P 22
0xC8,//n 23
};unsigned char Led_Num=0xFF;
#define LED_ON(x)				Led_Num&=~(0x01<<x);	P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x)			Led_Num|=0x01<<x;			P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL()		Led_Num=0xFF;					P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;#define NIXIE_CHECK()	P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON()		P2|=0xE0;P2&=0xFF;P2&=0x1F;void get_key(void);
void Delay100ms(void);	//@12.000MHz
void Timer0_Init(void);		//1毫秒@12.000MHz
void show_menu(void);
void led_run(void);unsigned char location=0;//记录当前数码管扫描的位置,中间变量
unsigned char key_value=0;//记录按键的键值,中间变量
unsigned char Nixie_num[]={20,20,20,20,20,20,20,20};//数码管需要显示的数据,默认全部熄灭
unsigned char ad=0;//读取到的AD值
unsigned char at=0;//读取到的AT24C02的值
unsigned char mod=0;//菜单,0:数据采集,1:参数设置,2:计数
unsigned char Vp=0;//Vp的值,已扩大10倍
unsigned char count=0;//计数值,V从大于Vp到小于Vp一次,计数+1
unsigned int V=0;//当前读取到的电压值,由AD值转化而来。为便于显示小数点后两位,电压的数值扩大了100倍void main()
{LED_OFF_ALL();Delay100ms();Vp=read_at(0);//从AT读取一次VpTimer0_Init();EA=1;Delay100ms();while(1){get_key();//读取按键ad=get_pcf(3);//读取adV=(unsigned int)(ad*100/255*5);//获得当前读取到的电压,为方便保留小数点后两位,这里已经扩大倍show_menu();//显示菜单led_run();//控制LEDDelay100ms();}
}
bit is_up=0;//记录上一次电压V是否大于Vp
bit is_led1_on=0;//点亮L1
bit is_led3_on=0;//点亮L3
unsigned int count_5s=0;//数数,数5s
void Timer0_Isr(void) interrupt 1
{P0=0x01<<location;NIXIE_CHECK();//数码管选择P0=Seg_Table[Nixie_num[location]];NIXIE_ON();//数码管显示if(++location==8)location=0;if(is_up==0&&V/10>Vp)//如果当前电压V小于Vp,则is_up置为1(记录此时前一次电压大于Vp的状态){is_up=1;}else if(is_up==1&&V/10<Vp)//如果上一次电压V大于Vp,且下一次电压V小于Vp,则计数+1{is_up=0;//记录此时电压小于Vpcount++;//计数+1}if(is_led1_on==0&&V/10<Vp)//如果当前电压小于Vp,则开始计数{if(++count_5s>5000)//当过来5s当前电压还小于Vp,则点亮L1is_led1_on=1;}else//如果不满足上述条件,则一切清零重来{count_5s=0;is_led1_on=0;}
}
void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR |= 0x80;			//定时器时钟1T模式TMOD &= 0xF0;			//设置定时器模式TL0 = 0x20;				//设置定时初始值TH0 = 0xD1;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时ET0 = 1;				//使能定时器0中断
}void Delay100ms(void)	//@12.000MHz
{unsigned char data i, j, k;_nop_();_nop_();i = 5;j = 144;k = 71;do{do{while (--k);} while (--j);} while (--i);
}void Delay5ms(void)	//@12.000MHz
{unsigned char data i, j;i = 59;j = 90;do{while (--j);} while (--i);
}void get_key(void)
{unsigned char key_P3=P3;unsigned char key_P4=P4;static unsigned char count_wrong=0;//记录连续多少次按错了按键(也就是按下了不被处理的按键)P3=0xFF;P4=0xFF;P44=0;if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=7;}else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=6;}else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=5;}else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=4;}P42=0;if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=11;}else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=10;}else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=9;}else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=8;}P35=0;if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=15;}else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=14;}else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=13;}else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=12;}P35=1;P34=0;if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=19;}else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=18;}else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=17;}else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=16;}P34=1;//S12 切换菜单if(key_value==12){if(mod==0)mod=1;else if(mod==1){mod=2;write_at(0,Vp);//当退出参数界面时,记录一次当前Vp参数到AT24C02}else if(mod==2)mod=0;key_value=0;count_wrong=0;//读取到的有效的按键,错误按键记录清零(下同)is_led3_on=0;//熄灭L3}else if(mod==2&&key_value==13){count=0;//情况记录次数key_value=0;count_wrong=0;is_led3_on=0;}else if(mod==1&&key_value==16){Vp= Vp<50 ? Vp+5:0;key_value=0;count_wrong=0;is_led3_on=0;}else if(mod==1&&key_value==17){Vp=Vp>0 ? Vp-5:50;key_value=0;count_wrong=0;is_led3_on=0;}if(key_value!=0)//如果走到这一步,key_value还不为0,则说明读取到的按键未被处理,也就是题目上说的无效的按键{if(++count_wrong>=3){is_led3_on=1;}}key_value=0;P3=key_P3;P4=key_P4;
}void show_menu(void)
{if(mod==0)//数据读取{Nixie_num[0]=21;Nixie_num[1]=20;Nixie_num[2]=20;Nixie_num[3]=20;Nixie_num[4]=20;Nixie_num[5]=V/100%10+10;Nixie_num[6]=V/10%10;Nixie_num[7]=V/1%10;}else if(mod==1)//参数显示{Nixie_num[0]=22;Nixie_num[1]=20;Nixie_num[2]=20;Nixie_num[3]=20;Nixie_num[4]=20;Nixie_num[5]=Vp/10%10+10;Nixie_num[6]=Vp/1%10;Nixie_num[7]=0;}else if(mod==2)//记录次数显示{Nixie_num[0]=23;//一下处理为让数码管显示count数量,并自动调整需要显示的位数Nixie_num[1]=count/10000000>0 ? count/10000000%10:20;Nixie_num[2]=count/1000000>0 ? count/1000000%10:20;Nixie_num[3]=count/100000>0 ? count/100000%10:20;Nixie_num[4]=count/10000>0 ? count/10000%10:20;Nixie_num[5]=count/1000>0 ? count/1000%10:20;Nixie_num[5]=count/100>0 ? count/100%10:20;Nixie_num[6]=count/10>0 ? count/10%10:20;Nixie_num[7]=count/1>0 ? count/1%10:20;}
}
bit L1_on=0;
bit L2_on=0;
bit L3_on=0;
void led_run(void)
{if(is_led1_on==1&&L1_on==0){LED_ON(0);L1_on=1;}else if(is_led1_on==0&&L1_on==1){LED_OFF(0);L1_on=0;}if(count%2==1&&L2_on==0)//如果记录的次数为奇数,由于这个条件十分简单,所以就直接在这里判断了{LED_ON(1);L2_on=1;}else if(count%2!=1&&L2_on==1){LED_OFF(1);L2_on=0;	}if(is_led3_on==1&&L3_on==0){LED_ON(2);L3_on=1;}else if(is_led3_on==0&&L3_on==1){LED_OFF(2);L3_on=0;	}
}

iic.c

/*	#   I2C代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/#define DELAY_TIME	5
#include <stc15.h>
#include <intrins.h>
sbit sda=P2^1;
sbit scl=P2^0;
//
static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();		}while(n--);      	
}//
void I2CStart(void)
{sda = 1;scl = 1;I2C_Delay(DELAY_TIME);sda = 0;I2C_Delay(DELAY_TIME);scl = 0;    
}//
void I2CStop(void)
{sda = 0;scl = 1;I2C_Delay(DELAY_TIME);sda = 1;I2C_Delay(DELAY_TIME);
}//
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){scl = 0;I2C_Delay(DELAY_TIME);if(byt & 0x80){sda = 1;}else{sda = 0;}I2C_Delay(DELAY_TIME);scl = 1;byt <<= 1;I2C_Delay(DELAY_TIME);}scl = 0;  
}//
unsigned char I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   scl = 1;I2C_Delay(DELAY_TIME);da <<= 1;if(sda) da |= 0x01;scl = 0;I2C_Delay(DELAY_TIME);}return da;    
}//
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}//
void I2CSendAck(unsigned char ackbit)
{scl = 0;sda = ackbit; I2C_Delay(DELAY_TIME);scl = 1;I2C_Delay(DELAY_TIME);scl = 0; sda = 1;I2C_Delay(DELAY_TIME);
}unsigned char get_pcf(unsigned char add)
{unsigned char ad=0;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0x91);I2CWaitAck();ad=I2CReceiveByte();I2CSendAck(1);I2CStop();return ad;
}void write_at(unsigned char add,dat)
{I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}unsigned char read_at(unsigned char add)
{unsigned char at=0;I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xA1);I2CWaitAck();at=I2CReceiveByte();I2CSendAck(1);I2CStop();return at;
}

iic.h

#ifndef _IIC_H_
#define _IIC_H_unsigned char get_pcf(unsigned char add);void write_at(unsigned char add,dat);
unsigned char read_at(unsigned char add);#endif

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

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

相关文章

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;暂未发表&#xff09; 24.sqlite3_cr…

OSCP靶场--BlackGate

OSCP靶场–BlackGate 考点(1.redis rce 2. CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.176 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 03:32 EDT Nmap scan report for 192.168.163.…

牛-迈面试题----答案/类似题/知识点

来源在这里 来源在这里 1.Redis的优势 (1) 速度快&#xff0c;因为数据存在内存中&#xff0c;类似于HashMap&#xff0c;HashMap的优势就是查找和操作的时间复杂度都很低 (2)支持丰富数据类型&#xff0c;支持string&#xff0c;list&#xff0c;set&#xff0c;sorted set&…

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

《系统架构设计师教程(第2版)》第6章-数据库设计基础知识-04-应用程序与数据库的交互

文章目录 1. 库函数级别访问接口2. 嵌入SQL访问接口2.1 概述2.2 数据库厂商 3. 通用数据接口标准3.1 开放数据库连接 (ODBC)3.2 一些数据库接口1&#xff09;数据库访问对象 (DAO)2&#xff09;远程数据库对象 (RDO)3&#xff09;ActiveX数据对象 (ADO)4&#xff09;Java数据库…

【科普文】三种处理器:CPU,GPU,NPU到底是什么?

更多内容在 从最早的CPU到GPU, 再到现在的NPU。处理器的型号和种类越来越多。每种处理器适用与不同的产品以及功能。下面来介绍三种处理器的区别和应用场景 CPU (中央处理器) CPU是计算机系统的核心&#xff0c;负责执行程序指令、处理数据和控制其他硬件设备。它通常由控制单…

Ollama管理本地开源大模型,用Open WebUI访问Ollama接口

现在开源大模型一个接一个的&#xff0c;而且各个都说自己的性能非常厉害&#xff0c;但是对于我们这些使用者&#xff0c;用起来就比较尴尬了。因为一个模型一个调用的方式&#xff0c;先得下载模型&#xff0c;下完模型&#xff0c;写加载代码&#xff0c;麻烦得很。 对于程…

新火种AI|GPT-4诞生1年,OpenAI把它放到了机器人上

作者&#xff1a;一号 编辑&#xff1a;美美 ChatGPT拥有了身体&#xff0c;机器人也有了灵魂。 从OpenAI在去年3月14日拿出GPT-4后&#xff0c;已经过了整整一年。显然&#xff0c;在GPT-4诞生之后的这一年&#xff0c;一切都迭代得太快了&#xff0c;从GPT-4展现多模态能力&…

计算机组成原理-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计算机组成原理中的各章练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门&#xff1a; 第一/二章 概述和数…

2024.3.14 C++

思维导图 封装类 用其成员函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;加法&#xff09;&#xff0c;并封装一个全局函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;减法&#xff09;。 #include <iostream>using nam…

GPT-SoVITS开源音色克隆框架的训练与调试

GPT-SoVITS开源框架的报错与调试 遇到的问题解决办法 GPT-SoVITS是一款创新的跨语言音色克隆工具&#xff0c;同时也是一个非常棒的少样本中文声音克隆项目。 它是是一个开源的TTS项目&#xff0c;只需要1分钟的音频文件就可以克隆声音&#xff0c;支持将汉语、英语、日语三种…

【PyQT】大地线长度计算工具实现

本设计实现了一个大地线长度计算工具&#xff0c;用户可以输入两个点的经纬度坐标&#xff0c;然后点击计算按钮&#xff0c;程序会根据输入的经纬度坐标计算出这两个点之间的大地线长度&#xff0c;并将结果显示在界面上。如下图所示。 附录完整代码如下&#xff1a; # 导入所…

L1-5 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如果没有…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句&#xff08;两种&#xff09; 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

MapReduce解析:从定义到核心思想,编程规范与序列化解读

目录 一、 MapReduce1.1 MapReduce定义1.2 MapReduce优缺点1.2.1 优点1.2.2 缺点 1.3 MapReduce核心思想1.4 MapReduce进程1.5 常用数据序列化类型1.6 MapReduce编程规范1.6.1Mapper阶段1.6.2 Reduce阶段1.6.3 Driver阶段 1.7 WordCount案例实操1.7.1 本地测试1.7.2 提交到集群…

TEC温度器温度控制器

一 主要特点 1 两路独立的串口&#xff0c;可同时手动和串口指令设定 PID 和温度&#xff1b; 2 一拖二结构&#xff0c;一个调试器控制两个控温模块单元&#xff1b; 3 精准控制温度&#xff0c;用户可自行修正&#xff1b;PT100/PT1000/NTC3435 温度电阻偏差&#xff1b; …

1.1 课程架构介绍:STM32H5信息安全特性概览

1.1 课程架构介绍&#xff1a;STM32H5信息安全特性概览 1. 概述 开发者在打造嵌入式系统时&#xff0c;安全和性能是产品开发设计的考量重点。为实现这一目标&#xff0c;ST推出了STM32H5系列&#xff0c;该系列作为微控制器新标杆面向工业应用市场&#xff0c;将为用户带来更…

windows中如何将已安装的node.js版本进行更换

第一步&#xff1a;先清除已经安装好的node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 然后进入命令控制行窗口&#xff0c;并输入where node…

【Axure教程】能增删改的树形表格

多层级表格又成为树形表格&#xff0c;是在后台常用的一种表格形式&#xff0c;当表格数据存在多层级关系是&#xff0c;可以通过多层级表格&#xff0c;从而更加清晰的呈现数据内容&#xff0c;帮助人们更好地理解和分析数据之间的关系&#xff0c;从而更加有效地传递信息。 …

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别

大家好&#xff0c;我是锋哥。今天分享关于JVM新生代、老年代、永久代的区别的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; JVM 新生代、老年代、永久代的区别? 在 Java 中&#xff0c;堆被划分成两个不同的区域&#xff1a;新生代 ( Young ) 、老年代 ( Old ) 。而新…