当前位置: 首页 > news >正文

看设计案例的有哪些网站/营销渠道模式有哪些

看设计案例的有哪些网站,营销渠道模式有哪些,中华会计网校,wordpress 上传图片自动命名目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…

目录

1、环境搭建

2、按键控制灯&电机

LED

电机

垂直按键(机械按键)

3、串口调试功能

4、定时器延时和定时器中断

5、振动强弱调节

6、万年历

7、五方向按键

1、原理及分析

2、程序设计


1、环境搭建

需求:

搭建一个STM32F411CEU6工程

分析:

C / C++   宏定义栏: STM32F411xE

在哪里找?   STM32F411xE

2、按键控制灯&电机

需求:

按键控制灯和电机的开关

第一次按键:LED_ON

第二次按键:LED_OFF

第三次按键:MI_ON

第四次按键:MI_OFF

LED

创建.c和.h文件

添加文件到工程

看原理图

        LED所用到的IO口

        低电平点亮 高电平熄灭

        输出模式

程序设计

        LED初始化函数

/***********************************************
*函数名    :led_init
*函数功能  :对LED灯所用IO口初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :LED------PA7
************************************************/
void led_init(void)
{RCC->AHB1ENR |= (1<<0);GPIOA->MODER &= ~(3<<14);GPIOA->MODER |= (1<<14);GPIOA->OTYPER &= ~(1<<7);GPIOA->OSPEEDR &= ~(3<<14);GPIOA->PUPDR &= ~(3<<14);//初始状态 关GPIOA->ODR |= (1<<7);
}

        开关灯的宏定义

#ifndef _LED_H
#define _LED_H
#include "stm32f4xx.h"                  // Device header#define LED_OFF (GPIOA->ODR |= (1<<7))
#define LED_ON  (GPIOA->ODR &= ~(1<<7))
#define LED_OVERTURN   (GPIOA->ODR ^= (1<<7))void led_init(void);#endif

电机

创建.c和.h文件

添加文件到工程

看原理图

        电机所用到的IO口

        高电平转动 低电平停止

        输出模式

程序设计

        电机初始化函数


/***********************************************
*函数名    :motor_init
*函数功能  :对电机所用IO口初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :motor------PB10
************************************************/
void motor_init(void)
{RCC->AHB1ENR |= (1<<1);GPIOB->MODER &= ~(3<<20);GPIOB->MODER |= (1<<20);GPIOB->OTYPER &= ~(1<<10);GPIOB->OSPEEDR &= ~(3<<20);GPIOB->PUPDR &= ~(3<<20);//初始状态 关GPIOB->ODR &= ~(1<<10);
}

        电机转动和停止的宏定义

#ifndef _MOTOR_H
#define _MOTOR_H#include "stm32f4xx.h"                  // Device header#define MI_OFF (GPIOB->ODR &= ~(1<<10))
#define MI_ON  (GPIOB->ODR |= (1<<10))
#define MI_OVERTURN   (GPIOB->ODR ^= (1<<10))void motor_init(void);
#endif

垂直按键(机械按键)

创建.c和.h文件

添加文件到工程

看原理图

        按键所用到的IO口

        高电平按下 低电平抬起

        输入模式

程序设计

        按键初始化函数

static void delay_ms(u32 ms)
{u32 i = 100 / 4 * 1000 * ms;while(i){i--;}
}/***********************************************
*函数名    :key_init
*函数功能  :对KEY所用IO口初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :KEY_OK------PA0
************************************************/
void key_init(void)
{RCC->AHB1ENR |= (1<<0);GPIOA->MODER &= ~(3<<0);GPIOA->PUPDR &= ~(3<<0);
}

        按键扫描函数

/***********************************************
*函数名    :key_scan
*函数功能  :按键扫描函数
*函数参数  :无
*函数返回值:u8
*函数描述  :
************************************************/
u8 key_scan(void)
{u8 key = 0xff;static u8 key_flag = 1;//判断按键按下if(KEY && key_flag){delay_ms(15);if(KEY){key = KEY_OK;key_flag = 0;MOTOR_VAL = 1000;timer_buff[3]=0;    }}//判断按键抬起if(!KEY){key_flag = 1;}return key;
}

