(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
目录
源代码
main.c
LCD1602.c
LCD1602.h
DS1302.c
DS1302.h
代码解析与教程:
LCD1602模块
DS1302模块
效果视频:
源代码
如上图将5个文放在Keli5 中即可,然后烧录在单片机中就行了
烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频:
【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=2&vd_source=ada7b122ae16cc583b4add52ad89fd5e
源代码:
头文件要记得宏定义和重定义,避免重复调用:
#ifndef _Timer0_h_//名字根据文件名定义即可
#define _Timer0_h_//声明函数……#endif
main.c
#include <STC89C5xRC.H>
#include "LCD1602.h"
#include "DS1302.h"//主程序
void main(){LCD_Init();//LCD1602初始化DS1302_Init();//DS1302初始化LCD_ShowString(1,1," - - ");//LCD显示年月日间隔符号LCD_ShowString(2,1," : : ");//LCD显示时分秒间隔符号DS1302_SetTime();//初始化设定日期时间while(1){DS1302_ReadTime();//改变定义并读取日期时间LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒}
}
LCD1602.c
#include <STC89C5xRC.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief LCD1602延时函数,12MHz调用可延时1ms* @param 无* @retval 无*/
void LCD_Delay() //@11.0592MHz
{unsigned char i, j;i = 11;j = 190;do{while (--j);} while (--i);
}/*** @brief LCD1602写命令* @param Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief LCD1602写数据* @param Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief LCD1602设置光标位置* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief LCD1602初始化函数* @param 无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief 在LCD1602指定位置上显示一个字符* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @param Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief 在LCD1602指定位置开始显示所给字符串* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief 返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief 在LCD1602指定位置开始显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~65535* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief 在LCD1602指定位置开始以有符号十进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:-32768~32767* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief 在LCD1602指定位置开始以十六进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~0xFFFF* @param Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief 在LCD1602指定位置开始以二进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~1111 1111 1111 1111* @param Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数:
void LCD_Init();//初始化
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);//显示单个字符
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);//显示字符串
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//显示数字
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);//显示带符号数字
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//显示十进制数字
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//显示二进制数字#endif
DS1302.c
#include <STC89C5xRC.H>//初始化定义引脚
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;//宏定义日期,和写入保护地址
#define DS1302_S 0x80//秒
#define DS1302_M 0x82//分
#define DS1302_H 0x84//时
#define DS1302_D 0x86//日
#define DS1302_MON 0x88//月
#define DS1302_DAY 0x8A//星期
#define DS1302_Y 0x8C//年
#define DS1302_WP 0x8E//写入保护//初始化定义日期时间数组
//对应年月 日 时 分 秒 星期
unsigned char DS1302_Time[]={25,4,15,20,59,55,2};//十进制转BCD进制函数
unsigned char HEX_BCD(unsigned char n){return n/10*16+n%10;
}
//BCD进制转十进制函数
unsigned char BCD_HEX(unsigned char n){return n/16*10+n%16;
}//DS1302的初始化函数
void DS1302_Init(){DS1302_CE=0;DS1302_SCLK=0;
}//DS1302的写入函数
//第一个参数Command是命令字,第二个参数Data是数据
void DS1302_WriteByte(unsigned char Command,Data){unsigned char i;//循环,移位计数DS1302_CE=1;//改变为高电平,写入for(i=0;i<8;i++){//循环8次,写入寄存器DS1302_IO=Command&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=1;//改变高电位,写入寄存器DS1302_SCLK=0;//改变低电位,准备写入寄存器}for(i=0;i<8;i++){//循环8次,写8个数据DS1302_IO=Data&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=1;//改变高电位,写入数据DS1302_SCLK=0;//改变低电位,准备写入数据}DS1302_CE=0;//恢复,初始化
}//DS1302的读入函数
//第一个参数Command是命令字
unsigned char DS1302_ReadByte(unsigned char Command){unsigned char i,Data=0x00;//循环,移位计数;数据Command|=0x01;//清空,使最后一位为1;DS1302_CE=1;//改变为高电平,写入for(i=0;i<8;i++){//循环8次,读寄存器DS1302_IO=Command&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=0;//改变低电位,准备读寄存器DS1302_SCLK=1;//改变高电位,读寄存器}for(i=0;i<8;i++){DS1302_SCLK=1;//改变高电位,读数据DS1302_SCLK=0;//改变低电位,准备读数据if(DS1302_IO==1){Data=Data|(0x01<<i);}//低位在前,初始化Data的最低位为1,左移初始化当前位为1}DS1302_CE=0;//恢复,初始化DS1302_IO=0;//恢复,初始化return Data;//返回值为当前数据
}//设定日期时间函数
void DS1302_SetTime(){//数据必须为BCD,因此转换DS1302_WriteByte(DS1302_WP,0x00);//关闭写入保护DS1302_WriteByte(DS1302_Y,HEX_BCD(DS1302_Time[0]));//写入年DS1302_WriteByte(DS1302_MON,HEX_BCD(DS1302_Time[1]));//写入月DS1302_WriteByte(DS1302_D,HEX_BCD(DS1302_Time[2]));//写入日DS1302_WriteByte(DS1302_H,HEX_BCD(DS1302_Time[3]));//写入时DS1302_WriteByte(DS1302_M,HEX_BCD(DS1302_Time[4]));//写入分DS1302_WriteByte(DS1302_S,HEX_BCD(DS1302_Time[5]));//写入秒DS1302_WriteByte(DS1302_DAY,HEX_BCD(DS1302_Time[6]));//写入星期DS1302_WriteByte(DS1302_WP,0x80);//打开写入保护
}//改变定义并读取日期时间函数
void DS1302_ReadTime(){//数据必须为十进制,因此转换unsigned char Temp;//定义临时变量Temp=DS1302_ReadByte(DS1302_Y);DS1302_Time[0]=BCD_HEX(Temp);//读年Temp=DS1302_ReadByte(DS1302_MON);DS1302_Time[1]=BCD_HEX(Temp);//读月Temp=DS1302_ReadByte(DS1302_D);DS1302_Time[2]=BCD_HEX(Temp);//读日Temp=DS1302_ReadByte(DS1302_H);DS1302_Time[3]=BCD_HEX(Temp);//读时Temp=DS1302_ReadByte(DS1302_M);DS1302_Time[4]=BCD_HEX(Temp);//读分Temp=DS1302_ReadByte(DS1302_S);DS1302_Time[5]=BCD_HEX(Temp);//读秒Temp=DS1302_ReadByte(DS1302_DAY);DS1302_Time[6]=BCD_HEX(Temp);//读日期
}
DS1302.h
#ifndef __DS1302_H__
#define __DS1302_H__//用户调用函数:
extern unsigned char DS1302_Time[];//声明数组
unsigned char DS1302_ReadByte(unsigned char Command);//声明读数据函数
void DS1302_WriteByte(unsigned char Command,Data);//声明写数据函数
void DS1302_Init();//声明初始化函数
void DS1302_ReadTime();//声明读日期时间函数
void DS1302_SetTime();//声明设置日期时间函数
unsigned char BCD_HEX(unsigned char n);//声明BCD转十进制
unsigned char HEX_BCD(unsigned char n);//声明十进制转BCD
#endif
代码解析与教程:
LCD1602模块
- 包含源代码与头文件,不需要知道怎么实现的会用即可,后续使用,直接将头文件和源代码拿过来用即可;使用格式:(参考江科大的视频素材)
- LCD1602相关重要知识:
- LCD1602有两上下两行显示屏,每行各有16个小显示屏,如上图中的LCD_ShowString(1,3,"Hello"),第一个参数是第一行还是第二行,第2个参数是对应第几行的第几个小显示屏,最后一个是输出的东西,同理,到LCD_ShowNum(1,9,123,3)里,前三个和前面一样,最后一个参数是显示的位数,不够就在前面补0,例如输入1,参数为4,显示就是0001,输入23,参数为3,显示就是023
- 上图是LCD1602的开发原理模块图,由图可知,P10-P17是控制显示屏的重点;像矩阵那样,S1,由P17和P13控制,同理,其他按键一样,由于开发板限制,我们一般使用列遍历来控制按键,例如:S1,S5,S9,S13他们四个共用P13,所以将其为1列,将P13设定为1,P17设定为0,S1就会亮,其他按键同理。
DS1302模块
- 包含源代码与头文件,需要知道怎么实现的,会用,后续使用,直接将头文件和源代码拿过来用即可;
- 先看原理图:
- 图中可以知道SCLK,IO,CE的地址,因此,在代码中定义地址:
//初始化定义引脚 sbit DS1302_SCLK=P3^6; sbit DS1302_IO=P3^4; sbit DS1302_CE=P3^5;
![]()
上面是读,下面是写,定义好地址后;如图,只有在CE=1(高电平)时,操作才能实现;SCLK上升就是从0变1,下降就是1变0;IO前半部分就是寄存器(不需要怎么理解),后半部分是数据。
先看下面的读操作(相对简单):首先CE=1;SCLK从头上升下降到尾,全程写入寄存器和数据;IO的R/W=0,就是写;最后一个固定为1;
再看上面的读操作(相对简单):首先CE=1;SCLK从头上升下降到中间(读寄存器),然后下降上升开始转换成读数据;IO的R/W=1,就是读;最后一个固定为1;
![]()
RTC就是IO总体部分,序号1是Read读的地址,序号2是Write写的地址,第一列是秒,第二列是分,以此类推看图中英文确定作用,WP是写入保护;Address/Command Byte就是IO元素部分,在读写操作时,低位在前。这部分又叫寄存器地址,或者命令符,来看相关代码://DS1302的写入函数 //第一个参数Command是命令字,第二个参数Data是数据 void DS1302_WriteByte(unsigned char Command,Data){unsigned char i;//循环,移位计数DS1302_CE=1;//改变为高电平,写入for(i=0;i<8;i++){//循环8次,写入寄存器DS1302_IO=Command&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=1;//改变高电位,写入寄存器DS1302_SCLK=0;//改变低电位,准备写入寄存器}for(i=0;i<8;i++){//循环8次,写8个数据DS1302_IO=Data&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=1;//改变高电位,写入数据DS1302_SCLK=0;//改变低电位,准备写入数据}DS1302_CE=0;//恢复,初始化 }//DS1302的读入函数 //第一个参数Command是命令字 unsigned char DS1302_ReadByte(unsigned char Command){unsigned char i,Data=0x00;//循环,移位计数;数据Command|=0x01;//清空,使最后一位为1;DS1302_CE=1;//改变为高电平,写入for(i=0;i<8;i++){//循环8次,读寄存器DS1302_IO=Command&(0x01<<i);//低位在前,获取Command的最低位,左移获得当前位DS1302_SCLK=0;//改变低电位,准备读寄存器DS1302_SCLK=1;//改变高电位,读寄存器}for(i=0;i<8;i++){DS1302_SCLK=1;//改变高电位,读数据DS1302_SCLK=0;//改变低电位,准备读数据if(DS1302_IO==1){Data=Data|(0x01<<i);}//低位在前,初始化Data的最低位为1,左移初始化当前位为1}DS1302_CE=0;//恢复,初始化DS1302_IO=0;//恢复,初始化return Data;//返回值为当前数据 }
由上可知,SCLK每次变化电平,就会进行数据的读写操作,但由于数据是先进先出的,所以低位在前。
- 宏定义日期时间地址,提高代码可读性,便于修改和维护,代码:
//宏定义日期,和写入保护地址 #define DS1302_S 0x80//秒 #define DS1302_M 0x82//分 #define DS1302_H 0x84//时 #define DS1302_D 0x86//日 #define DS1302_MON 0x88//月 #define DS1302_DAY 0x8A//星期 #define DS1302_Y 0x8C//年 #define DS1302_WP 0x8E//写入保护
- 其余代码,注释很详细:
//初始化定义日期时间数组 //对应年月 日 时 分 秒 星期 unsigned char DS1302_Time[]={25,4,15,20,59,55,2};//十进制转BCD码函数 unsigned char HEX_BCD(unsigned char n){return n/10*16+n%10; } //BCD码转十进制函数 unsigned char BCD_HEX(unsigned char n){return n/16*10+n%16; }//DS1302的初始化函数 void DS1302_Init(){DS1302_CE=0;DS1302_SCLK=0; }
数组是初始化日期时间;
转换进制函数,以及BCD码是什么:
- 配合上述所有知识,数组,读写操作,进制转换,宏定义等知识点;设置日期时间,改变定义读日期时间代码:
//设定日期时间函数 void DS1302_SetTime(){//数据必须为BCD,因此转换DS1302_WriteByte(DS1302_WP,0x00);//关闭写入保护DS1302_WriteByte(DS1302_Y,HEX_BCD(DS1302_Time[0]));//写入年DS1302_WriteByte(DS1302_MON,HEX_BCD(DS1302_Time[1]));//写入月DS1302_WriteByte(DS1302_D,HEX_BCD(DS1302_Time[2]));//写入日DS1302_WriteByte(DS1302_H,HEX_BCD(DS1302_Time[3]));//写入时DS1302_WriteByte(DS1302_M,HEX_BCD(DS1302_Time[4]));//写入分DS1302_WriteByte(DS1302_S,HEX_BCD(DS1302_Time[5]));//写入秒DS1302_WriteByte(DS1302_DAY,HEX_BCD(DS1302_Time[6]));//写入星期DS1302_WriteByte(DS1302_WP,0x80);//打开写入保护 }//改变定义并读取日期时间函数 void DS1302_ReadTime(){//数组内容为十进制,因此转换unsigned char Temp;//定义临时变量Temp=DS1302_ReadByte(DS1302_Y);DS1302_Time[0]=BCD_HEX(Temp);//读年Temp=DS1302_ReadByte(DS1302_MON);DS1302_Time[1]=BCD_HEX(Temp);//读月Temp=DS1302_ReadByte(DS1302_D);DS1302_Time[2]=BCD_HEX(Temp);//读日Temp=DS1302_ReadByte(DS1302_H);DS1302_Time[3]=BCD_HEX(Temp);//读时Temp=DS1302_ReadByte(DS1302_M);DS1302_Time[4]=BCD_HEX(Temp);//读分Temp=DS1302_ReadByte(DS1302_S);DS1302_Time[5]=BCD_HEX(Temp);//读秒Temp=DS1302_ReadByte(DS1302_DAY);DS1302_Time[6]=BCD_HEX(Temp);//读日期 }
效果视频:
DS1302时钟
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!
相关文章:
(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
目录 源代码 main.c LCD1602.c LCD1602.h DS1302.c DS1302.h 代码解析与教程: LCD1602模块 DS1302模块 效果视频: 源代码 如上图将5个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的…...
编译原理(自考13007)
资源内容 大纲 概述...
C#Winform程序将子窗体嵌入容器方法
private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...
WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用
目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...
WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】
一、界面设计与操作体验 WPS Office安卓版采用简洁直观的界面设计,首页默认展示近期文档列表,支持一键新建文档、表格或演示文稿。整体操作逻辑与PC端保持一致,新用户也能快速上手。编辑工具栏设计合理,常用功能如字体设置、段落…...
【经验记录贴】使用配置文件提高项目的可维护性
mark一下。 整体修改前后如下: 课题: 在项目中有一个支持的文件类型的FILE_TYPE的定义, 这个是写死在主程序中,每次增加可以支持的文件类型的时候,都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...
传统建筑管理人力成本高,楼宇自控系统如何有效降低运营成本
在传统建筑管理模式下,人力成本一直居高不下,成为建筑运营方沉重的负担。从设备的日常巡检、维护,到环境的调控以及能源的管理,无一不需要大量人力投入。然而,随着科技的飞速发展,楼宇自控系统应运而生&…...
RabbitMQ demo案例
1. 下载和安装 RabbitMQ RabbitMQ 依赖 Erlang 运行时,所以得先装 Erlang,再装 RabbitMQ。下面以 Ubuntu 为例,Windows 和 macOS 也顺便提一下。 1.1 安装 Erlang RabbitMQ 需要 Erlang 支持,先装它。 Windows: 去 Erl…...
第T8周:猫狗识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 第T8周:猫狗识别 tf.config.list_physical_devices(“GPU”),用于检测当前系统是否有可用的 GPU,并将结果存入 gpus 变量。…...
旅游特种兵迪士尼大作战:DeepSeek高精准路径优化
DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近,环球影城等备受瞩目的主题游乐场,已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而,随之而来的庞大客流,却总让无数游客在欢乐的…...
ffmpeg-将多个视频去掉音频 然后切片组合成一个视频,再将新视频配置上新的音频
需求分解 1、去除原视频的音频轨道。 2、对去掉音频的视频进行切片。 3、将多个视频切片合并为一个新视频。 4、给新的视频添加新的音频轨道。 去除视频音频 要去除视频中的音频,只需使用以下命令 ffmpeg -i input1.mp4 -an -c:v copy output1_no_audio.mp4解释&a…...
05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南
微服务可观测性体系建设:从日志、监控到链路追踪实战指南 一、可观测性:微服务架构的 “神经系统” 1.1 为什么需要可观测性? 在分布式微服务架构中,服务节点可能达数百个,请求链路跨越多服务、数据库、消息队列&am…...
音视频小白系统入门笔记-0
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败? 默认…...
基于 PyTorch 的 LSTM 实现降雨量预测
基于 PyTorch 的 LSTM 实现降雨量预测示例。包括数据准备、模型定义、训练和预测等。 文章目录 1. 数据准备:2. 模型定义:3. 训练过程:4. 预测和评估:5. 可视化:代码实现1. 数据准备: 使用随机生成的数据作为示例,实际应用中请替换为真实数据。数据被归一化到 [0, 1] 范…...
Spring-Bean的生命周期
一、什么是Bean生命周期? Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期,包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点,允许开发者在各阶段插入自定义逻辑。 二、Bean生命周期全流程&am…...
AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…...
yml文件上传并映射到实体类
文章目录 功能背景功能需要前端开发组件选用组件嵌套和参数绑定上传逻辑示例 后端开发接收逻辑解析逻辑省流纯手动实现(不建议) 功能背景 开发一个配置文件解析功能,需要兼容老版本的配置文件。 功能需要 前端:两个配置文件分别…...
What are the advantages of our neural network inference framework?
What are the advantages of our neural network inference framework? 1. Background2. What are the advantages of our neural network inference framework?References 1. Background Let me introduce /ˌɪntrəˈdjuːs/ the background /ˈbkɡraʊnd/ first. Today…...
猿辅导集团推首个教育AI范式小猿AI 聚焦家校应用场景发布3款新品
近两年,通用大模型呈爆发式发展,垂类AI遭遇“技术平替”危机。 4月15日,猿辅导集团在“小猿AI暨智能硬件战略发布会”上,正式推出首个教育AI范式——“小猿AI”,并发布覆盖家校两端的“软件应用智能终端通识课程”三位…...
10【模块学习】LCD1602(二):6路温度显示+实时时钟
项目:6路温度显示实时时钟 1、6路温度显示①TempMenu.c文件的代码②TempMenu.h文件的代码③main.c文件的代码④Timer.c文件的代码⑤Delay.c文件的代码⑥Key.c文件的代码 2、实时时钟显示①BeiJingTime.c文件的代码②BeiJingTime.h文件的代码③main.c文件的代码如下④…...
Embedding在RAG中的核心作用及其几何类比-来自DeepSeek
1. 核心概念映射 Embedding的本质:将文本、图像等非结构化数据转化为高维空间中的坐标点(向量),例如: 句子A → 向量 [0.2, -1.5, 3.0, ..., 0.7](假设维度为768) 句子B → 向量 [0.3, -1.4, 2…...
前端快速入门——JavaScript函数、DOM
1.JavaScript函数 函数是一段可重复使用的代码块,它接受输入(参数)、执行特定任务,并返回输出。 <scricpt>function add(a,b){return ab;}let cadd(5,10);console.log(c); </script>2.JavaScript事件 JavaScript绑定事件的方法࿱…...
AOSP14 Launcher3——最近任务TaskViewSimulator详解
前言:TaskViewSimulator 这个类在最近任务中起到了一个非常重要的作用。 从字面意思上理解,这个单词是由TaskViewSimulator组合而来,字面意思就是TaskView的模拟器,顾名思义,就是一个用来模拟TaskView的类。 为什么要模…...
层次式架构核心:中间层的功能、优势与技术选型全解析
层次式架构中的中间层是整个架构的核心枢纽,承担着多种重要职责,在功能实现、优势体现以及技术选型等方面都有丰富的内容,以下为你详细介绍: 一、功能 1.业务逻辑处理 复杂规则运算:在许多企业级应用中,…...
MySQL主从同步原理及面试回答
1. 什么是主从结构 主从复制、读写分离(分库)解决的是访问的压力 2. Mysql主从复制的原理 Mysql主从复制的核心是binlog日志文件(二进制日志文件) 二进制日志(BINLOG)记录了所有的 DDL(数据定…...
利用quartus的DDS函数信号发生器设计
一、功能要求 采用数字频率合成(Direct Digital FrequencySynthesis,简称DDS)设计制作一个波形发生器,仿真后,在DE2-115开发板上实践。 要求: 1、利用DDS技术合成正弦波和方波; 2、输出信号的…...
2.1 腾讯校招通关指南-算法与数据结构
2.1腾讯校招算法与数据结构通关攻略:高频题型真题拆解实战技巧 在腾讯技术岗面试中,算法与数据结构是占比30%的核心考核项,直接决定了面试通过率的「生死线」。本文结合腾讯近三年校招真题,拆解4大高频题型的解题套路、专项训练方…...
数据一致性的守护神:深入Spring声明式事务管理 (@Transactional)
在前面几篇文章中,我们一路打怪升级,掌握了Spring IoC/DI、Bean管理、AOP,并用JdbcTemplate和Spring Data JPA简化了数据库访问。我们的代码越来越简洁、高效。但想象一下这个场景: 用户A向用户B转账100元。这至少需要两个数据库…...
神经网络复习
1 机器学习 1.1 定义 机器学习是人工智能的一个分支领域,它致力于让计算机系统能够自动从数据中学习规律,并利用这些规律对新的数据进行预测或决策,而无需显式地编写针对特定任务的规则。 1.2 分类 全监督学习 全监督学习是指在训练模型时…...
从代码学习深度学习 - 自注意力和位置编码 PyTorch 版
这里写自定义目录标题 前言一、自注意力:Transformer 的核心1.1 多头注意力机制的实现1.2 缩放点积注意力1.3 掩码和序列处理1.4 自注意力示例二、位置编码:为序列添加位置信息2.1 位置编码的实现2.2 可视化位置编码总结前言 深度学习近年来在自然语言处理、计算机视觉等领域…...
Web前端开发——图像与多媒体文件(上)
学习目标: 优秀的商业网站往往通过为页面添加大量的图像、声音、视频、动画等多媒体信息来丰富网站的内容,吸引更多网络访问者的关注。目前大型商业网站非常注重对Web前端开发技术的研究,通过组合各类前端开发技术来改善用户体验和增加用户互…...
C#核心学习(三)常见的泛型数据结构类(1)List和Dictionary
前面我们刚刚学习了,什么是泛型。今天我们就来看看C#中有哪些,常见的泛型数据结构,今天要介绍的是List,和Dictionary。 引言 在C#编程中,泛型集合是高效管理数据的核心工具。List<T>和Dictionary<TKey, TValue>作为两…...
运行时数据区
运行时数据区 Java 虚拟机在运行 Java 程序过程中管理的内存区域称之为运行时数据区,运行时数据区负责管理 JVM 使用到的内存,例如创建对象和销毁对象。 程序计数器 程序计数器又叫 PC 寄存器,每个线程都会通过程序计数器记录当前要执行的字…...
union all 关联查询
UNION ALL 并非用于表的关联查询,而是用于将多个 SELECT 语句的结果集合并成一个结果集。它会保留所有重复的行,不像 UNION 会去除重复行。下面为你提供几种使用 UNION ALL 的场景示例。 示例表结构 假设存在两个表 sales_2024 和 sales_2025ÿ…...
npm ERR! vue-admin-beautiful@1.0.0 dev: `vue-cli-service serve` 问题解决
笔者在跑实习公司的前端时,老是报这个错,并且网上(csdn)并没有好的解决方法,于是这篇文章就诞生了。[吐槽一下]:小公司的实习生干的活是真的多啊。。。 解决方案 依赖有些包装不上,换个源就行了,这里采用…...
玩转Docker | 使用Docker部署Xnote笔记工具
玩转Docker | 使用Docker部署Xnote笔记工具 前言一、Xnote介绍Xnote简介1.2 Xnote特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Xnote服务下载镜像编辑配置文件编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Xnote服务访问Xnote首页…...
TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(二)
四、应用场景分析 (一)TDengine 适用场景 TDengine 适用于对写入性能和存储效率要求极高的物联网设备数据采集场景。在一个拥有数百万个传感器的智能工厂中,每个传感器每秒都会产生多条数据,TDengine 能够高效地处理这些高并发的…...
ARM Cortex汇编宏定义
在ARM架构(尤其是Cortex-M系列MCU)的汇编中,**宏定义(Macro)**用于复用代码片段,支持参数化编程,简化重复逻辑(如寄存器操作、循环、条件判断等)。以下是ARM汇编宏定义的核心语法、用法及示例: 一、宏定义的基本语法 使用 MACRO 和 MEND 伪指令包裹宏体,通过 参数…...
【含文档+PPT+源码】基于Python心理健康管理系统
项目视频介绍: 毕业作品心理健康管理系统 课程简介: 本课程演示的是一款基于Python心理健康管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软…...
Dockerfile项目实战-单阶段构建Vue2项目
单阶段构建镜像-Vue2项目 1 项目层级目录 以下是项目的基本目录结构: 2 Node版本 博主的Windows电脑安装了v14.18.3的node.js版本,所以直接使用本机电脑生成项目,然后拷到了 Centos 7 里面 # 查看本机node版本 node -v3 创建Vue2项目 …...
大数据驱动的供应链透明化:从数据孤岛到智能协同
大数据驱动的供应链透明化:从数据孤岛到智能协同 在全球化供应链环境下,透明化不仅是一种企业责任,更是提高效率、降低成本和增强供应链韧性的关键举措。然而,传统供应链体系因数据孤岛、信息滞后、信任缺失等问题,常常导致生产过剩、库存积压、资源浪费,甚至供应链断裂…...
第四篇:[特殊字符] 深入理解MyBatis[特殊字符] 掌握MyBatis Generator ——入门与实战
引言 什么是 MyBatis Generator? MyBatis Generator (MBG) 是一个代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写…...
LeetCode算法题(Go语言实现)_48
题目 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(核心API详解之单个外设管理)
目录 单个外设管理APIesp_periph_createesp_periph_set_functionesp_periph_startesp_periph_stopesp_periph_set_dataesp_periph_get_dataesp_periph_get_stateesp_periph_get_idesp_periph_set_idesp_periph_initesp_periph_runesp_periph_destroy 单个外设管理API esp_peri…...
基于vue2+ElementUI的el-tree封装一个带搜索的树形组件
需求 实现一个如图带搜索框的下拉树形组件。 解决方案 利用el-inputel-tree实现自定义带搜索的下拉树形组件。 具体实现步骤 1、创建TreeSelect组件 <template><div class"tree-select-wrapper" v-clickoutside"handleClose"><el-inpu…...
G2学习打卡
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 DCGAN实践 import torch, random, random, os import torch.nn as nn import torch.nn.parallel import torch.optim as optim import torch.utils.data im…...
【广州华锐互动】汽车生产引入数字孪生系统,优化生产流程,提升汽车产品质量
数字孪生系统的应用为企业带来了生产流程的革命性变革。以汽车制造企业为例,该企业在生产过程中引入数字孪生系统,实现了生产流程的全面优化和产品质量的显著提升 。 在生产流程优化方面,数字孪生系统对汽车生产线进行了全方位的模拟和实时…...
从Gradio App创建Discord Bot/Slack Bot/Website Widget(2)——从Gradio App创建Slack Bot
从Gradio App创建Discord Bot/Slack Bot/Website Widget(2)——从Gradio App创建Slack Bot 本篇摘要18. 从Gradio App创建Discord Bot/Slack Bot/Website Widget18.2 从Gradio App创建Slack Bot18.2.1 运作原理及前置条件1. 运作原理2. 前置条件 18.2.2 …...
基于STM32G474的SPI获取MT6816编码器绝对角度配置指南
前言:最近上手使用了一款编码器芯片,也是先艰难阅读了一下全英文版本的编码器的规格手册,然后通过SPI读取了一下绝对值角度。虽然发现使用起来还是挺简单的,但使用后还是会产生一个对其原理层面的好奇,比如磁编码器内部…...
深入学习ReentrantLock
ReentrantLock 0. 前言:为什么需要 ReentrantLock?1. 基础概念与核心特性1.1 什么是 ReentrantLock?1.2 ReentrantLock vs. synchronized1.3 核心特性详解1.3.1 可重入性 (Reentrancy)1.3.2 公平性选择 (Fairness Choice)1.3.3 可中断获取锁 …...