自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 收藏
  • 关注

原创 单片机基础知识 07

检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们可以确定当前被按下的键是哪一行哪一列的。用同样的方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有按键被按下时便可判断出按下的键是哪一个键。案例1:用数码管的前两位显示一个十进制数,变化范围为00-59,开始时显示00,每按下S2键1次,数值加1;在单片机组成的各种系统中,用的较多的是非编码键盘。

2024-04-19 22:54:00 229

原创 单片机基础知识 06 (中断-2)

定时器一旦启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为1个机器周期,那么此时机器周期就是1us,计满TH0和TL0就需要2^16-1个数,再来一个脉冲计数器溢出,随机向CPU申请中断。另一个是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器加1,当加到计数器全为1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON寄存器中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。

2023-08-27 17:56:20 897

原创 C++ 笔记 23 (STL常用算法 - 算术生成 & 集合)

3)set_intersecton返回值是交集中最后一个元素的位置。3)set_difference返回值是差集中最后一个元素的位置。3)set_union返回值是并集中最后一个元素的位置。2)目标容器开辟空间需要从两个容器中取最小值。2)目标容器开辟空间需要从两个容器中取较大值。1)求交集的两个集合必须是有序序列;1)求并集的两个集合必须是有序序列;1)求差集的两个集合必须是有序序列;功能:向容器中填充指定的元素。功能:求两个容器的交集。功能:求两个集合的并集。功能:求两个集合的差集。

2023-06-24 17:03:17 428

原创 C++ 笔记 22 (STL常用算法 - 排序 & 拷贝 & 替换)

总结:利用copy算法在拷贝时,目标容器记得提前开辟空间。总结:swap交换容器时,注意交换的容器要同种类型。总结:merge合并的两个容器必须是有序序列。功能:将区间内满足条件的元素,替换成指定元素。功能:两个容器元素合并,并存储到另一容器中。功能:容器内指定范围的元素拷贝到另一容器中。功能:将容器内指定范围的旧元素修改为新元素。功能:洗牌,指定范围内的元素随机调整次序。总结:reverse反转区间内元素。功能:对容器内元素进行排序。功能:将容器内元素进行反转。功能:互换两个容器的元素。

2023-06-24 16:19:41 343

原创 C++ 笔记 21 (STL常用算法 - 遍历 & 查找)

功能:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()。总结:find_if按条件查找使查找更加灵活,提供的仿函数可以改变不同的策略。总结:利用find可以在容器中找到指定的元素,返回值是迭代器。总结:二分查找法效率很高,但是查找的容器中元素必须是有序序列。总结:for_each是最常用的遍历算法,需要熟练掌握。总结:搬运的目标容器必须提前开辟空间,否则无法正常搬运。功能:查找指定元素是否存在。功能:按条件统计元素个数。功能:查找相邻重复元素。功能:按条件查找元素。

2023-05-02 21:19:22 724 1

原创 C++ 笔记 20 (STL函数对象)

函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值;函数对象超出普通函数的概念,函数对象有自己的状态;概念:STL内建了一些函数对象,即内建了一些仿函数。总结:关系仿函数中最常用的是greater大于。函数对象(仿函数)是一个类,不是一个函数。总结:参数只有一个的谓词,称为一元谓词。总结:参数只有两个的谓词,称为二元谓词。总结:实际应用中,逻辑仿函数使用很少。函数对象可以作为参数传递。

2023-05-01 17:07:45 725

原创 C++ 笔记 19 (STL常用容器 - map & multimap)

总结:map中所有元素都是成对出现,插入数据时要使用对组。

2023-04-30 20:54:34 450

原创 sizeof 和 strlen

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’。sizeof是一个运算符,计算的是分配空间的实际字节数。

2022-11-28 22:22:08 122

原创 C++ 笔记 18 (STL常用容器 - set & multiset)

set(集合)/multiset(多重集合)属于关联式容器,底层结构是用二叉树实现。set不允许容器中有重复的元素,multiset允许容器中有重复的元素。set容器默认排序规则为从小到大,掌握如何改变排序规则。set插入数据的同时会返回插入结果,表示插入是否成功。multiset不会检测数据,因此可以插入重复数据。set不可以插入重复数据,而multiset可以。成对出现的数据,利用对组可以返回两个数据。所有元素都会在插入时自动被排序。利用仿函数,可以改变排序规则。

2022-11-20 11:33:53 591

原创 C++笔记 17 (STL常用容器 - stack & queue & list)

list的插入操作和删除操作都并不会造成原有list迭代器的失效,这在vector是不成立的。由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于。2)执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。1)链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大。队列中只有队头和队尾才可以被外界使用,因此队列。栈中只有顶端的元素才可以被外界使用,因此栈。链表的组成:链表由一系列结点组成,结点由。的数据结构,它只有一个出口。STL中的链表是一个。