3、串口调试功能

程序设计

        串口初始化配置

/***********************************************
*函数名    :usart1_init
*函数功能  :串口1初始化配置
*函数参数  :u32 bps
*函数返回值:无
*函数描述  :USART1_Tx ---------PA9	USART1_Rx ---------PA10
************************************************/
void usart1_init(u32 bps)
{/*IO口控制器配置*///端口时钟使能RCC->AHB1ENR |= (1<<0);//端口模式配置GPIOA->MODER &= ~((3<<18) | (3<<20));GPIOA->MODER |= ((2<<18) | (2<<20));//端口输出类型GPIOA->OTYPER &= ~(1<<9);//端口输出速度GPIOA->OSPEEDR &= ~(3<<18);   //2M//上下拉配置GPIOA->PUPDR &= ~((3<<18) | (3<<20));//复用功能配置GPIOA->AFR[1] &= ~(15<<4);GPIOA->AFR[1] |= (7<<4);     //PA9配置串口1的发送复用功能GPIOA->AFR[1] &= ~(15<<8);GPIOA->AFR[1] |= (7<<8);     //PA10配置串口1的接收复用功能/*串口1控制器配置*///串口时钟使能RCC->APB2ENR |= (1<<4);//CR1USART1->CR1 &= ~(1<<15);       //16倍过采样USART1->CR1 &= ~(1<<12);       //8位字长USART1->CR1 |= (1<<3)	;        //发送使能USART1->CR1 |= (1<<2)	;        //接收使能//CR2USART1->CR2 &= ~(3<<12);       //1个停止位//BRRUSART1->BRR = 100000000/bps;/*NVIC控制器配置*///优先级分组-----------------------------主函数其他初始化上面//计算优先级编码值u32 pri = NVIC_EncodePriority (5,1,2);//设确定具体中断源NVIC_SetPriority(USART1_IRQn, pri);//使能NVIC响应通道NVIC_EnableIRQ(USART1_IRQn);//串口1空闲中断使能USART1->CR1 |= (1<<4);//串口1接收中断使能USART1->CR1 |= (1<<5);//串口使能USART1->CR1 |= (1<<13);}

        发送一个字节函数

/***********************************************
*函数名    :usart1_send_byte
*函数功能  :串口1发送一个字节函数
*函数参数  :u8 data
*函数返回值:无
*函数描述  :
************************************************/
void usart1_send_byte(u8 data)
{//等待之前的发送完成(等待转态寄存器的发送完成位置1)while(!(USART1->SR & (1<<6)));//	//把要发送的数据赋值给数据寄存器USART1->DR = data;}

        发送一个字符串函数

/***********************************************
*函数名    :usart1_send_str
*函数功能  :串口1发送一个字符串函数
*函数参数  :u8 *str
*函数返回值:无
*函数描述  :
************************************************/
void usart1_send_str(u8 *str)
{while(*str != '\0'){//发送字符usart1_send_byte(*str);//下一字符的地址str++;}}

        中断服务函数

/***********************************************
*函数名    :USART1_IRQHandler
*函数功能  :串口1中断服务函数
*函数参数  :无
*函数返回值:无
*函数描述  :				
************************************************/
u8 usart1_buff[10];void USART1_IRQHandler(void)
{u8 data;//判断是接收中断信号触发if(USART1->SR & (1<<5)){//清除中断标志位//紧急事件}//判断是空闲中断信号触发if(USART1->SR & (1<<4)){//清除中断标志位USART1->SR;USART1->DR;//紧急事件}}

4、定时器延时和定时器中断

定时器延时用timer11

定时器11没有单次计数配置,只能是循环计数,

等待计数完成后,要关闭定时器。

定时器中断用timer9

注意:

时钟频率

分频

不同的芯片可能没有基本定时器6和7

程序设计

定时器11毫秒延时函数

/***********************************************
*函数名    :tim11_delay_ms
*函数功能  :定时器11延时
*函数参数  :u16 ms
*函数返回值:无
*函数描述  :100MHZ--------------100000/ms10000分频-----------10/ms
************************************************/
void tim11_delay_ms(u16 ms)
{//定时器时钟使能RCC->APB2ENR |= (1<<18);//CR1TIM11->CR1 |= (1<<7);          //使能影子寄存器//TIM11->CR1 |= (1<<3);          //单次计数模式TIM11->CR1 &= ~(1<<1);         //产生更新事件//PSC分频寄存器TIM11->PSC = 10000-1;           //10000分频//ARR重载寄存器TIM11->ARR = 10 * ms - 1;//人为产生更新事件UGTIM11->EGR |= (1<<0);//清除状态寄存器更新完成位TIM11->SR &= ~(1<<0);//使能计数器TIM11->CR1 |= (1<<0);//等待计数完成while(!(TIM11->SR & (1<<0)));//关闭定时器TIM11->CR1 &= ~(1<<0);}

定时器11微秒延时函数

/***********************************************
*函数名    :TIM11_delay_us
*函数功能  :定时器11延时微秒
*函数参数  :u16 us
*函数返回值:无
*函数描述  :100MHZ--------------100/us50分频-----------2/us
************************************************/
void TIM11_delay_us(u16 us)
{//定时器时钟使能RCC->APB2ENR |= (1<<18);//CR1TIM11->CR1 |= (1<<7);          //使能影子寄存器//TIM11->CR1 |= (1<<3);          //单次计数模式TIM11->CR1 &= ~(1<<1);         //产生更新事件//PSC分频寄存器TIM11->PSC = 50-1;           //50分频//ARR重载寄存器TIM11->ARR = 2 * us - 1;//人为产生更新事件UGTIM11->EGR |= (1<<0);//清除状态寄存器更新完成位TIM11->SR &= ~(1<<0);//使能计数器TIM11->CR1 |= (1<<0);//等待计数完成while(!(TIM11->SR & (1<<0)));//关闭定时器TIM11->CR1 &= ~(1<<0);
}

定时器9毫秒级定时中断函数

/***********************************************
*函数名    :tim9_interrupt_ms
*函数功能  :定时器9毫秒级定时中断
*函数参数  :u16 ms
*函数返回值:无
*函数描述  :100MHZ--------------100000/ms10000分频-----------10/ms
************************************************/
void tim9_interrupt_ms(u16 ms)
{/*定时器控制器配置*///定时器时钟使能RCC->APB2ENR |= (1<<16);//CR1TIM9->CR1 |= (1<<7);          //使能影子寄存器TIM9->CR1 &= ~(1<<3);         //循环计数模式TIM9->CR1 &= ~(1<<2); TIM9->CR1 &= ~(1<<1); //PSC    分频TIM9->PSC = 10000-1;//ARRTIM9->ARR = 10 * ms - 1;//EGR    UG位,人为产生更新事件       状态寄存器的0号位置1;TIM9->EGR |= (1<<0);//清零状态寄存器TIM9->SR &= ~(1<<0);	/*NVIC控制器配置*/	//优先级分组//计算优先级编码值u32 pri = NVIC_EncodePriority (5,1,1);//设确定具体中断源NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, pri);//使能NVIC响应通道NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);//DIER  定时中断使能TIM9->DIER |= (1<<0);//定时器使能TIM9->CR1 |= (1<<0);
}

5、振动强弱调节

电机变速用PWM

通过查复用表可知:

电机-----PB10--------TIM2_CH3

程序设计

定时器2通道3输出PWM驱动电机函数

/***********************************************
*函数名    :tim2_ch3_pwm_motor
*函数功能  :定时器2通道3驱动PB10,输出PWM
*函数参数  :无
*函数返回值:无
*函数描述  :100MHZ--------------100000/ms-----100/us100分频-----------1/us周期定位1ms     PB10
************************************************/
void tim2_ch3_pwm_motor(void)
{/*IO控制器配置*///端口时钟使能RCC->AHB1ENR |= (1<<1);//端口模式配置-------复用模式GPIOB->MODER &= ~(3<<20);GPIOB->MODER |= (2<<20);//输出类型GPIOB->OTYPER &= ~(1<<10);//输出速度GPIOB->OSPEEDR &= ~(3<<20);//上下拉GPIOB->PUPDR &= ~(3<<20);//复用功能寄存器GPIOB->AFR[1] &= ~(15<<8);GPIOB->AFR[1] |= (1<<8);/*通用定时器控制器配置*///定时器时钟使能RCC->APB1ENR |= (1<<0);//CR1TIM2->CR1 |= (1<<7);        //重载的影子寄存器TIM2->CR1 &= ~(3<<5);       //边沿对齐计数模式TIM2->CR1 &= ~(1<<4);       //递增计数TIM2->CR1 &= ~(1<<3);       //连续模式TIM2->CR1 &= ~(1<<2);TIM2->CR1 &= ~(1<<1);//SMCRTIM2->SMCR &= ~(7<<0);       //选择内部时钟//CCMRxTIM2->CCMR2 &= ~(3<<0);      //把通道3定位输出通道TIM2->CCMR2 |= (1<<3);       //比较寄存器影子TIM2->CCMR2 &= ~(7<<4);TIM2->CCMR2 |= (6<<4);        //PWM1//CCERTIM2->CCER &= ~(1<<9);       //高电平为有效电平//PSCTIM2->PSC = 100-1;//ARRTIM2->ARR = 1000-1;//CCRxTIM2->CCR3 = 0;//EGRTIM2->EGR |= (1<<0);         //人为产生更新事件//通道3打开TIM2->CCER |= (1<<8);//定时器使能TIM2->CR1 |= (1<<0);
}

6、万年历

时钟源   外部低速时钟  32.768KHZ

              内部低速时钟  32KHZ

程序设计

RTC初始化配置

/***********************************************
*函数名    :RTC_init
*函数功能  :RTC初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :			
************************************************/
void RTC_init(RTC_t time)
{/*解除RTC和相关寄存器保护*///使能电源控制器时钟RCC->APB1ENR |= (1<<28);//PWR->CR 的DBP位写1解除RTC控制器保护 PWR->CR |= (1<<8);//秘钥寄存器写入值,解除RTC相关寄存器保护RTC->WPR = 0xca;RTC->WPR = 0x53;/*RTC时钟源设置*///使能内部低速震荡器RCC->CSR |= (1<<0);//等待内部部振荡器就绪while(!(RCC->CSR & (1<<1)));//选择内部低速时钟源RCC->BDCR |= (2<<8);//使能RTC时钟RCC->BDCR |= (1<<15);/*RTC相关寄存器*///CRRTC->CR &= ~(1<<6);     //24hRTC->CR &= ~(1<<5);     //开影子寄存器RTC->WPR = 0xff;/*设置初始时间*/if(RTC->BKP0R != 500){RTC->BKP0R = 500;set_time(time);}}

设置时间函数

/***********************************************
*函数名    :in_dec_out_bcd
*函数功能  :将十进制数据转换成BCD码形式
*函数参数  :u8 dec
*函数返回值:u8
*函数描述  :设置时间时候使用			
************************************************/
u8 in_dec_out_bcd(u8 dec)
{return  ((dec / 10) << 4) | (dec % 10);
}/***********************************************
*函数名    :set_time
*函数功能  :设置时间函数
*函数参数  :RTC_t time
*函数返回值:无
*函数描述  :			
************************************************/
void set_time(RTC_t time)
{u32 temp_t = 0;u32 temp_d = 0;//解除寄存器保护RTC->WPR = 0xca;RTC->WPR = 0x53;//让日历进入初始化模式RTC->ISR |= (1<<7);//等待可以更新日历值while(!(RTC->ISR & (1<<6)));//将设置的十进制数据转换成BCD码temp_t = (in_dec_out_bcd(time.h))<<16  |(in_dec_out_bcd(time.m))<<8   |in_dec_out_bcd(time.s);temp_d =(in_dec_out_bcd(time.year-2000))<<16 |(in_dec_out_bcd(time.week))<<13 |(in_dec_out_bcd(time.mon))<<8   |(in_dec_out_bcd(time.day));//设置TR 和 DRRTC->TR = temp_t;RTC->DR = temp_d;//退出初始化模式RTC->ISR &= ~(1<<7);//激活写保护RTC->WPR = 0xff;}

获取时间函数

/***********************************************
*函数名    :in_bcd_out_dec
*函数功能  :将BCD码形式数据转换成十进制
*函数参数  :u8 bcd
*函数返回值:u8
*函数描述  :获取时间使用	
************************************************/
u8 in_bcd_out_dec(u8 bcd)
{return  (bcd  >> 4) * 10 + (bcd & 0x0f);
}/***********************************************
*函数名    :get_time
*函数功能  :获取时间函数
*函数参数  :无
*函数返回值:RTC_t
*函数描述  :			
************************************************/
RTC_t get_time(void)
{RTC_t t;u32 temp_t = 0;u32 temp_d = 0;//解除寄存器保护RTC->WPR = 0xca;RTC->WPR = 0x53;//ISR寄存器中RSF位0RTC->ISR &= ~(1<<5);//等待同步完成(等待ISR寄存器中RSF位自动变为1)while(!(RTC->ISR & (1<<5)));//读出时间寄存器的值(BCD码)temp_t = RTC->TR;//ISR寄存器中RSF位0RTC->ISR &= ~(1<<5);//等待同步完成(等待ISR寄存器中RSF位自动变为1)while(!(RTC->ISR & (1<<5)));//读出日期寄存器的值(BCD码)temp_d = RTC->DR;//将读出的BCD码转换成十进制形式t.year = in_bcd_out_dec((temp_d & 0xff0000) >> 16) + 2000;t.week = in_bcd_out_dec((temp_d & 0xe000) >> 13);t.mon = in_bcd_out_dec((temp_d & 0x1f00) >> 8);t.day = in_bcd_out_dec((temp_d & 0x3f) >> 0);t.h = in_bcd_out_dec(temp_t >> 16);t.m = in_bcd_out_dec(temp_t >> 8);t.s = in_bcd_out_dec(temp_t >> 0);//激活写保护RTC->WPR = 0xff;//返回结构体变量return t;	
}

7、五方向按键

1、原理及分析

需求:

五方向的按键扫描函数

分析:

垂直按键不参与ADC控制

其他四方向的原理:通过ADC转换得到不同的份数,每份份数代表着不同的方向

通过原理图用到的是PA3

通过查表知道用到ADC1的通道3

 

四个按键方向接在ADC1的3号通道上,不同的方向接了不同的电阻,不同的按键方向就会体现不同的电压值,不同电压值通过AD转换,就会体现出不同的份数.不同的份数就可以识别不同方向的按键.

2、程序设计

设计ADC相关程序

ADC的配置方式有两种:中断的方式获取数据、查询等待的方式获取数据

查询等待的方式:

ADC初始化配置函数

/***********************************************
*函数名    :adc1_ch3_Init
*函数功能  :ADC1通道3
*函数参数  :无
*函数返回值:无
*函数描述  :PA3-----ADC1_CH3------四方向按键
************************************************/
void adc1_ch3_Init(void)
{/*IO口控制器配置*///端口时钟使能RCC->AHB1ENR |= (1<<0);GPIOA->MODER &= ~(3<<6);GPIOA->MODER |= (3<<6);     //模拟模式/*ADC控制器配置*///ADC控制器时钟使能RCC->APB2ENR |= (1<<8);//CR1ADC1->CR1 &= ~(3<<24);                //精度12位ADC1->CR1 |= (1<<8);                  //扫描模式//CR2ADC1->CR2 &= ~(1<<11);                //右对齐ADC1->CR2 |= (1<<10);                 //每个转换完成标志位就置1ADC1->CR2 &= ~(1<<1);                 //单次//SMPRADC1->SMPR2 |= (7<<9);                 //通道3,480个周期//SQR1ADC1->SQR1 &= ~(0xf<<20);               //一共有一个转换             //SQR3ADC1->SQR3 &= ~(0x1f<<0);ADC1->SQR3 |= (3<<0);                  //第一个转换是3号通道//CCRADC->CCR &= ~(3<<16);ADC->CCR |= (1<<16);                     //4分频//ADC使能ADC1->CR2 |= (1<<0);
}

 获取转换数据函数


/***********************************************
*函数名    :get_adc1_data
*函数功能  :获取adc1的转换数据
*函数参数  :无
*函数返回值:u16 
*函数描述  :PA3-----ADC1_CH3------四方向按键
************************************************/
u16 get_adc1_data(void)
{u16 data;//开始转换ADC1->CR2 |= (1<<30);//等待转换完成  while(!(ADC1->SR & (1<<1)));//获取转换数据到变量data = ADC1->DR;//返回转换值return data;
}

        通过调用ADC的获取函数,再通过测试按键,得到不同方向的份数值

        KEY_UP     1000~1100

        KEY_Down   1300~1400

        KEY_L       >=4000

        KEY_R       2000~2100

设计四方向按键相关程序

        四方向按键扫描函数

/***********************************************
*函数名    :fun_key_init
*函数功能  :五方向按键初始化
*函数参数  :无
*函数返回值:无
*函数描述  :
************************************************/
void fun_key_init(void)
{key_init();adc1_ch3_Init();
}/***********************************************
*函数名    :fun_key_scan
*函数功能  :五方向按键扫描函数
*函数参数  :无
*函数返回值:u8
*函数描述  :
************************************************/
u8 fun_key_scan(void)
{u16 data;u8  key_data = 0xff;static u8  adc_flag = 1;//四方向按键data = get_adc1_data();if(adc_flag  &&  data >= 1000 && data <= 1100 )   //UP{adc_flag = 0;key_data = KEY_UP;}else if(adc_flag  && data >= 1300 && data <= 1400)   //Down{adc_flag = 0;key_data = KEY_Down;}else if(adc_flag  && data > 4000)   //left{adc_flag = 0;key_data = KEY_Left;}else if(adc_flag  && data >= 2000 && data <= 2100)   //right{adc_flag = 0;key_data = KEY_Right;}if(data < 20){//解锁标志位adc_flag = 1;}return key_data;
}

        结合垂直按键写出五方向按键扫描函数

/***********************************************
*函数名    :fun_key_scan
*函数功能  :五方向按键扫描函数
*函数参数  :无
*函数返回值:u8
*函数描述  :
************************************************/
u8 fun_key_scan(void)
{u16 data;u8  key_data = 0xff;static u8  adc_flag = 1;//垂直按键key_data = key_scan();//四方向按键data = get_adc1_data();if(adc_flag  &&  data >= 1000 && data <= 1100 )   //UP{adc_flag = 0;key_data = KEY_UP;}else if(adc_flag  && data >= 1300 && data <= 1400)   //Down{adc_flag = 0;key_data = KEY_Down;}else if(adc_flag  && data > 4000)   //left{adc_flag = 0;key_data = KEY_Left;}else if(adc_flag  && data >= 2000 && data <= 2100)   //right{adc_flag = 0;key_data = KEY_Right;}if(data < 20){//解锁标志位adc_flag = 1;}return key_data;
}

若想要实现,按住不抬起能每隔一秒返回一次键值?

利用定时中断,超时检测1S解锁一次标志位

u8 fun_key_scan(void)
{u16 data;u8  key_data = 0xff;static u8  adc_flag = 1;//垂直按键key_data = key_scan();//四方向按键data = get_adc1_data();if(adc_flag  &&  data >= 1000 && data <= 1100 )   //UP{adc_flag = 0;key_data = KEY_UP;timer_buff[3]=0;                  //开始1s计时MOTOR_VAL = 1000;}else if(adc_flag  && data >= 1300 && data <= 1400)   //Down{adc_flag = 0;key_data = KEY_Down;timer_buff[3]=0;                 //开始1s计时MOTOR_VAL = 1000;}else if(adc_flag  && data > 4000)   //left{adc_flag = 0;key_data = KEY_Left;timer_buff[3]=0;                 //开始1s计时MOTOR_VAL = 1000;}else if(adc_flag  && data >= 2000 && data <= 2100)   //right{adc_flag = 0;key_data = KEY_Right;timer_buff[3]=0;                 //开始1s计时MOTOR_VAL = 1000;}if(data < 20 || timer_buff[3]==1000){//解锁标志位adc_flag = 1;}return key_data;
}

相关文章:

基本功能实现

目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…...

《那个让服务器“跳舞”的bug》

在程序的世界里&#xff0c;bug 就像隐藏在暗处的小怪兽&#xff0c;时不时跳出来捣乱。而在我的职业生涯中&#xff0c;有一个bug让我至今难忘&#xff0c;它不仅让项目差点夭折&#xff0c;还让我熬了无数个通宵。这个故事发生在一个风和日丽的下午&#xff0c;我们正在开发一…...

Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中&#xff0c;我们学习了如何使用 Python 构建一个基本的网络爬虫。然而&#xff0c;在实际应用中&#xff0c;许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此&#xff0c;本篇文章将深入探讨以下进阶主题&#xff1a; 如何处理动态加载的网…...

创建可直接用 root 用户 ssh 登陆的 Docker 镜像

有时候我们在 Mac OS X 或 Windows 平台下需要开发以 Linux 为运行时的应用&#xff0c;IDE 或可直接使用 Docker 容器&#xff0c;或 SSH 远程连接。本地命令行下操作虽然可以用 docker exec 连接正在运行的容器&#xff0c;但 IDE 远程连接的话 SSH 总是一种较为通用的连接方…...

wordpress 中添加图片放大功能

功能描述 使用 Fancybox 实现图片放大和灯箱效果。自动为文章内容中的图片添加链接&#xff0c;使其支持 Fancybox。修改了 header.php 和 footer.php 以引入必要的 CSS 和 JS 文件。在 functions.php 中通过过滤器自动为图片添加 data-fancybox 属性。 最终代码 1. 修改 hea…...

数据结构 (7)线性表的链式存储

前言 线性表是一种基本的数据结构&#xff0c;用于存储线性序列的元素。线性表的存储方式主要有两种&#xff1a;顺序存储和链式存储。链式存储&#xff0c;即链表&#xff0c;是一种非常灵活和高效的存储方式&#xff0c;特别适用于需要频繁插入和删除操作的场景。 链表的基本…...

库的操作.

创建、删除数据库 创建语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name[ ]是可选项&#xff0c;IF NOT EXISTS 是表明如果不存在才能创建数据库 //查看数据库&#xff0c;假设7行 show databases; //创建数据库 --- 本质在Linux创建一个目录 create database databa…...

Vue进阶之Vue CLI服务—@vue/cli-service Vuex

Vue CLI服务—vue/cli-service & Vuex vue/cli-service初识bin/vue-cli-service.js代码执行解读 Vuexgenerator/index.jsstore/index.js插件化的能力怎么引入呢&#xff1f; vue/cli-service 初识 第一块是上一个讲述的cli是把我们代码的配置项&#xff0c;各种各样的插件…...

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…...

数据库操作、锁特性

1. DML、DDL和DQL是数据库操作语言的三种主要类型 1.1 DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言 DML是用于检索、插入、更新和删除数据库中数据的SQL语句。 主要的DML语句包括&#xff1a; SELECT&#xff1a;用于查询数据库中的数据。 INSERT&a…...

学习笔记039——SpringBoot整合Redis

文章目录 1、Redis 基本操作Redis 默认有 16 个数据库&#xff0c;使用的是第 0 个&#xff0c;切换数据库添加数据/修改数据查询数据批量添加批量查询删除数据查询所有的 key清除当前数据库清除所有数据库查看 key 是否存在设置有效期查看有效期 2、Redis 数据类型String追加字…...

(笔记)简单了解ZYNQ

1、zynq首先是一个片上操作系统&#xff08;Soc&#xff09;&#xff0c;结合了arm&#xff08;PS&#xff09;和fpga&#xff08;PL&#xff09;两部分组成 Zynq系统主要由两部分组成&#xff1a;PS&#xff08;Processing System&#xff09;和PL&#xff08;Programmable L…...

大众点评小程序mtgsig1.2算法

测试效果&#xff1a; var e function _typeof(o) {return "function" typeof Symbol && "symbol" typeof Symbol.iterator? function (o) {return typeof o;}: function (o) {return o && "function" typeof Symbol &…...

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…...

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%&#xff0c;这个数字越小越透明(尽量别低于50%&#xff0c;不信你试试看)&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...

基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着人工智能技术的迅猛发展&#xff0c;智能课堂行为分析逐渐成为提高教学质量和提升教学效率的关键工具之一。在现代教学环境中&#xff0c;能够实时了解教师的课堂表现和行为&#xff0c;对于促进互动式教学和个性化辅导具有重要意义。传统的课堂行为分析依赖于人工观测&…...

使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件

使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件 Python 是一门强大的编程语言&#xff0c;它不仅可以用于数据处理、自动化脚本&#xff0c;还可以用于创建图形用户界面 (GUI) 应用程序。在本教程中&#xff0c;我们将使用 Python 的标准库模块 tkinter 创建一…...

【C++笔记】模板进阶

前言 各位读者朋友们大家好&#xff01;上一期我们讲了stack、queue以及仿函数。先前我们讲过模板的初阶内容&#xff0c;这一期我们来更深入的学习一下模板。 一. 非类型模板参数 1.1 非类型模板参数 模板参数分为类型形参和类类型形参&#xff1a; 类型形参&#xff1a;…...

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新

随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…...

ffmpeg.wasm 在浏览器运行ffmpeg操作视频

利用ffmpeg.wasm&#xff0c;可以在浏览器里运行ffmpeg,实现对音视频的操作 参考链接&#xff1a; https://blog.csdn.net/jchsgwbr/article/details/143252044 https://gitee.com/CXBalCai/ffmpeg-template 其他参考 https://github.com/ffmpegwasm/ffmpeg.wasm https://b…...

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…...

CentOS上如何离线批量自动化部署zabbix 7.0版本客户端

CentOS上如何离线批量自动化部署zabbix 7.0版本客户端 管理的服务器大部分都是CentOS操作系统&#xff0c;版本主要是CentOS 7。因为监控服务器需要&#xff0c;要在前两天搭建的Zabbix 7.0系统上把这些CentOS 7系统都监控起来。因为服务器数量众多&#xff0c;而且有些服务器…...

【开源项目】ChinaAddressCrawler 中国行政区划数据(1980-2023年)采集及转换(Java版),含SQL格式及JSON格式

ChinaAddressCrawler 开源项目地址&#xff1a;https://gitee.com/li_yu_jiang/ChinaAddressCrawler 来源于国家民政部的数据只包括省级&#xff08;省/直辖市/自治区/特别行政区&#xff09;、地级&#xff08;地级市/地区/自治州/盟&#xff09;、县级&#xff08;县/市辖区…...

React中事件处理和合成事件:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Local Changes不展示,DevEco Studio的git窗口中没有Local Changes

DevEco Studio的git窗口中&#xff0c;没有Local Changes&#xff0c;怎么设置可以调出&#xff1f; 进入File-->Settings-->Version Control&#xff0c;将Use non-modal commit interface前的勾选框取消勾选&#xff0c;点击OK即可在打开git窗口&#xff0c;就可以看到…...

大数据笔记

第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征&#xff0c;并结合生活实例谈谈带来的影响。 &#xff08;一&#xff09;特征 1、Volume 规模性&#xff1a;数据量大。 2、Velocity高速性&#xff1a;处理速度快。数据的生成和响…...

【Linux网络编程】TCP套接字

TCP与UDP的区别&#xff1a; udp是无连接的、面向数据报&#xff08;通信时以数据报为单位传输&#xff09;的传输层通信协议&#xff0c;其中每个数据报都是独立的&#xff0c;通信之前不需要建立连接&#xff0c;bind绑定套接字后直接可以进行通信。 tcp是面向连接的、基于字…...

在Manjaro Gnome桌面的基础上安装Budgie桌面环境

在Manjaro上安装Budgie桌面环境 Budgie是Solus团队开发的一种简单而优雅的桌面环境。 Budgie是由Solus项目主要开发的流行桌面环境&#xff0c;与GNOME堆栈紧密集成。它提供了简单而优雅的用户体验&#xff0c;并且可用于大多数发行版&#xff0c;如Arch、Debian、Manjaro等。…...

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…...

前后端中Json数据的简单处理

很多时候因为数据库中不想创建中间表去存一些数据&#xff0c;所以在一个实体表中用一个json字段去存储并处理这些数据。本人倾向在前端js部分直接处理json数据&#xff0c;后端只做存储&#xff0c;不做处理。 前端在获取表单的时候解析 toEdit(row) {this.editForm { ...ro…...