蓝桥杯2024/1/28----十二届省赛题笔记

题目要求:

2、 竞赛板配置要求

2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。
2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。
2.3扩展方式跳线 J13 配置为 IO 模式。
2.4 请注意 选手需严格按照以上要求配置竞赛板,编写和调试程序 不符合以上
配置要求的作品将被评为零分或者被酌情扣分。

3、 硬件框图

4、 功能描述

4.1功能概述

1) 通过获取 DS18B20 温度传感器的温度数据,完成温度测量功能。
2) 通过 PCF8591 AD/DA 芯片完成 DAC 输出功能。
3) 通过数码管完成题目要求的数据显示功能。
4) 通过按键完成题目要求的显示界面切换和设置功能。
5) 通过 LED 指示灯完成题目要求的指示功能。

4.2性能要求

1) 温度数据刷新时间:≤1 秒。
2) DAC 输出电压刷新时间:≤0.5 秒。
3) 按键动作响应时间:≤0.2 秒。

4.3显示功能

4.4按键功能

1) 功能说明
S4 :定义为“界面”按键,按下 S4 按键,切换温度显示界面、参数
设置界面和 DAC 输出界面,按键 S4 切换模式如图 5 所示:
S8 :定义为“减”按键
在参数界面下按下 S8 按键,温度参数减 1。
S9 :定义为“加”按键
在参数界面下按下 S9 按键,温度参数加 1。
S5 :定义为“模式”切换按键。
模式 1: DAC 输出电压与温度相关。
通过 DS18B20 采集到的实时温度小于温度参数时,
DAC 输出 0V,否则,
DAC 输出 5V。
模式 2: DAC 按照图 7 给出的关系输出电压。
2) 其它要求
按键应做好消抖处理,避免出现一次按键动作导致功能多次触发等问
题。 按键动作不影响数码管显示和数据采集过程。
S8、S9 按键仅在参数设置界面有效。
设定的温度参数在退出参数设置界面时生效。

4.5LED 指示灯功能

1) 当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭。
2) 当前处于温度显示界面,指示灯 L2 点亮,否则熄灭。
3) 当前处于参数设置界面,指示灯 L3 点亮,否则熄灭。
4) 当前处于 DAC 输出界面,指示灯 L4 点亮,否则熄灭。

4.6初始状态说明

请严格按照以下要求设计作品的上电初始状态。
1) 处于温度显示界面。
2) 处于模式 1。
3) 温度参数为 25℃

每次建好工程文件夹,里边包含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的效果相差较大。产生这么久的延时主要由于中断的数码管显示延时占用了较多次,可以把延时改小尝试。

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

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

相关文章

时序预测 | PyTorch基于改进Informer模型的时间序列预测(锂电池SOC估计)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | PyTorch基于改进Informer模型的时间序列预测&#xff0c;锂电池SOC估计 时间序列预测&#xff1a;informer改进模型[new][new][new]&#xff08;Fourier-Mixed Window Informer 采用傅里叶混合窗口注意力机…

【GAMES101】Lecture 12 曲面

目录 贝塞尔曲面 曲面细分 Loop细分&#xff08;Loop Subdivision&#xff09; Catmull-Clark 细分&#xff08;Catmull-Clark Subdivision&#xff09; 曲面简化 贝塞尔曲面 然后前面讲了贝塞尔曲线&#xff0c;这里讲一下这个贝塞尔曲面 那怎么样从贝塞尔曲线到贝塞尔曲…

Windows系统本地安装Wnmp服务并结合内网穿透公网远程访问

目录 前言 1.Wnmp下载安装 2.Wnmp设置 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Windows…

vite+vue3+ts项目上线docker 配置反向代理API

这次重点的坑是反向代理。 1。项目中配置代理&#xff0c;为了跨域请求数据 项目根目录中新建vite.config.ts文件 在文件中添加配置代理 注意&#xff1a;其中 /api 和target 的地址后面没有 / 2。在项目根目录中新建Httprequest.ts文件&#xff0c;引入axios&#xff0c;并…

打击者H5小游戏

欢迎来到程序小院 打击者 玩法&#xff1a;点击飞机上下左右移动躲过子弹射击&#xff0c;打掉上方敌人飞机&#xff0c; 遇到药包会增加能量&#xff0c;弹药包会升级武器&#xff0c;快去射击吧^^。开始游戏https://www.ormcc.com/play/gameStart/262 html <div id"…

【XR806开发板试用】在 xr806 上用 ncnn 跑神经网络 mnist

在 xr806 上用 ncnn 跑神经网络 mnist 0x0 介绍 xr806 和 ncnn https://xr806.docs.aw-ol.com/ XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片&#xff0c;支持鸿蒙L0系统 https://github.com/Tencent/ncnn ncnn是腾讯开源的高性…

uniapp瀑布流实现

1. 图片瀑布流&#xff1a; 不依赖任何插件&#xff0c;复制即可见效&#xff1a; <template><view class"page"><view class"left" ref"left"><image class"image" v-for"(item,i) in leftList" :k…

[GXYCTF2019]禁止套娃(特详解)

刚打开页面什么都没有&#xff0c;抓包也什么都没有 那就dirsaerch扫一下&#xff0c;发现状态码都是429&#xff0c;访问太快了&#xff08;这里很多师傅都没有说明或者说清楚&#xff09; 这里改了一下线程&#xff08;kali自带的&#xff0c;如果用的脚本要加前面要加python…

ETL能实现什么流程控制方式?

随着大数据时代的到来&#xff0c;数据处理工具成为各个行业中不可或缺的一部分。运用数据处理工具&#xff0c;能够大幅度帮助开发人员进行数据处理等工作&#xff0c;以及能够更好的为企业创造出有价值的数据。那在使用ETL工具时&#xff0c;我们往往会通过ETL平台所携带的组…

分布式系统面试的秘籍:深入探讨事务、幂等性和补偿事务,掌握二/三阶段提交,了解Sagas事务模型和分布式ID的实战应用!

1、分布式幂等性如何设计&#xff1f;并举例说明 设计分布式系统的幂等性是确保在面对重复请求或操作时系统能够产生相同结果的重要方面。以下是一些设计方法&#xff0c;并结合一个简单的例子说明&#xff1a; 设计方法&#xff1a; 唯一标识符&#xff08;ID&#xff09;:…

centos7上安装mysql5.7并自定义数据目录路径

1、卸载mariadb rpm -qa |grep mariadb #查出来的结果是mariadb-libs-5.5.68-1.el7.x86_64 rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps #卸载查到的结果 2、官网下载响应的tar.gz包&#xff0c;比如mysql-5.7.38-el7-x86_64.tar.gz &…

跨境ERP定制趋势预测:数字化转型助您赢得市场先机

随着全球贸易的不断融合和发展&#xff0c;跨境业务已成为许多企业拓展市场的重要途径。在这个背景下&#xff0c;ERP定制正逐渐成为企业数字化转型的关键利器。本文将为您预测跨境ERP定制的趋势&#xff0c;并探讨数字化转型如何助您赢得市场先机。 ERP定制趋势预测 1. 数据…