2022-11-07 21:50:36 467

原创 单片机基础知识点 05 (中断-1)

先来了解中断的概念,我们拿生活中举个例子,就比如你原本在洗衣服,洗着洗着水开了,这时候你跑过去把关火,把水灌入水瓶后,在回来洗衣服,那么这个过程实际上就是发生一次中断。对单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速处理(中断发生);在51单片机系列中,高优先级中断能够打断低优先级中断以形成中断嵌套,同优先级中断之间,或低级对高级中断则不能形成中断嵌套。PT1=1,定时器/计数器1中断定义为高优先级中断。PT0=1,定时器/计数器0中断定义为高优先级中断。

2022-11-06 22:14:59 2053

原创 C++笔记 16 (STL常用容器 - deque)

有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。2)遍历vector容器,取出来每一个选手,执行for循环,可以把10个评委打分存到deque容器中。deque内部有个中控器,中控器维护的是每个缓冲区的地址,而缓冲区中存放真实的数据。1)vector对于头部的插入删除效率低,数据量越大,效率越低;2)deque相对而言,对头部的插入删除速度会比vector快;3)sort算法对deque容器中分数排序,去除最高和最低分。,可以对头端进行插入删除操作。

2022-11-06 17:35:40 372

原创 C++笔记 15 (STL 常用容器 - vector)

动态扩展,并不是在原空间之后续接新空间,而是找到更大的内存空间,然后将原数据拷贝新空间,释放原空间。总结:除了用迭代器获取vector容器中元素,[ ]和at也可以。,与数组的不同之处在于数组是静态空间,而vector可以。如果数据量较大,可以一开始利用reserve预留空间。vector数据结构和数组非常相似,也称为。减少vector在动态扩展容量时的扩展次数。实现两个容器内元素互换。

2022-10-30 14:27:03 228

原创 C++笔记 14 (STL 常用容器 -string)

特点:string类内部封装了很多成员方法,例如查找(find),拷贝(copy),删除(delete),替换(replace),插入(insert)2)string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。string管理char* 所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。string字符串中单个字符存取有两种方式,利用**[ ]** 或。本质:string是C++风格的字符串,而string本质是一个类。替换:在指定的位置替换字符串。

2022-10-05 20:57:49 437

原创 C++笔记 13 (STL初识)

include # include # include //自定义数据类型 class Person {public :int mAge;};//存放对象 void test01() {//创建数据 Person p1("aaa" , 10);it!it ++) {} } //放对象指针 void test02() {//创建数据 Person p1("aaa" , 10);

2022-08-14 11:38:00 125

原创 C++ 笔记 12 (类模板)

作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。语法:3.2 类模板与函数模板的区别类模板没有自动类型推导的使用方式类模板在模板参数列表中可以有默认参数3.3 类模板中成员函数创建时机普通类中的成员函数一开始就可以创建类模板中的成员函数在调用时才创建学习目标:类模板实例化出的对象,向函数传参的方式一共有三种传入方式:1)指定传入的类型(最常用)—直接显示对象的数据类型2)参数模板化—将对象中的参数变为模板进行传递3)整个类模板化—将这个对象类型模板化进行

2022-07-07 20:38:51 95

原创 C++笔记 11(函数模板)

模板就是建立通用的模具,大大提高复用性模板的特点:1)模板不可以直接使用,它只是一个框架2)模板的通用并不是万能的C++的另一种编程思想称为“泛型编程”,主要利用的技术就是模板。C++提供两种模板机制:函数模板和类模板。作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟类型来代表。语法:template — 声明创建模板;typename — 表明其后面的符号是一种数据类型,可以用class代替;T — 通用的数据类型,名称可以替换,通常为大写字母总结:1)函数模板利

2022-07-06 21:08:35 358

原创 C++笔记 10 (多态代码练习)

职工管理系统可以用来管理公司内所有员工的信息利用C++来实现一个基于多态的职工管理系统公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位,以及职责。普通员工职责:完成经理交给的任务经理职责:完成老板交给的任务,并下发任务给员工老板职责:管理公司所有事务管理系统中需要实现的功能如下:1)退出管理程序:退出当前管理系统2)增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号3)显示职工信息:显示公司内部所有职工的信息4

2022-07-06 16:21:35 349

原创 C++笔记 09 (文件操作)

程序运行时产生的数据都属于临时数据,程序一旦运行结束时都会被释放,通过文件可以将数据持久化。C++中对文件操作需要包含头文件文件类型分别两种:1)文本文件 — 文件以文本的ASCII码形式存储在计算机中2)二进制文件 — 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们操作文件的三大类:1)ofstream : 写操作2)ifstream : 读操作3)fstream :读写操作步骤如下:1)包含头文件 #include 2) 创建流对象 ofstream ofs;3)

