C51单片机学习笔记——秒表

2023-05-16

前言

不知不觉我又被自己的惰性拖住了小一个月,今天在宿舍窗边吸烟时候,看着楼下人来人往的道路不由自主的感到一丝惭愧,手里的小视频也被我刷出来一条鸡汤,在这儿我要写下来记录给将来又在颓废的我:

  • 这个世界最恐怖的不是有人比你优秀,而是那些比你优秀的人比你还努力!!!

OK,食归大肠,水入膀胱,咱们言归正传。今儿做的是时钟升级版实验——秒表。

任务介绍

同样利用上次的时钟原理图,改写成为可记录多人的秒表。( ヾ(TДT;))))…!脑子里不知不觉想到在部队生活时的夺命追魂表。。。)
要求:

  • 显示格式为X-XX-X,例如1-56-7表示1分56.7秒(或1点56分7钞),即以1/10秒的速度运行
  • 使用两个按键 K1、K2 实现 开始/结束记录/查询 的功能

实验目的

  • 1、掌握数码管动态扫描显示的原理及过程。
  • 2、掌握单片机定时/计数中断程序的设计方法。
  • 3、掌握单片机定时计数器去按键抖动的原理及编程方法。

程序构想

为了提升自己的能力,从本次开始程序构想统统以流程图来呈现。(画的不好还请高人多多指教,上图),别问我为啥不用 ProcessOn 、Mindmanage 来画,因为我没钱🤐
流程图
K1按键对应P3.2 , K2按键对应P3.3 ,(表达不好截图来搞,整体如下图所示)
整体效果

码代码开始

先把框架码起来,根据流程图可以看出主要需要以下几个动作:

void init(void)/*初始化程序*/
void SaveTime(u8 nsave)	  /*储存当前时间  */
void Output(u8 x)/*显示第x个成员的时间成绩*/
void main()//主函数(必不可少)
void K1() interrupt 0	//INT0外部中断  K1 开始/结束/清零 计时
void K2() interrupt 2	//INT1外部中断  K2  记录时间/切换显示内容
void TimePulse() interrupt 1  //T0定时器 产生时间脉冲
void LedShow() interrupt 3	 //T1定时器 动态显示 按键中断  4ms进入一次

框架打好,慢慢填写内容:

  1. 产生一个1/10秒的信号驱动:
    这里我用T0定时器的方式二产生,因为是自动TL0是被TH0自动重置的,所以可以提高一定的精准度。这里用的单片机晶振频率为12MHz,通过公式 机械周期 = 12 / 12M = 1us ,为了达到100ms的周期需要两个循环(因为定时器方式二最大计数值为256),具体如下:
void TimePulse() interrupt 1  //T0定时器 产生时间脉冲
{
	static u8 i=0,ii=0;
	i++;  //每0.2ms进入一次中断  500次为0.1s
	if(i>=50)
	{
		i=0;
		ii++;
		if(ii==10)
		{
			(*ss)++;	//ss加1	   *ss为显示的最后一位
			ii=0;
			i=0;
		}
	}
}
  1. 动态显示
    这个没什么好说的大家都会就不啰嗦了,利用定时器T1动态扫描显示,同时解决按键防抖动
void LedShow() interrupt 3	 //T1定时器 动态显示 按键中断  4ms进入一次
{
	static u8 w=0;
	P2 = 0;
	TH1 =  TScan/256;		 //
	TL1 =  TScan%256;
	
	/* 将时间赋值给 数组led_show[] */
	if(*ss>=10)
	{
		*ss=0;
		(*sl)++;
	}else{}
	if(*sl>=10)
	{
		*sl=0;
		(*sh)++;
	}else{}

	if(*sh>=6)
	{
		*sh=0;
		(*m)++;		
	}else{}
	if(*m>=10)
	{
		TR0=0;	 //计时到9分59秒自动停止计时
		*ss=9;
		*sl=9;
		*sh=5;
		*m=9;			
	}else{}
	
	/* 显示led_show[] */
	P1 = led_scan[w];
	P2 = led_cc[ led_show[w] ];		//  
	w++;
	if(w==8)
	{
		w=0;
	}else{}

		
	/* 防抖70*4ms = 280ms */
	if(as>0)
	{
		as++;
		if(as==71)
		{
			as=0;
			IE0=0;	//清空外部中断0中断源
			EX0=1;  //打开外部中断0
			IE1=0;	//清空外部中断1中断源
			EX1=1;  //打开外部中断1
		}else{}
	}else{}
}
  1. K1 、K2分别对应外部中断0 、 外部中断1
    根据流程图描写构建对应的功能,K1负责 开始/结束 K2负责 记录/切换。这里我主要通过对TR0状态的判断决定按下按键后进行的动作,我们结合来看:
