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

基于51单片机和WS2812B彩色灯带的流水灯

目录

  • 系列文章目录
  • 前言
  • 一、效果展示
  • 二、原理分析
  • 三、各模块代码
  • 四、主函数
  • 总结

系列文章目录


前言

用彩色灯带按自己想法DIY一条流水灯,谁不喜欢呢?

所用单片机:STC15W204S
(也可以用其他1T单片机,例如,STC8G系列、STC32G系列)

用到的外设:WS2812B彩色灯带(60个灯珠)

效果查看/操作演示:B站搜索“甘腾胜”或“gantengsheng”查看。
源代码下载:B站对应视频的简介有工程文件下载链接。

一、效果展示

在这里插入图片描述

二、原理分析

1、用什么MCU
如果只是驱动一条灯带,并且灯珠的数量不多(少于或等于77个)的话,用STC15W204S是比较合适的。因为只需用到一个引脚,用引脚多的单片机会比较浪费,STC15W204S总共有8个引脚,除了供电的VCC和GND,就只有P30~P33和P54~P55共6个IO口引脚。并且STC15W204S是1T单片机,适合驱动灯带。

我买的板子PCB板上印错了,P54、P55印成了P34、P35。

在这里插入图片描述

2、显示缓存
每个灯珠需要写入24Bit(3个字节)控制显示的颜色,共有Quantity个灯珠的话,要用3*Quantity个字节作为WS2812B彩色灯带的显示缓存。

必须要用到显示缓存,不能只对其中一个灯珠的WS2812B芯片写入数据,因为灯珠内的WS2812B芯片接收的数据是靠上一个灯珠内的WS2812B芯片传递过来的。

更显灯带显示的时候要通过数据线写入3*Quantity个字节。

3、WS2812B芯片
WS2812B芯片要求我们要按G(绿)、R(红)、B(蓝)的顺序发送数据,并且每个字节要高位先发。具体的时序要求可以看一下其他博主的介绍。我们可以用空操作 nop(); 来延时,分频系数为1,频率为24.000MHz的话,一个 nop(); 执行的时长就是1/24us。

为了方便向灯珠中的WS2812B芯片写入数据,缓存数组中的数据每3个字节为一组,每组的3个字节按G、R、B的顺序存放,这样的话,需要更新显示时,就按照索引的顺序,将3*Quantity个字节发送给灯带即可。修改缓存的时候每一组也是需要按照G、R、B的顺序赋值。

第一个灯珠接收了3个字节的数据后,会将后面的数据直接传给第二个灯珠,以此类推。

4、不同灯珠数量的灯带
已经考虑到了这种情况,所以代码中作了相应的处理,修改宏定义中Quantity对应的数值即可,经过测试,如果用STC15W204S的话,1~77个灯都是可以驱动的。

5、亮度的调整
G、R、B的值越大,就表示该种颜色越亮,所以想要调整亮度的话,修改G、R、B的值就行了。

6、函数的设计
可以根据自己的需求设计对应的函数。我觉得以下函数是必须的,其他的可以自由发挥。

①写一个字节的函数
②显示缓存数据清零的函数
③更改一个灯珠对应的三个字节的缓存的函数
④更新显示的函数(将缓存数组的数据全部发送给灯带)

三、各模块代码

四、主函数

main.c