2022-07-06 15:42:37 76

原创 C++笔记 08(多态)

多态是C++面向对象三大特性之一多态分为两类:静态多态:函数重载和运算符重载属于静态多态,复用函数名。动态多态:派生类和虚函数实现运行时多态。静态多态和动态多态区别:1)静态多态的函数地址早绑定——编译阶段确定函数地址2)动态多态的函数地址晚绑定——运行阶段确定函数地址修改如下:动态多态满足条件: 1)有继承关系; 2)子类重写父类虚函数;动态多态使用条件:父类指针或引用指向子类对象 (Animal & animal =cat)当子类重写父类的虚函数,子类中的虚函数表内部会替换成子类的虚函数

2022-07-06 12:32:11 219

原创 C++笔记 07 (继承)

继承是C++面向对象三大特性之一继承的好处:可以减少重复的代码语法:A类称为子类或派生类B类称为父类或基类派生类中的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员;从基类继承过来的表现其共性,而新增的成员体现了个性。继承方式一共有三种:公有继承;保护继承;私有继承问题:从父类继承过来的成员,哪些属于子类对象中?父类中所有非静态成员属性都会被子类继承下去父类中私有成员属性,是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了子类继承父类后,当创建子类对象时,也会调用父类的构

2022-07-03 17:47:20 60

原创 C++笔记 06 (运算符重载)

对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。作用:实现两个自定义数据类型相加的运算总结1: 对于内置的数据类型的表达式的运算符是不可能改变的总结2:不能滥用运算符重载(例如operator+函数中写成减法)作用:可以输出自定义数据类型总结:重载左移运算符配合友元可以实现输出自定义数据类型总结:前置递增返回引用,后置递增返回值C++编译器至少给一个类添加4个函数1)默认构造函数(无参,函数体为空)2)默认析构函数(无参,函数体为空)3)默认拷贝构造函数,对属性进行值拷

2022-07-03 16:23:39 225

原创 C++笔记 05 (C++对象模型、this指针、友元)

在C++中,类内的成员变量和成员函数分开存储;只有非静态成员变量才属于类的对象上,占对象空间;另外,空对象占用内存空间为1C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置,每一个空对象也应该有一个独一无二的内存地址。在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员

2022-06-29 10:51:04 137

原创 C++笔记 04 (封装、对象初始化和清理)

C++面向对象的三大特性为:封装、继承、多态C++认为万事万物都皆为对象,对象上有其属性和行为。例如:人可以作为对象,属性有姓名、年龄、身高、体重等,行为有走、跑、跳、吃饭、唱歌等;车可以作为对象,属性有轮胎、方向盘、车灯等,行为有载人、放音乐、开空调等。具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类。封装是C++面向对象三大特性之一封装的意义:1)将属性和行为作为一个整体,表现生活中的事务;2)将属性和行为加以权限控制语法:类中的属性和行为,统一称为成员;属性也称为成员属性或

2022-06-28 17:42:37 231

原创 C++笔记 03 (引用、函数提高)

二. 引用作用:给变量起别名语法:注意事项:1)引用必须初始化 int &c ; (错误) int &c=b ; (正确)2)引用在初始化后,不可以改变引用做函数参数作用:函数传参时,可以利用引用的技术让形参修饰实参优点:可以简化指针修改实参示例:引用做函数返回值作用:引用是可以作为函数的返回值存在的注意:不要返回局部变量引用用法:函数调用作为左值引用的本质引用的本质在C++内部实现是一个指针常量(C++推荐用引用技术,因为语法方便,引用本质是指针常量,但...

2022-06-26 21:27:40 283

原创 C++笔记 02 (结构体代码练习)

通讯录管理系统

2022-06-22 16:13:04 229

原创 单片机基础知识点 04

编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字。需要注意的是,单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间中,编译后编码占用的是程序存储空间,而非内存空间。举例:3. 数码管动态显示数码管动态扫描显示原理:所谓动态扫描显示,即轮流向各位数码管送出形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人感觉好像各位数码管同时都在显示,而实际上是多位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼已经无法分辨出来。.

2022-06-21 17:20:05 1050

原创 C++笔记 01 (C++入门)

例1:输出为:随机数生成例2:嵌套循环外层执行一次,内层执行一周break 语句1) 出现在switch条件语句中,作用是终止case并跳出switch;2) 出现在循环语句中,作用是跳出当前循环语句;3) 出现在嵌套循环中,跳出最近的内层循环语句;continue 语句在循环语句中,跳过本次循环余下尚未执行的语句,继续执行下一次循环;continue不会使整个循环终止,而break会跳出循环。goto语句作用:可以无条件跳转语句(但不建议使用)语法:解释:如果标记的名称存在

2022-06-20 22:43:59 184 1

转载 vector 的越界错误

