蓝桥杯2024/1/28----十二届省赛题笔记
题目要求:
2、 竞赛板配置要求
3、 硬件框图

4、 功能描述
4.1功能概述
4.2性能要求
4.3显示功能

4.4按键功能

4.5LED 指示灯功能
4.6初始状态说明
每次建好工程文件夹,里边包含User(放工程文件,mian.c,可以在这里写如同我这个文章的文本文档)、Driver(存放底层文件如Led.c,Led.h等)
新建的工程先搭建框架,可以先书写底层函数(此次书写了六个函数并包含相应的头文件共十二个底层文件)
底层函数内容:
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)//LED
{
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;
}
}
void Beep(unsigned char flag)//蜂鸣器
{
static unsigned char temp = 0x00;
static unsigned char temp_Old = 0xff;
if(flag)
temp |=0x40 ;
else
temp &= ~ 0x40 ;
if(temp != temp_Old)
{
P0 = ~ temp;
P2 = P2 & 0x1f | 0xa0;
P2 &= 0x1f;
temp_Old = temp;
}
}
void Relay(unsigned char flag)//继电器
{
static unsigned char temp = 0x00;
static unsigned char temp_Old = 0xff;
if(flag)
temp |= 0x10 ;
else
temp &= ~ 0x10 ;
if(temp != temp_Old)
{
P0 = ~ temp;
P2 = P2 & 0x1f | 0xa0;
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;
P44 = 0; P42 = 1; P35 = 1; P34 = 1;//实际板子的连接
//P37 = 0; P36 = 1; P35 = 1; P34 = 1;//这个是仿真使用的
if(P33 == 0)temp = 4;
if(P32 == 0)temp = 5;
if(P31 == 0)temp = 6;
if(P30 == 0)temp = 7;
P44 = 1; P42 = 0; P35 = 1; P34 = 1;
if(P33 == 0)temp = 8;
if(P32 == 0)temp = 9;
if(P31 == 0)temp = 10;
if(P30 == 0)temp = 11;
P44 = 1; P42 = 1; P35 = 0; P34 = 1;
if(P33 == 0)temp = 12;
if(P32 == 0)temp = 13;
if(P31 == 0)temp = 14;
if(P30 == 0)temp = 15;
P44 = 1; P42 = 1; P35 = 1; P34 = 0;
if(P33 == 0)temp = 16;
if(P32 == 0)temp = 17;
if(P31 == 0)temp = 18;
if(P30 == 0)temp = 19;
return temp;
}
//头文件
#include <STC15F2K60S2.H>
unsigned char Key_Read();
4.数码管底层驱动专用文件
#include <Seg.h>
unsigned char Seg_Dula[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x8c,0x88};//数码管段码储存数组
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.//DAC底层驱动专用头文件
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "iic.h"
#include "intrins.h"
#define DELAY_TIME 5
#define Photo_Res_Channel 0x41
#define Adj_Res_Channel 0x43
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
//函数名:DAC转换函数
//入口参数:要进行转换的数值
//返回值:无
//函数功能:对入口参数要转换的DA数据进行转换
void Da_Write(unsigned char dat)
{
IIC_Start();//发送开启信号
IIC_SendByte(0x90);//选择PCF8591芯片,确定写的模式
IIC_WaitAck();//等待PCF8591反馈
IIC_SendByte(0x41);//使能DA转换(随便写通道编号,不影响,主要的功能是使能DA)
IIC_WaitAck();//等待PCF8591反馈
IIC_SendByte(dat);//将待转换的数据发送出去
IIC_WaitAck();//等待PCF8591反馈
IIC_Stop();//停止发送
}
//头文件
# include "STC15F2K60S2.H"
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
//函数名:DAC转换函数
//入口参数:要进行转换的数值
//返回值:无
//函数功能:对入口参数要转换的DA数据进行转换
void Da_Write(unsigned char dat);
6.//温度底层驱动专用头文件
/* # 单总线代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "onewire.h"
#include "reg52.h"
sbit DQ = P1^4;
//单总线内部延时函数
void Delay_OneWire(unsigned int t) //12T 或1T,根据需要修改
{
t *= 12;//用了温度这句必须写,设置为12T,这句官方不会写,这两句和下面的功能一样
while(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_t()
{
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;
}
//头文件
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
float Read_t();
#endif
工程主函数内容:
1.头文件声明(把需要用到的头文件添加进来)
/*头文件声明区*/
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include <Init.h>//初始化底层驱动专用头文件
#include <Led.h>//Led底层驱动专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include "onewire.h"//温度底层驱动专用头文件
#include "iic.h"//DAC底层驱动专用头文件
2.变量声明(把需要用到的所有变量现在这里进行声明)
/*变量声明区*/
unsigned char Key_Val,Key_Old,Key_Down,Key_Up;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量
unsigned char Seg_Pos;//数码管扫描专用变量
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-参数设置界面 2-DAC输出界面
float Temperature;//实时温度变量
unsigned char Temp_Disp = 25;//温度参数变量(用于设置显示)
unsigned char Temp_Ctrol = 25;//温度参数控制变量(用于实际控制) 初始值:25
float Voltage_Output;//实时输出电压
bit Output_Mode;//DAC输出模式 0-DAC输出电压与温度相关 1-DAC给出的关系输出电压
3.按键处理函数(在这里编写按键控制的函数)
/*键盘处理函数*/
void Key_Proc()
{
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;//辅助扫描变量
switch(Key_Down)
{
case 4://界面切换按键
if(++Seg_Disp_Mode == 3)
Seg_Disp_Mode = 0;//数码管显示模式在0-2之间循环切换
if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
Temp_Disp = Temp_Ctrol;//将实际控制数据赋值给设置变量 便于数据更改
if(Seg_Disp_Mode == 2) //当界面从参数设置切换出去后
Temp_Ctrol = Temp_Disp;//将设置数据保存到控制变量
break;
case 8://参数自减按键
if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
{
if(--Temp_Disp == 255)//限制温度下限为0
Temp_Disp = 0;
}
break;
case 9://参数自加按键
if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
{
if(++Temp_Disp == 100)//限制温度上限为99
Temp_Disp = 99;
}
break;
case 5://模式切换按键
Output_Mode ^= 1;//切换输出模式
break;
}
}
4.信息处理函数(需要使用到到的函数进行简单的预处理)
/*信息处理函数*/
void Seg_Proc()
{
if(Seg_Slow_Down)return;
Seg_Slow_Down = 1;
/*信息获取区域*/
Temperature = Read_t();//实时读取温度值
/*数据显示区域*/
switch(Seg_Disp_Mode)
{
case 0://温度显示界面
Seg_Buf[0] = 11;//显示C
Seg_Buf[4] = (unsigned char)Temperature / 10 % 10;
Seg_Buf[5] = (unsigned char)Temperature % 10;
Seg_Buf[6] = (unsigned int)(Temperature * 100 )/ 10 % 10;
Seg_Buf[7] = (unsigned int)(Temperature * 100 )% 10;
//Seg_Point[5] = 1;//使能小数点
break;
case 1://参数设置界面
Seg_Buf[0] = 12;//显示P
Seg_Buf[4] = Seg_Buf[5] = 10;//熄灭第五、第六个数码管
Seg_Buf[6] = Temp_Disp / 10 % 10;
Seg_Buf[7] = Temp_Disp % 10;
Seg_Point[5] = 0;
break;
case 2://DAC输出界面
Seg_Buf[0] = 13;//显示A
Seg_Buf[5] = (unsigned char)Voltage_Output % 10;
Seg_Buf[6] = (unsigned int)(Voltage_Output * 100 )/ 10 % 10;
Seg_Buf[7] = (unsigned int)(Voltage_Output * 100 )% 10;
Seg_Point[5] = 1;
break;
}
}
int cnt1=0;
5.其他函数(其他编写的函数,在这里书写会比较方便理解)
/*其他函数*/
void Led_Proc()
{
unsigned char i;//用于For循环
/*DAC相关*/
if(Output_Mode == 0)//DAC输出电压与温度相关,当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭
{
if(Temperature < Temp_Ctrol)//当实时温度小于温度参数时
Voltage_Output = 0;//DAC输出0V
else//当实时温度大于参数设置时
Voltage_Output = 5;//DAC输出5V
}
else //当前处于 DAC 输出界面,指示灯 L4 点亮,否则熄灭。
{
if(Temperature < 20)//当实时温度小于20度时,测试时难以达到相应温度可以修改实际温度看显示状况
Voltage_Output = 1;//DAC输出1V
else if(Temperature > 40)//当实时温度小于40度时,测试时难以达到相应温度可以修改实际温度看显示状况
Voltage_Output = 4;//DAC输出4V
else//当实时温度在20-40之间时
Voltage_Output = 0.15*(Temperature - 20) + 1;//DAC输出与实时温度为一次函数关系,0.15=(40-20)/(4-1)V
}
Da_Write(Voltage_Output * 51);//实时输出DAC,0-255的范围和0-5V要对应上则*51
/*LED相关*/
// ucLed[0] = !Ouput_Mode;//当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭
// for(i=0;i<3;i++)//模式指示灯
// ucLed[1+i] = (i == Seg_Disp_Mode);
//这几个同样可以实现指示灯的状态,但是在上电时L1常亮出现异常,当前并非为模式一界面,切换到模式一界面后L4没有熄灭,按下S5后L4才会熄灭
for(i= 0;i<3;i++)//模式指示灯,无异常
{
if( Output_Mode == 0)
{
if(i == Seg_Disp_Mode )//上电显示界面
{
cnt1=i+1;
if(cnt1==3)//DAC显示界面两种模式和输出模式
{
Led_Disp(0,1);//L1
Led_Disp(3,0);//当L1亮起熄灭L4
}
else
{
Led_Disp(i+1,1);
}
}
else
{
//Led_Disp(i+1,0);
cnt1=i+1;
if(cnt1==3) Led_Disp(0,0);
else Led_Disp(i+1,0);
}
}
else //DAC
{
if(i == Seg_Disp_Mode )
{
Led_Disp(0,0);
Led_Disp(i+1,1);
}
else
Led_Disp(i+1,0);
}
}
}
6.定时器0中断初始化函数
(这个可以使用STC的定时器计算那里生成c代码,后面要自己添加ET0,EA打开中断)
/*定时器0初始化函数*/
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
7.定时器0中断服务函数
(为了定时执行特定的任务,如此处设置了定时的时间触发了数码管和LED产生特定反应)
/*定时器0中断服务函数*/
void Timer0server() interrupt 1
{
if(++Key_Slow_Down == 10)Key_Slow_Down = 0;//键盘减速专用
if(++Seg_Slow_Down == 500)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]);//0 +1
}
/*延时函数*/
void Delay750ms() //@12.000MHz
{
unsigned char i, j, k;
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
8.主函数Main(调用书写的函数实现所需的相应功能)
/*Main*/
void main()
{
Read_t();//上电读取一次温度并且延时750ms避免数据出现85
Delay750ms();
Sys_Init();
Timer0Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}
DS18B20相关资料:
Bit15-bit11:符号位;bit10-bit4:整数位;bit3-bit0:小数位
后面返回值的时候有一个/ 16.0 ,等价于*0.625;这两个都是计算精度的。
这两个为了更好的运行效果,可以直接在主函数调用,当把这两个语句放到while循环里面,或者读取的语句放入while循环里会产生大约10秒的延时才会显示数据,与预期750ms的效果相差较大。产生这么久的延时主要由于中断的数码管显示延时占用了较多次,可以把延时改小尝试。
相关文章:

蓝桥杯2024/1/28----十二届省赛题笔记
题目要求: 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 : 选手需严格按照以上要求配置竞赛板,编写和调…...

STM32+ESP8266 实现物联网设备节点
目录 一、硬件准备 二、编译环境 三、源代码地址 四、说明 五、测试方法 六、所有测试工具和文档 本项目使用stm32F103ZEesp8266实现一个物联网的通信节点,目前支持的协议有mqtt,tcp。后续会持续更新,增加JSON,传感器&#…...

免费的ChatGPT网站(7个)
还在为找免费的chatGPT网站或者应用而烦恼吗?博主归纳总结了7个国内非常好用,而且免费的chatGPT网站,AI语言大模型,我们都来接触一下吧。 免费!免费!免费!...,建议收藏保存。 1&…...

Go语言基础之单元测试
1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go …...
C++ easyX小程序(介绍几个函数的使用)
本小程序通过代码和注释,介绍了easyX窗口及控制台窗口的设置方法;还介绍了easyX中关于颜色、线型、画圆、画方、显示文字以及鼠标消息处理等函数的使用方法。为便于理解,本程序同时使用控制台和easyX窗口,由控制台控制程序运行、由…...
配置nginx以成功代理websocket
配置nginx以成功代理websocket 在使用socket.io的时候遇到这样一个问题:websocket接收的消息的顺序错位了,然后看了一下浏览器的console的报错,提示连接到ws失败,然后在浏览器的开发者工具的网络中看了一下ws对应的消息里面报错&…...
代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
文档讲解: BST,各种插入删除操作 235.二叉搜索树的最近公共祖先 思路:昨天练习了二叉树的搜索,今天这道题是二叉搜索树的搜索,其具有有序这个特点,其能决定我们每次搜索是进入该节点的左子树还是右子树&…...
collection、ofType、select的联合用法(Mybatis实现树状结构查询)
需求 得到树结构数据也可以用lambda表达式也行,也可以直接循环递归也行,本文采用的是直接在Mybatis层得到结果,各有各的优势。 代码 1、实体类 Data public class CourseChapterVO implements Serializable {private static final long s…...

FLUENT Meshing Watertight Geometry工作流入门 - 4 局部加密区域
本视频中学到的内容: 使用Watertight Geometry Workflow 的 Create Local Refinement Regions 任务来创建细化的网格区域 视频链接: FLUENT Meshing入门教程-4创建局部加密区域_哔哩哔哩_bilibili 可以通过使用 Watertight Geometry Workflow 的 Create…...

前端添加富文本/Web 富文本编辑器wangeditor
官网wangEditor 需要引入两个文件 <link href"https://unpkg.com/wangeditor/editorlatest/dist/css/style.css" rel"stylesheet"> <script src"https://unpkg.com/wangeditor/editorlatest/dist/index.js"></script> 前端…...
软件价值2-贪吃蛇游戏
贪吃蛇游戏虽然很多,不过它可以作为软件创作的开端,用python来实现,然后dist成windows系统可执行文件。 import pygame import sys import random# 初始化 pygame.init()# 游戏设置 width, height 640, 480 cell_size 20 snake_speed 15# …...

应用案例 | 基于三维机器视觉的汽车副车架在线测量解决方案
在汽车制造领域中,精确的测量是确保产品质量和生产效率的关键。随着科技的不断进步,测量技术也在不断精进。 副车架是汽车底盘的重要组成部分,负责支撑引擎,是车辆结构中至关重要的组成部分之一,其制造质量直接关系到汽…...

线程的创建和使用threading.Thread()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 线程的创建和使用 threading.Thread() [太阳]选择题 关于以下代码的输出是? import threading import time def f(name): print(name) for i in range(3): print…...
大数据学习之Redis,十大数据类型的具体应用(四)
3.8 Redis基数统计(HyperLogLog) 需求 统计某个网站的UV、统计某个文章的UV 什么是UV unique Visitor ,独立访客,一般理解为客户端IP 大规模的防止作弊,需要去重复统计独立访客 比如IP同样就认为是同一个客户 需要去…...

哪个牌子的头戴式耳机好?推荐性价比高的头戴式耳机品牌
随着科技的不断发展,耳机市场也呈现出百花齐放的态势,从高端的奢侈品牌到亲民的平价品牌,各种款式、功能的耳机层出不穷,而头戴式耳机作为其中的一员,凭借其优秀的音质和降噪功能,受到了广大用户的喜爱&…...

Java EE 5 SDK架构
Java EE 5 SDK架构 大型组织每天都要处理大量数据和多用户的相关事务。为管理该组织如此大型而又复杂的系统,开发了企业应用程序。企业应用程序是在服务器上托管的应用程序,通过计算机网络同时向大量用户提供服务。这种应用程序可采用各种技术开发,如Java EE 5。Java EE 5平…...

nop-entropy可逆计算入门(1)
第1步:从大佬的gitee:https://gitee.com/canonical-entropy/nop-entropy下载源码,进行本地编译,具体编译看项目下的readme,想偷懒的可以下载我编译后的jar,放到自己的maven仓库 https://pan.baidu.com/s/15qANnrCh5RV…...

C++(9) 虚函数
文章目录 虚函数1. 虚函数1.1 虚函数案例11.2 虚函数案例21.2 纯虚函数1.3 纯虚函数语法要求总环1.4 纯虚函数应用1.4.1 生活案例1.4.2 虚函数引用代码 虚函数 1. 虚函数 1.1 虚函数案例1 #include <iostream>using namespace std;class Animal { public:// Animal 类…...

uniapp 使用canvas 画海报,有手粘贴即可用(拆成组件了,看后面)
1.直接使用 html部分 <view click"doposter">下载海报</view> <canvas canvas-id"myCanvas" type2d style"width: 370px; height: 550px;opcity:0;position: fixed;z-index:-1;" id"myCanvas" />js 部分 drawBac…...

Amazon Bedrock 的微调和持续预训练功能允许用户使用私有数据定制模型
今天我很高兴地宣布,您现在可以在 Amazon Bedrock 中使用自己的数据,安全并私密地定制基础模型(FMs),按照您所在领域、企业和用例的特定要求构建应用程序。借助定制模型,您可以创建独特的用户体验ÿ…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...