void K1() interrupt 0	//INT0外部中断  K1 开始/结束/清零 计时
{
	as=1;  //标记进入防抖
	EX0 = 0;
	k1f++; //k1f:K1状态标识    0初始化准备开始    1计时状态    2停止计时状态
	if(k1f==1) //计时开始
	{
		TR0 = 1;
	}
	if(k1f==2) //全部结束计时
	{
		TR0 = 0;
		SaveTime((*num));  //记录当前显示的时间
		Output((*num));	   //输出当前显示的时间
	}
	if(k1f>=3) //清零 重新加载
	{
		k1f=0;
		init();
	}
}

void K2() interrupt 2	//INT1外部中断  K2  记录时间/切换显示内容
{
	as=1;  //标记进入防抖
	EX1 = 0;
	if(TR0 == 1)  //计时状态K2动作
	{
		SaveTime((*num));
		(*num)++;
	}
	if((*num)>=10)	  //9人记录全部完成,停止并显示
	{
		TR0 = 0;
		k1f = 2;
		(*num)=(*num)-1;
		Output((*num));
		return ;   // 这个return退出很重要
	}
	if(TR0==0&&k1f!=0)	//停止计时状态下查询各成员的用时成绩
	{
		(*num)=(*num)+1;  //向下切换成员序号  最多9个成员
		if((*num)>=10)
		{
			(*num)=1;	
		}
		Output((*num));  // 显示第(*num)个成绩
	}
}

4. 存储当前时间,显示以储存的时间
原本憨憨的我是用了一个9*8的二维数组,来强行储存存显示内容,就像这样

u8 player[9][8]; //定义9人成员成绩 二维数组 用于存储9个人的成绩

结果编译器狠狠的Duang了一声,成这样了“*** ERROR L107: ADDRESS SPACE OVERFLOW”,有道老师告诉我这是地址空间溢出了。后来,我想过用xdata来修饰一下,但是我发现这个片外RAM访问需要间接寻址,通过翻书看资料智商欠费的我在桌子前徘徊了三趟,终究还是没有掌握这个知识点(给我点儿时间等我搞懂了就回来专门写一篇)。可是问题它不管你会还是不会,它始终就在那不离不弃。于是只能另辟蹊径,别说还真让我想到了PlanB。挠掉三根头发后滚轮让我看见定时器T1的赋初值的方法,于是“储存”和“显示”这两个函数就成了这样:

void SaveTime(u8 nsave)	  /*储存当前时间  */
{
	static u8 n;
	n = nsave-1;
	if(n<9)
	{
		player[n][0] = nsave;	//成员序号
		player[n][1] = (*m)*10+(*ss);	//储存 分钟 和 100ms  对应的数值
		player[n][2] = (*sh)*10+(*sl);	//储存 秒 对应的两个数值
	}
}
void Output(u8 x)/*显示第x个成员的时间成绩*/
{
	static u8 n;
	n = x-1;
	if(n<9&&player[n][0]!=0)
	{
		*num = player[n][0];		//读取 成员序号
		*m   = player[n][1]/10;		//读取 分钟值
		*ss  = player[n][1]%10;		//读取 100ms值
		*sh  = player[n][2]/10;		//读取 秒高位
		*sl  = player[n][2]%10;		//读取 秒低位
	}else  //如果当前没有存入成绩,显示第1名成绩
	{
		*num = player[0][0];
		*m   = player[0][1]/10;
		*ss  = player[0][1]%10;
		*sh  = player[0][2]/10;
		*sl  = player[0][2]%10;	
	}
}  
/* 等会结合最后的完整程序,你应该就能看懂我这蹩脚的编程流程了 */

5. 最后根据上述的思路流程对单片机进行初始化就可以了
下面是程序的全部面貌,为了让各位看官能方便使用,源码也会上传,portues工程文件和上次时钟的一样,等会儿网络通畅了我全部给上传,有需要的同学请进入我的 “主页” >> “资源” ,进行下载。

C程序: test5_StopWatch.c
protues工程: timer.pdsprj

最后,再次感谢您的浏览。

#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
#define TScan (65536-4000)//(65536-4000)   动态扫描4ms移位一次

