14【模块学习】74HC595:使用学习

74HC595

  • 1、74HC595简介
  • 2、代码演示
    • 2.1、驱动8位流水灯
  • 3、74HC595级联
    • 3.1、驱动16位流水灯
    • 3.2、驱动8位数码管
    • 3.3、驱动8x8点阵屏幕
    • 3.4、8x8点阵屏幕滚动显示

1、74HC595简介

在51单片机中IO引脚资源十分的紧缺,所以常常需要使用75HC595芯片进行驱动那些需要占用多个IO引脚的芯片。那么75HC595是是什么喃?

74H595是一款串转并移位控制的芯片,通过移位的方式将串行输入的数据变为并行输出的数据

在这里插入图片描述

引脚功能
VCC供电正极(2v~6v)
GND供电负极
DS串行数据输入引脚(8位)
Q7~Q0并行数据输出引脚(Q7对应数据高位)
SHCP移位寄存器时钟输入
STCP输出寄存器时钟输入
Q7S8位数据串行输出引脚(常用于级联)
OE输出使能引脚

在这里插入图片描述

2、代码演示

在这里插入图片描述

2.1、驱动8位流水灯

①H595.c文件的代码如下:

#include "H595.h"/*** 使用74HC595串行数据转换位并行数据* Byte:输入的串行数据*/
void HC595_Driver(unsigned char Byte)
{unsigned char i = 0;HC595_ST = 0;for(i = 0; i < 8; i++){HC595_SH = 0;					//SH低电平,将数据写入到输入数据引脚上HC595_DS = (Byte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	HC595_ST = 1;		//595的ST引脚来一个上升沿将移位寄存器的数据移到存储寄存器HC595_OE = 0;		//输出使能
}

②H595.h文件的代码如下:

#ifndef __H595_H
#define __H595_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址sbit HC595_SH = P1^2;	//移位时钟引脚
sbit HC595_DS = P1^3;	//HC595输入数据口
sbit HC595_ST = P1^4;	//存储时钟引脚
sbit HC595_OE = P1^5;	//输出使能引脚void HC595_Driver(unsigned char Byte);#endif

③main.c文件的代码如下:

#include "H595.h"
#include "Delay.h"
#include "Timer.h"void main(void)
{Time0_Intrrupt_Init();while(1){unsigned char temp = 0x01;unsigned char i;for(i = 1; i < 8; i++)	//循环7次{HC595_Driver(temp);temp <<= 1;			//循环结束num = 1000 0000Delay_ms(500);		//延时500ms}for(i = 1; i < 8; i++)	//循环7次{HC595_Driver(temp);temp >>= 1;			//循环结束num = 0000 0001Delay_ms(500);		//延时500ms}}
}

3、74HC595级联

综上:74HC595的Q7S引脚是串行输出引脚,常常用于多片的75HC595芯片的级联。2片级联,则可看成一个2字节数据串转并移位寄存器,4片级联,则可看成4字节数据串转并移位寄存器

在这里插入图片描述
如图:2片74HC595进行级联,他们的SH引脚,ST引脚,OE引脚都连接在一起,第一片H595芯片的Q7S连接着第二片芯片的数据输入引脚。

3.1、驱动16位流水灯

在这里插入图片描述
①H595.c文件的代码如下:

/*** 2片74HC595的级联* HByte:高位字节的数据* LByte:低位字节的数据*/
void HC595_Cascade(unsigned char HByte, unsigned char LByte)
{	unsigned char i = 0;HC595_ST = 0;/* 将高位字节的数据移位到第一个595里面 */for(i = 0; i < 8; i++){HC595_SH = 0;HC595_DS = (HByte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	/* 将高位字节的数据移位到第二个595里面,低位字节的数据移到第一个595里面 */for(i = 0; i < 8; i++){HC595_SH = 0;HC595_DS = (LByte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	HC595_ST = 1;		//595的ST引脚来一个上升沿将移位寄存器的数据移到存储寄存器HC595_OE = 0;		//输出使能
}

②H595.h文件的代码如下:

#ifndef __H595_H
#define __H595_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址sbit HC595_SH = P1^2;	//移位时钟引脚
sbit HC595_DS = P1^3;	//HC595输入数据口
sbit HC595_ST = P1^4;	//存储时钟引脚
sbit HC595_OE = P1^5;	//输出使能引脚void HC595_Cascade(unsigned char HByte, unsigned char LByte);;#endif

③main.c文件的代码如下:

#include "H595.h"
#include "Delay.h"
#include "Timer.h"void main(void)
{Time0_Intrrupt_Init();while(1){unsigned char Htemp = 0x01;unsigned char Ltemp = 0x01;unsigned char i;for(i = 1; i < 8; i++)		//循环7次{HC595_Cascade(0x00, Ltemp);Ltemp <<= 1;			//S循环结束num = 1000 0000Delay_ms(500);			//延时500ms}HC595_Cascade(0x00, Ltemp);Delay_ms(500);				//延时500msfor(i = 1; i < 8; i++)		//循环7次{HC595_Cascade(Htemp, 0x00);Htemp <<= 1;			//S循环结束num = 1000 0000Delay_ms(500);			//延时500ms}		for(i = 1; i < 8; i++)		//循环7次{HC595_Cascade(Htemp, 0x00);Htemp >>= 1;			//循环结束num = 0000 0001Delay_ms(500);			//延时500ms}HC595_Cascade(Htemp, 0x00);Delay_ms(500);				//延时500msfor(i = 1; i < 8; i++)		//循环7次{HC595_Cascade(0x00, Ltemp);Ltemp >>= 1;			//循环结束num = 0000 0001Delay_ms(500);			//延时500ms}}
}

3.2、驱动8位数码管

在这里插入图片描述

①H595_SEG8.c文件的代码如下:

/***********************************/
/*    8位数码管的底层驱动文件      */
/***********************************/#include "H595_Seg8.h"/*** 2片74HC595的级联* PossData:位选数据* SegData:段码数字据*/
void HC595_Cascade_Seg8(unsigned char PossData, unsigned char SegData)
{	unsigned char i = 0;SEG_ST = 0;/* 将高位字节的数据移位到第一个595里面 */for(i = 0; i < 8; i++){SEG_SH = 0;SEG_DS = (PossData & (0x80 >> i));//高位先行SEG_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	/* 将高位字节的数据移位到第二个595里面,低位字节的数据移到第一个595里面 */for(i = 0; i < 8; i++){SEG_SH = 0;SEG_DS = (SegData & (0x80 >> i));//高位先行SEG_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	SEG_ST = 1;		//595的ST引脚来一个上升沿将移位寄存器的数据移到存储寄存器SEG_OE = 0;		//输出使能
}/* 字符数据 */
static unsigned char code Data8[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //共阳极显示的数值0 ~ 90xBF,0x7F,0x8C									   //-,.P
};/* 显示的数值缓存区 */
unsigned char SegNum8[] = {0,0,0,0,0,0,0,0};/*** 选择哪个数码管显示数据的函数* Position:哪一个数码管* Data:需要显示的数据*/
void Seg8_Choice(unsigned char Position, unsigned char DisplayData)
{HC595_Cascade_Seg8(0x00,0x00);												//让8个数码管先熄灭HC595_Cascade_Seg8((0x01 << (Position - 1)), Data8[SegNum8[DisplayData]]);	//传入段码数据进行显示
}

②H595_SEG8.h文件的代码如下:

#ifndef __H595_Seg8_H
#define __H595_Seg8_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址sbit SEG_SH = P0^0;	//移位时钟引脚
sbit SEG_DS = P0^1;	//HC595输入数据口
sbit SEG_ST = P0^2;	//存储时钟引脚
sbit SEG_OE = P0^3;	//输出使能引脚extern unsigned char SegNum8[];void HC595_Cascade_Seg8(unsigned char PossData, unsigned char SegData);
void Seg8_Choice(unsigned char Position, unsigned char DisplayData);#endif

③User_SEG8.c文件的代码如下:

/********************************************/
/*    使用74HC595驱动8位数码管的应用层       */
/********************************************/
#include "User_Seg8.h"void Delay1ms()		//@11.0592MHz
{unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);
}/*** X的Y次方函数*/
unsigned int SEG8_Pow(unsigned char X,unsigned char Y)
{unsigned int Result = 1;while(Y--){Result *= X;}return Result;
}/*** 数码管显示正整数* Number:0~65535* Length:有效数值长度* Lie:   显示的位置1~8*/
void SEG8_Show_Num(unsigned char Lie,unsigned short Number,unsigned char Length)
{/* 将整数进行拆分在通过数码管显示 */unsigned char i,Data;for(i = 0; i < Length; i++){Data = (Number / SEG8_Pow(10,Length - i -1)) % 10;//将整数进行拆分SegNum8[0] = Data;Seg8_Choice(i+Lie,0);//显示Delay1ms();}
}/*** 数码管显示有符号整数* Number:-32768~32767* Length:有效数值长度* Lie:   显示的位置1~8*/
void SEG8_Show_SignedNum(unsigned char Lie, short Number,unsigned char Length)
{/* 若为负数,先显示负号 */if(Number < 0){Number = -Number;SegNum8[0] = 10;Seg8_Choice(Lie,0);		//显示"-"Lie++;}SEG8_Show_Num(Lie, Number, Length);
}/*** 数码管显示有符号小数* Number:小数数值* Floatcount:显示几位小数* Lie:   显示的位置1~8* IntCount:  整数的个数* Floatcount:小数的个数*/
void SEG8_Show_FloatNum(unsigned char Lie, float Number, unsigned char IntCount, unsigned char Floatcount)
{short Num = 0;	if(Number < 0){Number = -Number;	//将负数转换为正数,例如:3.14 = -(-3.14)SegNum8[0] = 10;Seg8_Choice(Lie,0);	//显示"-"Lie++;}/* 先提取整数部分 */Num = Number;			//此时Num保存的是小数的整数部分,例如:Number = 3.14,Num = 3SEG8_Show_Num(Lie,Num,IntCount);/* 将小数换算为整数 */Number -= Num;					//Number = Number - Num,Number = 3.14 - 3 = 0.14Num = (short)(Number * SEG8_Pow(10,Floatcount));//将小数将小数换算为整数,0.14 * 100 = 14SegNum8[0] = 11;				//先添加数据的索引Seg8_Choice(Lie+IntCount-1,0);	//显示小数点/* 显示小数部分 */SEG8_Show_Num(Lie+IntCount, Num, Floatcount);
}

④User_SEG8.h文件的代码如下:

#ifndef __User_Seg8_H
#define __User_Seg8_H
#include "H595_Seg8.h"unsigned int SEG8_Pow(unsigned char X,unsigned char Y);
void SEG8_Show_Num(unsigned char Lie,unsigned short Number,unsigned char Length);
void SEG8_Show_SignedNum(unsigned char Lie, short Number,unsigned char Length);
void SEG8_Show_FloatNum(unsigned char Lie, float Number, unsigned char IntCount, unsigned char Floatcount);#endif

⑤main.c文件的代码如下:

#include "User_Seg8.h"void main(void)
{		while(1){SEG8_Show_FloatNum(1,-200.123,3,3);}
}

在这里插入图片描述

3.3、驱动8x8点阵屏幕

在这里插入图片描述

如图:点亮图上的小亮点,则阴极引脚输出的数据为:1011 1111(0xBF)选中第2列;阳引脚输出的数据为:1000 0000(0x80)表示点亮选中的列的最上的LED

LED显示字符的方法:
例如想要显示如下图是字符:

在这里插入图片描述

列扫描:从左到右依次从第一列进行扫描,即(共阴极的引脚数据依次为:0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE)。而共阳极字模数据Data[8] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};当进行第一列扫描时,共阳极引脚输出Data[0]

在这里插入图片描述

①Dot_LED.c文件的代码如下:

#include "Dot_LED.h"/*** 2片74HC595的级联* LEDNode:	阳极数据,选择选定的列中哪几个LED点亮* LEDCathode: 阴极数据,选择哪一列点亮*/
void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode)
{	unsigned char i = 0;LED_ST = 0;/* 将高位字节的数据移位到第一个595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDNode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	/* 将高位字节的数据移位到第二个595里面,低位字节的数据移到第一个595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDCathode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	LED_ST = 1;		//595的ST引脚来一个上升沿将移位寄存器的数据移到存储寄存器LED_OE = 0;		//输出使能
}/*** 8x8点阵显示函数(列扫描显示)*/
void Show_8X8Dot_ColumnScan(unsigned char *Data)
{unsigned char i = 0;for(i = 0; i < 8; i++){HC595_Cascade_8x8LED(Data[i],~(0x80 >> i));	//依次选择从左到右第1列行开始(行扫描显示)}
}

②Dot_LED.h文件的代码如下:

#ifndef __Dot_LED_H
#define __Dot_LED_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址sbit LED_SH = P2^0;
sbit LED_DS = P2^1;	
sbit LED_ST = P2^2;
sbit LED_OE = P2^3;void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode);
void Show_8X8Dot_ColumnScan(unsigned char *Data);#endif

③main.c文件的代码如下:

#include "Dot_LED.h"/* 显示H */
static unsigned char H_Data[] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};//纵向,上为最高位(纵向取模)
void main(void)
{		while(1){Show_8X8Dot_ColumnScan(H_Data);	//列扫描显示}
}

在这里插入图片描述

3.4、8x8点阵屏幕滚动显示

从左向右滚动显示“HELLO”

滚动显示的原理: 点阵屏幕一直显示8个字节Buffer中的数据,我们只需要将HELLO的字模数据依次放入到Buffer中。如下图所示:
在这里插入图片描述
取模软件的使用:

在这里插入图片描述

①Dot_LED.c文件的代码如下:

#include "Dot_LED.h"
#include "Timer.h"/*** 2片74HC595的级联* LEDNode:	阳极数据,选择选定的列中哪几个LED点亮* LEDCathode: 阴极数据,选择哪一列点亮*/
void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode)
{	unsigned char i = 0;LED_ST = 0;/* 将高位字节的数据移位到第一个595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDNode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	/* 将高位字节的数据移位到第二个595里面,低位字节的数据移到第一个595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDCathode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引脚来一个上升沿将数据进行移位}	LED_ST = 1;		//595的ST引脚来一个上升沿将移位寄存器的数据移到存储寄存器LED_OE = 0;		//输出使能
}/*** 8x8点阵显示函数(列扫描显示)*/
void Show_8X8Dot_ColumnScan(unsigned char *Data)
{unsigned char i = 0;for(i = 0; i < 8; i++){HC595_Cascade_8x8LED(0x00,~(0x80 >> i));	//向将扫描的一列的灯全部熄灭HC595_Cascade_8x8LED(Data[i],~(0x80 >> i));	//依次选择从左到右第1列行开始(行扫描显示)}
}/*** 8x8点阵数据滚动函数*/
unsigned char LEDBuffer[8] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};
void LEDData_Move(unsigned char *Data,unsigned char Len)
{static unsigned char j = 0;static unsigned char i = 0;static unsigned char Status = 1;static unsigned char TimeStatus = 1;static unsigned long GET_Time = 0;switch(TimeStatus){case 1:GET_Time = Get_TimeCount();				//获取TimeCount的值TimeStatus = 2;case 2:if(Get_TimeCount() - GET_Time > 500)	//每隔500ms进行向Buff里面放入数据{GET_Time = Get_TimeCount();for (j = 0; j < 7; j++) 			//先移动{LEDBuffer[j] = LEDBuffer[j+1];}switch(Status){case 1:LEDBuffer[7] = Data[i+8];	//第一轮放入从Data[8]开始取出放入if(i == Len - 8)			{i = Len - 1;Status = 2;}break;case 2:							//第二轮放入从Data[0]开始取出放入LEDBuffer[7] = Data[i];	break;}i = (i + 1) % Len;  				//循环遍历 i:0~31}break;}
}

②Dot_LED.h文件的代码如下:

#ifndef __Dot_LED_H
#define __Dot_LED_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址sbit LED_SH = P2^0;
sbit LED_DS = P2^1;	
sbit LED_ST = P2^2;
sbit LED_OE = P2^3;extern unsigned char LEDBuffer[8];void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode);
void Show_8X8Dot_ColumnScan(unsigned char *Data);
void LEDData_Move(unsigned char *Data,unsigned char Len);#endif

③main.c文件的代码如下:

#include "Dot_LED.h"
#include "Timer.h"/* 显示HELLO */
static unsigned char HELLO_Data[] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00,0xFF,0x89,0x89,0x89,0x00,0x00,0xFF,0x01,0x01,0x01,0x00,0x00,0xFF,0x01,0x01,0x01,0x00,0x00,0x7E,0x81,0x81,0x7E,0x00,0x00	 
};//纵向,上为最高位(纵向取模)void main(void)
{		Time0_Intrrupt_Init();	//启动定时器中断while(1){LEDData_Move(HELLO_Data,32);Show_8X8Dot_ColumnScan(LEDBuffer);	//列扫描显示}
}

QQ2025427-13511

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

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

相关文章

JAVA后端开发常用的LINUX命令总结

一、Linux常用命令大全&#xff08;2025年最新版&#xff09; 常用 Linux 命令 文件和目录管理&#xff1a; cd&#xff1a;用于切换当前工作目录&#xff0c;如cd /home/user。mkdir&#xff1a;创建新目录&#xff0c;mkdir -p /home/user/mydir可递归创建多级目录。pwd&am…

uniapp-商城-40-shop 购物车 选好了 进行订单确认4 配送方式3 地址编辑

前面说了配送 和地址页面 当地址页面为空或需要添加地址时&#xff0c;需要添加地址。 我的地址页面有个按钮 就是添加地址 点击 添加地址 按钮 后&#xff0c;就会跳转到地址添加的页面 1、添加地址页面 2、添加地址文件夹以及文件的创建 3、添加地址的代码 <template…

现场问题排查-postgresql某表索引损坏导致指定数据无法更新影响卷宗材料上传

问题现象 今天突然被拉进一个群&#xff0c;说某地区友商推送编目结果报错&#xff0c;在我们自己的卷宗系统上传材料也一直转圈&#xff0c;也删除不了案件卷宗&#xff0c;重置模板也没用&#xff0c;只有个别案件有问题。虽然这事儿不属于我负责&#xff0c;但还是抽时间给…

Redis01-基础-入门

零、文章目录 Redis01-基础-入门 1、认识 NoSQL NoSQL 知识请参考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/132612444 2、认识 Redis &#xff08;1&#xff09;简介 Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务&…

【嘉立创EDA】如何在更新或转换原理图到PCB时,保留已有布局器件

文章路标👉 :one: 文章解决问题:two: 主题内容:three: 参考方法be end..1️⃣ 文章解决问题 操作环境:嘉立创EDA专业版 V2.2.37 本文使用嘉立创EDA,描述在更新或转换原理图到PCB时,保留已有布局器件的方法。本文将此过程记录,以供有需要的读者参考。 2️⃣ 主题内容 …

03 APQC PROCESS CLASSIFICATION FRAMEWORK (PCF)

APQC流程分类框架&#xff08;APQC Process Classification Framework, PCF&#xff09;最初由美国生产力与质量中心&#xff08;American Productivity & Quality Center, APQC&#xff09;开发&#xff0c;旨在用于跨组织的流程性能基准比较。现在&#xff0c;它也常被用…

分析型数据库入门指南:如何选择适合你的实时分析工具?

一、什么是分析型数据库&#xff1f;为什么需要它&#xff1f; 据Gartner最新报告显示&#xff0c;超过75%的企业现已在关键业务部门部署了专门的分析型数据库&#xff0c;这一比例还在持续增长。 随着数据量呈指数级增长&#xff0c;传统数据库已无法满足复杂分析场景的需求…

body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数

在 NestJS 中&#xff0c;Body()、Param() 和 Query() 用于处理不同类型的请求参数。以下是它们的含义及前端传递方式&#xff1a; Body()&#xff1a;请求体参数 • 含义&#xff1a;用于获取请求体中的数据&#xff08;如 POST/PUT 请求中提交的 JSON、表单数据等&#xff09…

神经网络(自己记录)

一、神经网络基础 5分钟-通俗易懂 - 神经网络 反向传播算法&#xff08;手算&#xff09;_哔哩哔哩_bilibili 二、GAT

Redis Slot 槽位分片具体案例

‌键值槽位分配案例‌ 当执行 SET {kaigejava}k1 v1 时&#xff0c;Redis 会提取 {} 内的有效部分 kaigejava&#xff0c;通过 CRC16 算法计算哈希值&#xff0c;再对 16384 取余得到槽位。例如&#xff1a; 若计算结果为 1495&#xff0c;则该键会被分配到槽位 1495 对应的节…

【多模态模型】跨模态智能的核心技术与应用实践

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;CLIP图像-文本检索&#xff09;运行结果验证 三、性能对比测试方法论量化数据对比结果…

final static 中是什么final static联合使用呢

final static 联合使用详解 final 和 static 在 Java 中经常一起使用&#xff0c;主要用来定义类级别的常量。这种组合具有两者的特性&#xff1a; 基本用法 public class Constants {// 典型的 final static 常量定义public static final double PI 3.141592653589793;pub…

1.1 道路结构特征

1.1 道路结构特征 1.城市道路分类 道路网的地位、交通功能、沿线的服务功能。快速路 15 30主干路 15 30次干路 15 20支路 10 20 10(20)沥青路面、水泥混凝土路面、砌块路面沥青路面:沥青混凝土、沥青贯入式、沥青表面处治。沥青混凝土各种等级、沥青贯入式和沥青表面处治支路…

C++如何使用调试器(如GDB、LLDB)进行程序调试保姆级教程(2万字长文)

C++作为一门高性能、接近底层的编程语言,其复杂性和灵活性为开发者提供了强大的能力,同时也带来了更高的调试难度。与一些高级语言不同,C++程序往往直接操作内存,涉及指针、引用、多线程等特性,这些都可能成为错误的温床。例如,一个未初始化的指针可能导致程序崩溃,而一…

vite+vue构建的网站项目localhost:5173打不开

原因&#xff1a;关掉了cmd命令提示符&#xff0c;那个端口就没有被配置上&#xff0c;打开就是这样的。 解决方法&#xff1a;重新在工作目录下打开cmd&#xff0c;输入npm run dev重新启动项目。 重新出现这样的界面说明已经成功启动项目&#xff0c;再次在浏览器中刷新并输入…

自主可控鸿道Intewell工业实时操作系统

鸿道Intewell工业实时操作系统是东土科技旗下科东软件自主研发的新一代智能工业操作系统&#xff0c;以下是相关介绍&#xff1a; 系统架构 -Intewell-C全实时构型&#xff1a;设备上只运行自研RTOS的全实时系统&#xff0c;适用于有功能安全认证需求的实时控制场景&#xf…

将大语言模型(LLM)应用于自动驾驶(ADAS)中的几个方向,及相关论文示例

主要方法集中在如何利用LLM的强大推理能力和语言理解能力来增强自动驾驶系统的感知、决策和规划能力。以下是几种典型的方法和思路&#xff1a; 1. 基于LLM的驾驶决策与规划 方法&#xff1a;将LLM作为驾驶决策的核心模块&#xff0c;利用其强大的推理能力生成驾驶行为或轨迹…

rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态

一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码&#xff0c;我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…

【Redis】zset类型

目录 1、介绍2、底层实现【1】压缩列表【2】跳跃表哈希表 3、常用命令 1、介绍 有序集合结合了集合和有序列表的特性&#xff0c;每个元素都会关联一个分数&#xff0c;Redis正是通过这个分数来为集合中的成员进行排序。 2、底层实现 【1】压缩列表 适用条件 1、元素数量 ≤…

ZeroGrasp:零样本形状重建助力机器人抓取

25年4月来自CMU、TRI 和 丰田子公司 Woven 的论文“ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping”。 机器人抓取是具身系统的核心能力。许多方法直接基于部分信息输出抓取结果&#xff0c;而没有对场景的几何形状进行建模&#xff0c;导致运动效果不…