C++标准库中vector容器的遍历是非常常见的,除了用迭代器遍历以外,很多人也非常喜欢直接用下标,如下:这样做没有问题,注意循环判断语句,i < v.size(),i从0一直遍历到v.size()-1,估计会有人喜欢把循环改成如下这样:这段代码仅仅是把上面的i < v.size() 改成了 i ......

2022-06-11 16:45:38 1620

原创 03 strncpy函数

C语言基础

2022-06-11 16:13:18 52

原创 单片机基础知识点 03

1. 由电阻标号认知阻值例如,103表示其阻值大小为10x103 Ω,即10kΩ,若是102其阻值大小为10x102 Ω,即1kΩ,150为15x100 Ω,即15Ω,其他读法都相同。1002表示100x102 Ω,即10kΩ,1001表示100x101 Ω,即1kΩ。标号位数不同,表示电阻的精度不同。一般地,3位数表示5%精度,4位数表示1%精度。还有的标号为3R0,表示阻值为3Ω,4K7表示阻值为4.7kΩ,R002表示阻值为0.002Ω。2. 发光二极管发光二极管正极又

2022-05-05 15:13:17 805

原创 单片机基础知识点 02

1. reg52.h头文件的作用在代码中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处,免去我们每次编写同类型程序都要将头文件中的语句重复编写。在代码中加入头文件有两种书写方法,分别为 #include<reg52.h>和#include"reg52.h"。当使用<>包含头文件时,编译器先进入到软件安装文件夹处开始搜索这个文件,例如Keil/C51/INC这个文件夹下,如果这个文件夹下没有引用的头文件,编译器将会报错。当使用“ ”包含头文件时,编译

2022-05-04 17:38:53 244

原创 单片机基础知识点 01

1. 什么是单片机单片机就是在一片硅片上集成了微处理器、存储器以及各种输入/输出接口的芯片,具有计算机属性,因而被称为单片微型计算机,简称单片机。单片机是一块具有特殊功能的集成芯片,它的功能的实现需要使用者编程完成。编程的目的就是控制这块芯片的各个引脚在不同的时间输出不同的电平(高电平或者低电平),进而控制与单片机各个引脚相连接的外围电路的电气状况。2. 区分芯片引脚序号无论哪种芯片,当我们观察它的表面时,大都会找到一个凹进去的小圆坑,或者用颜色标记的一个小标记(圆点或三角或其他小图形),这个小圆坑

2022-05-04 17:16:07 1214

原创 xdata,volatile,extern,static,#pragma 关键字

1. xdataxdata:声明的变量位于外部 RAM 地址范围内某一位置。2. volatilevolatile: 的本意是“易变的” ,因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化。当要求使用 volatile 声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用 volatile,则编译器将对所声明的语句进行优化。(

2021-12-21 20:20:44 1589

原创 输入型参数和输出型参数

1、函数为什么需要传参和返回值(1) 函数的作用就是处理数据,传入的参数就是被加工的数据,返回值就是输出的结果。(2)函数名就是这个函数的入口,在内存中表示就是一个函数代码段的首地址,实质是一个指针常量,所以在程序中使用函数名都是当地址来用的,用来调用这个函数。再理解指针函数的实质就比较简单了。(3) 如果一个函数没有传参和返回值,也是可以的,也可以正常运行,那么没有返回值和形参的函数怎么运行呢?为什么会有这种函数呢?其实这种类型的函数在C语言中有很多。主要有两个作用:1) 在系统初始化的时候,我们做

2021-12-21 20:09:07 3177

原创 02 memset函数

C语言中memset函数及其用法每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:# include <string.h>void *memset(void *s, int c, unsigned long n);函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 v

2021-12-21 19:56:31 59

原创 return语句

return语句函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。return 语句的一般形式为:return 表达式;或者:return (表达式);有没有( )都是正确的,为了简明,一般也不写( )。例如:return max;return a+b;return (100+200);对C语言返回值的说明:1 .没有返回值的函数为空类型,用void表示。例如:void func(){ printf("http://

2021-12-21 19:43:19 2376 2

原创 C和C++中struct的区别

2021-12-21 16:01:12 536

原创 C++中struct和class的区别

C++中struct和class的区别C++中的struct对C中的struct进行了扩充,它不再只是一个包含不同数据类型的数据结构。struct和class一样,也能包含成员函数,能继承,能实现多态。它和class最本质的一个区别就是默认的访问控制,体现在两个方面:1.默认的继承访问权限。struct是public的,class是private的。struct A{int a;};struct B : A{int b;};如上所示,这个时候B是public继承A的。如果都将上面的s

2021-12-21 15:30:34 730

原创 几种开源协议

一.BSDBSD开源协议是一个给予使用者很大自由的协议,基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。但”为所欲为”需要满足三个条件:如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。BSD 鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者

2021-12-21 14:49:59 109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除