//共阴数码管  0     1     2     3      4    5     6     7     8     9     -    _   “空”
u8 led_cc[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40,0x08,0x00};
//数码管从左往右,第1	 2    3    4    5    6    7    8个
u8 led_scan[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//数码管初始显示内容:1_0-00-0
u8 led_show[]={1,11,0,10,0,0,10,0};	
//(个人喜好)方便清楚识别和操作
u8 *m=&led_show[2];	  //分
u8 *sh=&led_show[4];  //秒高位
u8 *sl=&led_show[5];  //秒低位
u8 *ss=&led_show[7];  //(*ss)* 100毫秒
u8 *num=&led_show[0]; //成员序号

u8 player[9][3]; //定义9人成员成绩 二维数组 用于存储9个人的成绩
u8 as=0; //防抖标识
u8 itemp,jtemp;	//用作循环语句的中间变量
u8 k1f;	//K1键标识
void init(void)/*初始化程序*/	  
{
	EA = 1;	//打开中断总开关
	IE0 = 0;//清除外部中断0 中断源
	EX0 = 1;//打开外部中断0
	IT0 = 1;//下降沿触发
	IE1 = 0;//清除外部中断1 中断源
	EX1 = 1;//打开外部中断1
	IT1 = 1;//下降沿触发

	TMOD = 0x12;//定时器1 方式1工作 ;定时器0 方式2工作
	ET0 = 1;//打开定时器0中断
	TR0 = 0;//关闭定时器0
	TH0 = (256-200);   //200*1us=0.2ms     机械周期:12/f = 1us
	TL0 = (256-200);
	ET1 = 1;//打开定时器1中断
	TR1 = 1;//启动定时器1
	TH1 =  TScan/256;
	TL1 =  TScan%256;

	/*初始成员数组*/
	led_show[0]=1;
	led_show[2]=0;
	led_show[4]=0;
	led_show[5]=0;
	led_show[7]=0;
	for(itemp=0;itemp<9;itemp++)
	{
		for(jtemp=0;jtemp<2;jtemp++)
		{
			player[itemp][jtemp]=0;
		}
	}
	player[0][0]=1;
	/*完成初始成员数组*/
	k1f = 0; //K1状态 标志符
	
}

void SaveTime(u8 nsave)	  /*储存当前时间  */
{
	static u8 n;
	n = nsave-1;
	if(n<9)
	{
		player[n][0] = nsave;
		player[n][1] = (*m)*10+(*ss);
		player[n][2] = (*sh)*10+(*sl);
	}
}

void Output(u8 x)/*显示第x个成员的时间成绩*/
{
	static u8 n;
	n = x-1;
	if(n<9&&player[n][0]!=0)
	{
		*num = player[n][0];
		*m   = player[n][1]/10;
		*ss  = player[n][1]%10;
		*sh  = player[n][2]/10;
		*sl  = player[n][2]%10;
	}else  //如果当前没有存入成绩,显示第1名成绩
	{
		*num = player[0][0];
		*m   = player[0][1]/10;
		*ss  = player[0][1]%10;
		*sh  = player[0][2]/10;
		*sl  = player[0][2]%10;	
	}
}

void main()//主函数(必不可少)
{
	init();
	while(1);
}

void K1() interrupt 0	//INT0外部中断  K1 开始/结束/清零 计时
{

	as=1;  //标记进入防抖
	EX0 = 0;
	k1f++;
	if(k1f==1) //计时开始
	{
		TR0 = 1;
	}
	if(k1f==2) //全部结束计时
	{
		TR0 = 0;
		SaveTime((*num));
		Output((*num));	
	}
	if(k1f>=3) //清零 重新加载
	{
		k1f=0;
		init();
	}
}

void K2() interrupt 2	//INT1外部中断  K2  记录时间/切换显示内容
{
	as=1;  //标记进入防抖
	EX1 = 0;
	if(TR0 == 1)
	{
		SaveTime((*num));
		(*num)++;
	}
	if((*num)>=10)	  //
	{

		TR0 = 0;
		k1f = 2;
		(*num)=(*num)-1;
		Output((*num));
		return ;   // 这个return退出很重要
	}
	if(TR0==0&&k1f!=0)
	{
		(*num)=(*num)+1;  //向下切换成员序号  最多9个成员
		if((*num)>=10)
		{
			(*num)=1;	
		}
		Output((*num));  // 显示第(*num)个成绩
	}
}

void TimePulse() interrupt 1  //T0定时器 产生时间脉冲
{
	static u8 i=0,ii=0;
	i++;  //每0.2ms进入一次中断  500次为0.1s
	if(i>=50)
	{
		i=0;
		ii++;
		if(ii==10)
		{
			(*ss)++;	//ss加1	   *ss为显示的最后一位
			ii=0;
			i=0;
		}
	}
}

void LedShow() interrupt 3	 //T1定时器 动态显示 按键中断  4ms进入一次
{
	static u8 w=0;
	P2 = 0;
	TH1 =  TScan/256;		 //
	TL1 =  TScan%256;
	
	/* 将时间赋值给 数组led_show[] */
	if(*ss>=10)
	{
		*ss=0;
		(*sl)++;
	}else{}
	if(*sl>=10)
	{
		*sl=0;
		(*sh)++;
	}else{}

	if(*sh>=6)
	{
		*sh=0;
		(*m)++;		
	}else{}
	if(*m>=10)
	{
		TR0=0;	 //计时到9分59秒自动停止计时
		*ss=9;
		*sl=9;
		*sh=5;
		*m=9;			
	}else{}
	
	/* 显示led_show[] */
	P1 = led_scan[w];
	P2 = led_cc[ led_show[w] ];		//  
	w++;
	if(w==8)
	{
		w=0;
	}else{}

		
	/* 防抖70*4ms = 280ms */
	if(as>0)
	{
		as++;
		if(as==71)
		{
			as=0;
			IE0=0;	//清空外部中断0中断源
			EX0=1;  //打开外部中断0
			IE1=0;	//清空外部中断1中断源
			EX1=1;  //打开外部中断1
		}else{}
	}else{}
}

END

o(︶︿︶)o 唉!今晚还要码MATLAB的作业,
去窗边吹吹风抽根烟,为了生活为了她,继续努力吧骚年。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C51单片机学习笔记——秒表 的相关文章

  • 一个简单的基础通信协议的设计与实现

    一个简单的基础通信协议的设计与实现 一种常见的通信协议格式搭建串口收发环境配置STM32CubeMX添加USART部分代码 通信协议的实现 不同设备之间的通信 xff0c 都需要设计自己的通信协议 为了保证设备与设备之间的数据的稳定传输 x
  • 串口调试助手之间通信和接受、发送数据

    最近在用串口调试助手的时候在网上找了好多资料和教程都没有一个完整的 xff0c 就来写个完整的串口调试助手资料给刚入门或者刚接触的小白 xff0c 希望有所帮助 xff01 1 准备好串口调试助手 和 虚拟串口驱动 软件VirtualSer
  • win10下vs2019编译使用boost库v1_75_0

    boost介绍 Boost库是为C 43 43 语言标准库提供扩展的一些C 43 43 程序库的总称 boost是一个准标准库 xff0c 相当于STL的延续和扩充 xff0c 它的设计理念和STL比较接近 xff0c 都是利用泛型让复用达
  • vscode格式化C++代码方法

    参考 xff1a https blog csdn net wydxry article details 125191171 格式操作 解决方法 xff1a 按下组合键ctrl 43 shift 43 p 在弹出的搜索窗口中输入format
  • OpenCV基本介绍和安装

    OpenCV是一个通用 开源 功能强大的图像处理和计算机视觉库 官方网站 xff1a Home OpenCV 1999年 加里 布拉德斯基在Intel公司创建了计算机视觉库 xff08 Computer Vision Library xff
  • java jni ubuntu 环境搭建时遇到的坑

    1 xff1a 版本不一致遇到的坑 javah的版本需要同javac的版本一致 如果版本的问题搞不定 xff0c 直接用andorid source build之后的环境即可 2 xff1a javah使用遇到的坑 jni中字段描述符可以使
  • jni中native通过adb输出

    本文主要实践了如何在jni中打印log xff0c 贴源码 xff1a Android mk主要是巴拉的android源码中的app LOCAL PATH 61 call my dir include CLEAR VARS TARGET P
  • 关于服务器端用C语言实现TCP的数据接收

    关于这个 xff0c 真的是踩过很多坑 xff0c 罗列了一下要注意的点 xff1a 代码前面一定要添加库 xff0c 不然会出很多错 pragma comment lib 34 Ws2 32 lib 34 这段代码在vs2017中怎么也编
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • Java进阶day03继承

    先贴代码后分析 xff1a class Person span class hljs keyword private span span class hljs keyword int span age span class hljs key
  • JAVA进阶day05包和权限

    我这种外行人也听说过jar包 xff0c jar到底是个啥 xff1f 为啥c语言里没有呢 xff1f 下面我们拨开这一层面纱 贴代码做分析 xff1a 一 jar包 import a span class hljs preprocesso
  • Nandflash希尔特编程器烧录带来的一些点知识信息

    1 xff0e NAND FLASH 的特殊性 1 存在坏块 NAND FLASH 由于其生产工艺的原因 xff0c 出厂芯片中会随机包含坏块 坏块在出厂时已经被初始化 xff0c 并在特定区域中存在标记 xff0c 如果在使用过程中出现坏
  • 浅谈关于SRAM与DRAM的区别

    从名字上看 xff0c SRAM与DRAM的区别只在于一个是静态一个是动态 由于SRAM不需要刷新电路就能够保存数据 xff0c 所以具有静止存取数据的作用 而DRAM则需要不停地刷新电路 xff0c 否则内部的数据将会消失 而且不停刷新电
  • 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)

    一个定义为volatile的变量是说这变量可能会被意想不到地改变 xff0c 这样 xff0c 编译器就不会去假设这个变量的值了 精确地说就是 xff0c 优化器在用到这个变量时必须每次都小心地重新读取这个变量的值 xff0c 而不是使用保
  • arm MMU详解

    一 MMU的产生 许多年以前 xff0c 当人们还在使用DOS或是更古老的操作系统的时候 xff0c 计算机的内存还非常小 xff0c 一般都是以K为单位进行计算 xff0c 相应的 xff0c 当时的程序规模也不大 xff0c 所以内存容
  • 如何使用repo sync

    我們知道 repo 是 Google 為 Android source tree 的管理而寫的一個 script xff0c 以方便處理 Android 源碼包含的上百個 git repositories 要取得 upstream 最新的
  • 网络编程之Socket通信原理,TCP 、UDP、IPv4 IPv6地址,网络原理基础

    相关博客网址 xff1a https www cnblogs com wangcq p 3520400 html 本帖内容来源于网络 xff0c 如有侵权请联系删除 加粗样式 什么是TCP IP UDP xff1f TCP IP xff08
  • C++ 生成dll时没有顺带生成lib的原因

    C 43 43 dll库只生成dll文件 xff0c 而未生成lib文件 xff0c 问题在于没有在接口函数前面加上前缀 declspec dllexport 在VS的工程中 xff0c 此前缀常常被宏定义为 xff1a 工程名 API s
  • burp suite安装时,注册机点击run不起作用解决

    1 在cmd打开burpsuite pro v2 0beta jar所在目录 2 运行 java Xbootclasspath p burp loader keygen jar jar burpsuite pro v2 0beta jar