/*
by甘腾胜@20250131
效果查看/操作演示:可以在B站搜索“甘腾胜”或“gantengsheng”查看
开发环境:Keil C51
单片机:STC15W204S
分频系数及频率:1T@24.000MHz
外设:WS2812B彩色灯带(60个灯珠)
注意:
(1)驱动WS2812B彩色点阵屏最好用1T的单片机,想用传统的12T单片机,则需要用较高频率的晶振,并且要使能6T(双倍速)模式
(2)如果使用STC15W204S这款单片机,并且灯珠数量小于等于77的话,根据实际灯珠数量修改宏定义中Quantity对应的数值即可
*/#include <STC15F2K60S2.H>	//包含寄存器定义的头文件
#include <INTRINS.H>	//需要用空操作 _nop_(); 来延时//Quantity:灯珠的数量,如果用STC15W204S,则范围是:1~77(data不能超过256个字节,实测超过77就不能正常显示了)
//想控制更加多的灯珠,需要更换为有较多片外RAM的单片机,一个灯珠需要3个字节的RAM缓存
//并且把缓存数组的idata改成xdata
#define Quantity 60#define Duration1 15	//呼吸灯延时的时长,更改数值可以改变呼吸灯的快慢,数值越大,呼吸灯越慢
#define Duration2 25	//渐变灯延时的时长,更改数值可以改变渐变灯的快慢,数值越大,渐变灯越慢
#define Duration3 30	//流星流水灯延时的时长,更改数值可以改变移动的速度,数值越大,速度越慢//引脚定义
//有6个IO口,P30~P33和P54、P55
//我买的板子PCB板上印错了,P54、P55印成了P34、P35
sbit WS2812B_Din=P5^4;//用3*Quantity个字节作为WS2812B彩色灯带的显示缓存,共有Quantity个灯珠,每个灯珠需要写入24Bit(3个字节)控制显示的颜色
//WS2812B芯片要求按G、R、B的顺序发送数据,并且每个字节要高位先发
//缓存数组中每三个字节为一组,每一组分别对应一个灯珠的G(绿)、R(红)、B(蓝)三原色
//第一组对应数据传输方向的第一个灯珠,第二组对应第二个灯珠,以此类推
//STC15W204S只有256K的片内RAM空间,没有片外RAM空间,只能用idata修饰,不能用xdata修饰,否则灯带不能正常显示
//STC15W204S最多只能定义七十多个灯珠的缓存,想要控制更加多的灯,需要用有较多片外RAM空间的单片机,并且要把idata改成xdata
//想更改灯带的显示,先更改此显示缓存中的数据,再通过函数WS2812B_UpdateDisplay将显示缓存的数据写入每个灯珠的WS2812B芯片内
unsigned char idata WS2812B_Buffer[3*Quantity];//用来实现流水灯退出的效果
unsigned char code Table0[]={
0,0,0,	//无显示
};//通过查表的方法显示流水灯,三个为一组,一组对应一个灯珠的R、G、B的值
unsigned char code Table1[]={	//流星流水灯
255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23,0,0,	//红
15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0,0,0,0,255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23,0,	//绿
0,15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0,0,0,0,255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23,	//蓝
0,0,15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0,255,255,0,191,191,0,127,127,0,95,95,0,63,63,0,47,47,0,31,31,0,23,23,0,	//黄
15,15,0,11,11,0,7,7,0,5,5,0,3,3,0,2,2,0,1,1,0,0,0,0,255,0,255,191,0,191,127,0,127,95,0,95,63,0,63,47,0,47,31,0,31,23,0,23,	//紫
15,0,15,11,0,11,7,0,7,5,0,5,3,0,3,2,0,2,1,0,1,0,0,0,0,255,255,0,191,191,0,127,127,0,95,95,0,63,63,0,47,47,0,31,31,0,23,23,	//青
0,15,15,0,11,11,0,7,7,0,5,5,0,3,3,0,2,2,0,1,1,0,0,0,255,255,255,191,191,191,127,127,127,95,95,95,63,63,63,47,47,47,31,31,31,23,23,23,	//白
15,15,15,11,11,11,7,7,7,5,5,5,3,3,3,2,2,2,1,1,1,0,0,0,
};unsigned char code Table2[]={	//顺向逆向流星流水灯叠加
255,191,127,95,63,47,31,23,15,11,7,5,3,2,1,0,
};/*** @brief  延时函数,1T@24.000MHz调用可延时约xms毫秒* @param  xms 要延时的时间,范围:0~65535* @retval 无*/
void Delay(unsigned int xms)
{unsigned char i,j;while(xms--){i=24;j=85;do{while(--j);}while(--i);}
}/*** @brief  WS2812B彩带私有延时函数,1T@24.000MHz调用可延时约100us* @param  无* @retval 无*/
void WS2812B_Delay100us(void)
{unsigned char i,j;i=3;j=82;do{while(--j);}while(--i);
}/**
* @brief  WS2812B彩色灯带清空显示缓存(需要调用函数WS2812B_UpdateDisplay才能更新灯带的显示)* @param  无* @retval 无*/
void WS2812B_Clear(void)
{unsigned int i;	//如果用unsigned char而不用unsigned int的话,Quantity大于85之后,此函数就会陷入死循环//用unsigned int定义是为了方便拓展显示更多的灯珠for(i=0;i<3*Quantity;i++){WS2812B_Buffer[i]=0;}
}/*** @brief  WS2812B彩色灯带按灯带数据传输方向移动显示数组Array中的数据(需要调用函数WS2812B_UpdateDisplay才能更新灯带的显示)* @param  *Array Array为传递过来的指针(即内存地址),数组名就是数组的首地址* @param  Offset 偏移量,范围:0~Array数组数据总数/3-1Array中的数据三个为一组,移动后第一个灯珠显示第Offset组的数据(第0组为数组Array中的前三个数据)* @retval 无*/
void WS2812B_MoveInOrder(unsigned char *Array,unsigned int Offset){	//Offset用unsigned int定义是为了方便拓展显示更长的流水灯unsigned int i;//缓存数组中的数据按数组索引增大的方向移动3个字节for(i=0;i<Quantity-1;i++){WS2812B_Buffer[3*(Quantity-i)-3]=WS2812B_Buffer[3*(Quantity-i)-6];WS2812B_Buffer[3*(Quantity-i)-2]=WS2812B_Buffer[3*(Quantity-i)-5];WS2812B_Buffer[3*(Quantity-i)-1]=WS2812B_Buffer[3*(Quantity-i)-4];}//移动后,对第一个灯珠对应的三个字节进行赋值,从而实现流水灯的效果Array+=Offset*3;	//指针方面的知识不清楚的先去了解一下WS2812B_Buffer[1]=*Array;	//WS2812B_Buffer中按G、R、B存放,WS2812B_Buffer[0]=*(Array+1);	//Array数组中按R、G、B存放,WS2812B_Buffer[2]=*(Array+2);	//赋值的时候需要调一下顺序
}/*** @brief  WS2812B彩色灯带按灯带数据传输方向的反方向移动显示数组Array中的数据(需要调用函数WS2812B_UpdateDisplay才能更新灯带的显示)* @param  *Array Array为传递过来的指针(即内存地址),数组名就是数组的首地址* @param  Offset 偏移量,范围:0~Array数组数据总数/3-1Array中的数据三个为一组,移动后最后一个灯珠显示第Offset组的数据(第0组为数组Array中的前三个数据)* @retval 无*/
void WS2812B_MoveInReverseOrder(unsigned char *Array,unsigned int Offset)
{unsigned int i;//缓存数组中的数据按数组索引减小的方向移动3个字节for(i=0;i<Quantity-1;i++){WS2812B_Buffer[3*i  ]=WS2812B_Buffer[3*i  +3];WS2812B_Buffer[3*i+1]=WS2812B_Buffer[3*i+1+3];WS2812B_Buffer[3*i+2]=WS2812B_Buffer[3*i+2+3];}//移动后,对最后一个灯珠对应的三个字节进行赋值,从而实现流水灯的效果Array+=Offset*3;WS2812B_Buffer[3*Quantity-2]=*Array;	//WS2812B_Buffer中按G、R、B存放,WS2812B_Buffer[3*Quantity-3]=*(Array+1);	//Array数组中按R、G、B存放,WS2812B_Buffer[3*Quantity-1]=*(Array+2);	//赋值的时候需要调一下顺序
}/*** @brief  WS2812B彩色灯带设置一个灯珠的缓存(需要调用函数WS2812B_UpdateDisplay才能更新灯带的显示)* @param  Position 要设置的位置,范围:0~Quantity-1,对应第1个到第Quantity个灯珠* @param  R 红(Red),范围:0~255* @param  G 绿(Green),范围:0~255* @param  B 蓝(Blue),范围:0~255* @retval 无*/
void WS2812B_SetBuffer(unsigned int Position,unsigned char R,unsigned char G,unsigned char B)
{//缓存数组中,每三个为一组,每一组按G、R、B的顺序存放,//这样方便数据的写入,通过数据线按数组索引顺序直接写入缓存数组的3*Quantity个字节的数据就行了WS2812B_Buffer[3*Position  ]=G;WS2812B_Buffer[3*Position+1]=R;WS2812B_Buffer[3*Position+2]=B;
}/*** @brief  WS2812B彩色灯带写入一个字节* @brief  频率要求:1T@24.000MHz,如果要换其他频率,则需要调整“_nop_();”的数量* @param  Byte 要写入的字节* @retval 无*/
void WS2812B_WriteByte(unsigned char Byte)
{unsigned char i;//	EA=0;	//关闭总中断(如果用到中断的话)(时序要求严格,不能被打断),并要求中断函数执行的时间不能太长//时间太长,相当于发送了重置信号for(i=0;i<8;i++){if(Byte&(0x80>>i))	//写1(高位先发){WS2812B_Din=1;	//根据高电平的时长确定发送的是1还是0,跟DS18B20类似//用空操作进行延时,单片机使用不同的频率,就需要不一样“_nop_();”的数量_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();WS2812B_Din=0;	//经测试,数据线拉低后不用加延时}else	//写0{WS2812B_Din=1;_nop_();_nop_();_nop_();_nop_();_nop_();WS2812B_Din=0;	//经测试,数据线拉低后不用加延时}}//	EA=1;	//开启总中断}/*** @brief  WS2812B彩色灯带更新显示,将显示缓存数组WS2812B_Buffer的数据写入到灯珠的WS2812B芯片内* @param  无* @retval 无*/
void WS2812B_UpdateDisplay(void)
{unsigned int i;for(i=0;i<3*Quantity;i++){WS2812B_WriteByte(WS2812B_Buffer[i]);}	//连续写入显示缓存的3*Quantity个字节WS2812B_Delay100us();	//Reset(重置)信号
}void main()
{unsigned int i,j,k;unsigned char Sum;	//用来控制顺向和逆向流星流水灯的叠加显示//Sum表示顺向或逆向流星流水灯出现的个数总和-1P3M1=0;P3M0=0;	//将P3口设置为上拉模式P5M1=0;P5M0=0;	//将P5口设置为上拉模式while(1){//呼吸灯(红、绿、蓝、黄、紫、青、白)for(k=0;k<7;k++)	//总共要显示七种颜色的呼吸灯{for(i=0;i<256;i=i+3)	//变亮{for(j=0;j<Quantity;j++){switch(k){case 0:WS2812B_SetBuffer(j,i,0,0);break;	//红case 1:WS2812B_SetBuffer(j,0,i,0);break;	//绿case 2:WS2812B_SetBuffer(j,0,0,i);break;	//蓝case 3:WS2812B_SetBuffer(j,i,i,0);break;	//黄case 4:WS2812B_SetBuffer(j,i,0,i);break;	//紫case 5:WS2812B_SetBuffer(j,0,i,i);break;	//青case 6:WS2812B_SetBuffer(j,i,i,i);break;	//白default:break;}}WS2812B_UpdateDisplay();	//更新显示Delay(Duration1);	//延时“Duration1”ms}for(i=0;i<256;i=i+3)	//变暗{for(j=0;j<Quantity;j++){switch(k){case 0:WS2812B_SetBuffer(j,255-i,0,0);break;	//红case 1:WS2812B_SetBuffer(j,0,255-i,0);break;	//绿case 2:WS2812B_SetBuffer(j,0,0,255-i);break;	//蓝case 3:WS2812B_SetBuffer(j,255-i,255-i,0);break;	//黄case 4:WS2812B_SetBuffer(j,255-i,0,255-i);break;	//紫case 5:WS2812B_SetBuffer(j,0,255-i,255-i);break;	//青case 6:WS2812B_SetBuffer(j,255-i,255-i,255-i);break;	//白default:break;}}WS2812B_UpdateDisplay();Delay(Duration1);	//更改延时时间可以改变呼吸灯的快慢}}//红绿蓝三原色渐变for(i=0;i<256;i=i+3)	//红变亮,至全亮{for(j=0;j<Quantity;j++){WS2812B_SetBuffer(j,i,0,0);}WS2812B_UpdateDisplay();	//更新显示Delay(Duration1);}for(k=0;k<2;k++)	//循环2次{for(i=0;i<256;i=i+3)	//红->绿渐变{for(j=0;j<Quantity;j++){WS2812B_SetBuffer(j,255-i,i,0);	//红变暗,至全灭,绿变亮,至全亮}WS2812B_UpdateDisplay();	//更新显示Delay(Duration2);}for(i=0;i<256;i=i+3)	//绿->蓝渐变{for(j=0;j<Quantity;j++){WS2812B_SetBuffer(j,0,255-i,i);	//绿变暗,至全灭,蓝变亮,至全亮}WS2812B_UpdateDisplay();	//更新显示Delay(Duration2);}for(i=0;i<256;i=i+3)	//蓝->红渐变{for(j=0;j<Quantity;j++){WS2812B_SetBuffer(j,i,0,255-i);	//蓝变暗,至全灭,红变亮,至全亮}WS2812B_UpdateDisplay();	//更新显示Delay(Duration2);}}for(i=0;i<256;i=i+3)	//红变暗,至全灭{for(j=0;j<Quantity;j++){WS2812B_SetBuffer(j,255-i,0,0);}WS2812B_UpdateDisplay();	//更新显示Delay(Duration1);}//流星流水灯(红、绿、蓝、黄、紫、青、白)for(j=0;j<2;j++)	//正向,循环2次{for(i=0;i<16*7;i++)	//每种颜色流星灯的长度是16个灯珠,总共有7种颜色{WS2812B_MoveInOrder(Table1,i);WS2812B_UpdateDisplay();Delay(Duration3);	//更改延时时间可以改变流星灯的速度}}for(i=0;i<Quantity;i++)	//退出{WS2812B_MoveInOrder(Table0,0);WS2812B_UpdateDisplay();Delay(Duration3);}for(j=0;j<2;j++)	//逆向,循环2次{for(i=0;i<16*7;i++){WS2812B_MoveInReverseOrder(Table1,i);WS2812B_UpdateDisplay();Delay(Duration3);}}for(i=0;i<Quantity;i++)	//退出{WS2812B_MoveInReverseOrder(Table0,0);WS2812B_UpdateDisplay();Delay(Duration3);}//三原色流星流水灯顺向逆向叠加//相遇的时候会有颜色叠加,看不清楚可以增长延时观察for(k=0;k<2;k++)	//循环2次{Sum=0;for(j=0;j<Quantity+16;j++)	//顺红逆绿{WS2812B_Clear();	//清空缓存for(i=0;i<=Sum;i++){if(j<16)	//流星灯进入过程{WS2812B_Buffer[3*(Sum-i)+1]=Table2[i];	//红WS2812B_Buffer[3*(Quantity-(Sum-i))-3]=Table2[i];	//绿}else if(j-i<Quantity)	//完全进入及退出{WS2812B_Buffer[3*(j-i)+1]=Table2[i];	//红WS2812B_Buffer[3*(Quantity-(j-i))-3]=Table2[i];	//绿}}WS2812B_UpdateDisplay();Sum++;	//每经过一个Delay延时,流星灯进入的数量+1if(Sum>15){Sum=15;}	//流星灯长度为1~16,对应sum的0~15,完全进入后保持15不变//Table2数组中16个数据255,191,127,95,63,47,31,23,15,11,7,5,3,2,1,0,对应的灯珠的亮度Delay(Duration3);}Sum=0;for(j=0;j<Quantity+16;j++)	//顺蓝逆红{WS2812B_Clear();	//清空缓存for(i=0;i<=Sum;i++){if(j<16)	//流星灯进入过程{WS2812B_Buffer[3*(Sum-i)+2]=Table2[i];	//蓝WS2812B_Buffer[3*(Quantity-(Sum-i))-2]=Table2[i];	//红}else if(j-i<Quantity)	//完全进入及退出{WS2812B_Buffer[3*(j-i)+2]=Table2[i];	//蓝WS2812B_Buffer[3*(Quantity-(j-i))-2]=Table2[i];	//红}}WS2812B_UpdateDisplay();Sum++;if(Sum>15){Sum=15;}Delay(Duration3);}Sum=0;for(j=0;j<Quantity+16;j++)	//顺绿逆蓝{WS2812B_Clear();for(i=0;i<=Sum;i++){if(j<16){WS2812B_Buffer[3*(Sum-i)]=Table2[i];	//绿WS2812B_Buffer[3*(Quantity-(Sum-i))-1]=Table2[i];	//蓝}else if(j-i<Quantity){WS2812B_Buffer[3*(j-i)]=Table2[i];	//绿WS2812B_Buffer[3*(Quantity-(j-i))-1]=Table2[i];	//蓝}}WS2812B_UpdateDisplay();Sum++;if(Sum>15){Sum=15;}Delay(Duration3);}}}
}

总结

感觉WS2812B芯片对时序的要求并没有像手册说的那么严格。

相关文章:

基于51单片机和WS2812B彩色灯带的流水灯

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯&#xff0c;谁不喜欢呢&#xff1f; 所用单片机&#xff1a;STC15W204S &#xff08;也可以用其他1T单片机&#xff0c;例如&#xff0c;S…...

React第二十八章(css modules)

css modules 什么是 css modules 因为 React 没有Vue的Scoped&#xff0c;但是React又是SPA(单页面应用)&#xff0c;所以需要一种方式来解决css的样式冲突问题&#xff0c;也就是把每个组件的样式做成单独的作用域&#xff0c;实现样式隔离&#xff0c;而css modules就是一种…...

瑞芯微方案:RV1126定制开发板方案定制

产品简介 RV1126 核心板是常州海图电子科技有限公司推出的一款以瑞芯微 RV1126处理器为核心的通用产品&#xff0c;其丰富的设计资源、稳定的产品性能、强力的设计支持&#xff0c;为客户二次开发快速转化产品提供强有力的技术保障。RV1126 核心板集多种优势于一身&#xff0c…...

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...

ollama改模型的存盘目录解决下载大模型报c:盘空间不足的问题

使用Ollama和Open WebUI快速玩转大模型&#xff1a;简单快捷的尝试各种llm大模型&#xff0c;比如DeepSeek r1&#xff0c;非常简单方便&#xff0c;参见&#xff1a;使用Ollama和Open WebUI快速玩转大模型&#xff1a;简单快捷的尝试各种llm大模型&#xff0c;比如DeepSeek r1…...

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...

Day49:添加字典元素

在 Python 中&#xff0c;字典是一个可变的数据类型&#xff0c;这意味着你可以随时添加新的键值对。今天我们将学习如何向字典中添加元素。 1. 使用方括号 ([]) 添加新元素 最简单的方法是通过字典的键&#xff0c;使用方括号 [] 来添加新的键值对。如果该键已经存在&#x…...

Keepalived 安装

环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64…...

AI应用部署——streamlit

如何把项目部署到一个具有公网ip地址的服务器上&#xff0c;让他人看到&#xff1f; 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库&#xff0c;也包括这些库的…...

C++中vector追加vector

在C中&#xff0c;如果你想将一个vector追加到另一个vector的后面&#xff0c;可以使用std::vector的成员函数insert或者std::copy&#xff0c;或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法&#xff1a; 方法1&#xff1a;使用insert方…...

普通人可以从DeepSeek工具获得什么帮助?

普通人可以从DeepSeek工具获得多方面的帮助&#xff0c;具体如下&#xff1a; 学习与教育 DeepSeek可以为学生提供作业辅导、知识点整理、论文思路生成等服务&#xff0c;帮助他们更好地理解和掌握学习内容。例如&#xff0c;学生可以通过DeepSeek获得详细的解题步骤和思路&…...

EtherCAT-快速搭建

EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的&#xff0c;该通讯协议拓扑结构十分灵活&#xff0c;数据传输速度快&#xff0c;同步特性好&#xff0c;可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

《大数据时代“快刀”:Flink实时数据处理框架优势全解析》

在数字化浪潮中&#xff0c;数据呈爆发式增长&#xff0c;实时数据处理的重要性愈发凸显。从金融交易的实时风险监控&#xff0c;到电商平台的用户行为分析&#xff0c;各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架&#xff0c;在这一领域崭露头…...

【AIGC专栏】AI在自然语言中的应用场景

ChatGPT出来以后&#xff0c;突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类&#xff0c;虽然这是一句夸大其词的话&#xff0c;但是经过未来几十年的迭代&#xff0c;ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说&#xff0c;ChatGPT毫无疑问在当前…...

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型&#xff1a;有限个元素参与抽样&#xff0c;每个元素被抽样的概率相等。 条件概率&#xff1a;在某条件已经达成的前提下&#xff0c;新事件发生的概率。实际计算的时候&#xff0c;应注意区分&#xff0c;如果是计算综…...

数科OFD证照生成原理剖析与平替方案实现

数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD&#xff08;Open Fixed-layout Document&#xff09;是一种基于XML的固定版式文档格式&#xff0c;广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面&#xff1a; OFD文…...

未来无线技术的发展方向

未来无线技术的发展趋势呈现出多样化、融合化的特点&#xff0c;涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升&#xff1a;Wi-Fi 技术迭代加快&#xff0c;如 Wi-Fi7 理论峰值速率达 46Gbps&#…...

验证二叉搜索数(98)

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

Day51:type()函数

在 Python 中&#xff0c;type() 是一个内置函数&#xff0c;用于返回对象的类型。它可以用于检查变量的类型&#xff0c;也可以用于动态创建新的类型。今天&#xff0c;我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...

DeepSeek-R1大模型本地部署及简单测试

目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世&#xff0c;这是一款免费、开源且隐私优…...

【OpenGL】OpenGL游戏案例(二)

文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性&#xff0c;在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据&#xff0c;实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...

AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库

一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...

灵芝黄金基因组注释-文献精读109

The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝&#xff08;Ganoderma lingzhi&#xff09;的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除&#xff0c;开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含&#xff1a;程序&…...

MySQL数据类型转换应注意什么?

文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时&#xff0c;需要注意以下几个关键点&#xff…...

【LLM-agent】(task1)简单客服和阅卷智能体

note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板&#xff0c;某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链&#xff1a;Role (角色) -> Profile&#xff08;角色…...

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...

新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…...

力扣017_最小覆盖字串题解----C++

题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸」现有窗口的 r 指针&#xff0c;和一个用于「收缩」窗口的 l 指针。在任意时刻&#xff0c;只有一个指针运动&#xff0c;而另一个保持静止。我们在 s 上滑动…...

C++:函数

在之前的博客中已经讲过了C语言中的函数概念了&#xff0c;重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充&#xff0c;在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变…...

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程&#xff0c;质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理&#xff0c;用于复习与分享。大佬的博客&#xff1a;恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中&#xff0c;通常根据事件处理的触…...

第一篇:数据库基础与概念

第一篇&#xff1a;数据库基础与概念 目标读者&#xff1a; 没有接触过数据库的初学者。 内容概述&#xff1a; 在本篇文章中&#xff0c;我们将从零开始&#xff0c;详细介绍数据库的基本概念、常见的数据库管理系统&#xff08;DBMS&#xff09;以及数据库设计的基础知识…...

从理论到实践:Django 业务日志配置与优化指南

在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...

常用的 ASCII 码表字符

ASCII&#xff08;美国信息交换标准代码&#xff0c;American Standard Code for Information Interchange&#xff09;是一种字符编码标准&#xff0c;用于表示英文字符、数字、标点符号以及一些控制字符。ASCII 码表包含 128 个字符&#xff0c;每个字符用 7 位二进制数表示&…...

AI大模型开发原理篇-8:Transformer模型

近几年人工智能之所以能迅猛发展&#xff0c;主要是靠2个核心思想&#xff1a;注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位&#xff0c;为NLP带来了革命性的突破‌。可以…...

Golang 并发机制-2:Golang Goroutine 和竞争条件

在今天的软件开发中&#xff0c;我们正在使用并发的概念&#xff0c;它允许一次执行多个任务。在Go编程中&#xff0c;理解Go例程是至关重要的。本文试图详细解释什么是例程&#xff0c;它们有多轻&#xff0c;通过简单地使用“go”关键字创建它们&#xff0c;以及可能出现的竞…...

NVLink 拓扑、DGX 硬件渲染图

文章目录 一个 server 固定 8 个GPUP100&#xff08;4个NVL&#xff09;V100&#xff08;6个NVL&#xff09;A100&#xff08;12个NVL&#xff09;H100&#xff08;18个NVL&#xff09;【DGX-2 &#xff1a;2018年发布NVSwitch&#xff0c;实现full-mesh】【NVLink 拓扑&#x…...

Python XML 解析

Python XML 解析 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。Python 作为一种功能强大的编程语言,拥有多种解析 XML 的库,如 xml.etree.ElementTree 和 lxml。本文将详细介绍 Python 中 XML 解析的方法、技巧和注意事项,帮助您更好地掌握 XML 数据的…...

java求职学习day22

MySQL 基础 &SQL 入门 1. 数据库的基本概念 1.1 什么是数据库 1. 数据库 (DataBase) 就是 存储 和 管理 数据的仓库 2. 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 1.2 为什么使用数据库 数据存储方式的比较 通过上面的比较 , 我们可以看出 , 使…...

stm32教程:EXTI外部中断应用

早上好啊大佬们&#xff0c;上一期我们讲了EXTI外部中断的原理以及基础代码的书写&#xff0c;这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里&#xff0c;我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…...

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…...

快速分析LabVIEW主要特征进行判断

在LabVIEW中&#xff0c;快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征&#xff0c;从而帮助开发者在编写和优化程序时做出及时的判断&#xff0c;避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…...

MySQL数据库(二)

一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 1 所有数据库&#xff1a; show databases; 2 查询当前数据库&#xff1a; select database(); 2 创建-数据库 可以定义数据库的编码方式 create database if not exists ax1; create database ax2…...

Python 梯度下降法(五):Adam Optimize

文章目录 Python 梯度下降法&#xff08;五&#xff09;&#xff1a;Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 Python 梯度下降法&#xff08;五&#xff09;&am…...

表格结构标签

<!-- thead表示表格的头部 tbody表示表格的主体 --> <thead></thead> <tbody></tbody> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…...

gcc和g++的区别以及明明函数有定义为何链接找不到

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

Git进阶之旅:tag 标签 IDEA 整合 Git

第一章&#xff1a;tag 标签远程管理 git 标签 tag 管理&#xff1a; 标签有两种&#xff1a; 轻量级标签(lightweight)带有附注标签(annotated) git tag 标签名&#xff1a;创建一个标签git tag 标签名 -m 附注内容 &#xff1a;创建一个附注标签git tag -d 标签名…...

计算机网络一点事(24)

TCP可靠传输&#xff0c;流量控制 可靠传输&#xff1a;每字节对应一个序号 累计确认&#xff1a;收到ack则正确接收 返回ack推迟确认&#xff08;不超过0.5s&#xff09; 两种ack&#xff1a;专门确认&#xff08;只有首部无数据&#xff09; 捎带确认&#xff08;带数据…...