随机推荐

  • win10系统日语输入法只能打出英文字母无法切换&&微软输入法无法使用

    显示如下 xff1a 法1 xff1a 如果添加了日文 也安装了基本输入 xff0c 但是调出日文输入时屏幕右下角并不显示英文和假名的切换字母A xff0c 只能输入英文 xff0c 这样的win10一般安装的是ghost版 xff0c 一
  • 电脑虚拟摄像头 -obs及obs虚拟摄像头插件(免费)

    插件 xff1a 链接 xff1a https pan baidu com s 1AdAyc41LOHoSNesefcNOcA 提取码 xff1a pjne obs安装包 xff1a 链接 xff1a https pan baidu com
  • Mac电脑使用自然码双拼

    首先在键盘里选择双拼 然后打开 终端 执行 启动台 gt 其他当中 defaults span class token function write span com apple inputmethod CoreChineseEngineF
  • Mac.Android studio环境的搭建

    一 连接安卓手机 1 在 终端输入 xff1a system profiler SPUSBDataType 可以查看连接的usb设备的信息 2 创建 修改adb usb ini文件 输入 xff1a vi android adb usb i
  • rgb 与 #开头16进制 HEX颜色值关系转换,颜色值透明度的百分数对应十六进制表

    1 0x开头与 开头 从计算机的数值表示上讲 xff0c 0x开头的其实并不是所谓颜色代码的表示方法 xff0c 而是16进制数的标准写法 xff0c 譬如0xA就是十进制的10 而 开头 的六 xff08 或三 xff09 位十六进制数是
  • 74ls160 24进制异步计数器

    说明 xff1a 1 使用multisim 12仿真正常进位 xff0c 实际中可能到9进位 此时需要在U1和U2 xff0c RCO与Clk之间加个反相器 2 计数为23时清零 xff0c
  • SSH 出现 The authenticity of host xxx can't be established.

    已采纳 这个原因可能是本地主机的key发生了变化 xff0c 因此每次SSH链接都会有提示 xff0c 只需要在交互下输入yes即可 当然如果长久的想解决问题 xff0c 可以采用以下方法 xff1a 1 使用ssh连接远程主机时加上 o
  • Idea修改字符编码。解决文本乱码,以及控制台打印乱码问题,cmd乱码

    一 Idea修改字符编码 File gt Settings 二 文本乱码 修改编码为文本为文本本来的编码 xff0c 这里以GBK为例 点击apply xff0c 然后选择Reload 同样操作将编码改为utf 8 然后选择convert
  • Vrpn源码浅析(一)-添加自定义设备概述

    好记性不如烂笔头 最近需要用VRPN获取设备数据 xff0c 有些设备不在VRPN现有支持设备列表里 xff0c 就想着自己改一下源码添加一下 在网上找了一段时间发现包括官网上的教程基本都是教你怎么用的 xff0c 没找到告诉你怎么改的 x
  • (3)odroid xu4/3 SD卡的ubuntu系统烧入

    1 下载镜像 xff1a http odroid com dokuwiki doku php id 61 en xu3 release linux ubuntu 选择一个版本下载 xff08 镜像服务器 xff09 2 下载烧写工具 xff
  • Vrpn源码浅析(三)-添加optitrack追踪设备

    好记性不如烂笔头 xff0c 之前进行了源码的简单分析并尝试添加了joystick这类包含analog以及button类型数据的设备 这次我们更近一步 xff0c 尝试添加最为复杂的追踪设备 本次添加的设备为optitrack xff0c
  • [Index]博文索引

    为了方便查看需要的博文 xff0c 在此给出所有博文的索引链接地址 UAV Software Version xff1a ArduCopter xff08 Ver 3 3 xff09 Hardware Version xff1a pixha
  • NVIDIA JETSON XAVIER NX (四)安装Pytorch和torchvision

    可选择在NX上创建新python环境进行安装 xff0c 避免和其他工程环境发生冲突 xff0c 具体虚拟环境操作步骤可见Python创建虚拟环境 下面就开始安装pytorch的愉快之旅吧 xff01 1 安装相关依赖环境 span cla
  • 使用nuttx写自启任务

    首先从px4学习怎么进行系统任务 px4是通过nsh main里面调用nsh consolemain然后调用rcS文件 xff0c 运用rcS脚本命令启动相应模块 然而经过了一个礼拜的实践 xff08 浪费时间 xff09 xff0c 我发
  • QT常用库、类、函数等

    文章目录 常用基类QObject类内存管理机制 xff1a 父子对象的内存管理机制 QApplication类 xff1a 应用程序类 xff08 一般不直接操纵 xff09 QWidget类 xff1a 窗体类容器控件QStackedWi
  • 单片机中堆栈那些事儿

    堆栈是内存中一段连续的存储区域 xff0c 用来保存一些临时的数据 xff0c 比如 xff0c 可以保存中断指令INT中的标志寄存器值 代码段寄存器CS值 指令指针寄存器IP值 xff1b 还可以用以RET指令从中可以得到返回的地址 xf
  • udp 通信

    1 char strtok char str const char delim 功能 xff1a 对字符串进行切割 参数 xff1a str 要切割的字符串的首地址 delim 切割的规则 返回值 xff1a 切割后字符串的首地址 2 ud
  • Unix网络编程 Ubuntu20.04.2 Visual Studio Code

    Visual Studio Code 说明 1 本文中 表示下一步 下一级菜单和修改为 xff0c 需根据上下文理解 一 环境配置 1 安装gcc g 43 43 和gdb span class token function sudo sp
  • 基于Jetson NX的模型部署

    系统安装 系统安装过程分为3步 xff1a 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https developer nvidia com jetson nano sd card image Wi
  • C51单片机学习笔记——秒表

    前言 不知不觉我又被自己的惰性拖住了小一个月 xff0c 今天在宿舍窗边吸烟时候 xff0c 看着楼下人来人往的道路不由自主的感到一丝惭愧 xff0c 手里的小视频也被我刷出来一条鸡汤 xff0c 在这儿我要写下来记录给将来又在颓废的我 x