自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (1)
  • 收藏
  • 关注

原创 4. 51 测量空气的温度和湿度(51单片机 + DHT11温湿度 + LCD1602显示)

51单片机 + DHT11温湿度 + LCD1602显示DHT11温湿度相关介绍DHT11产品概述测量范围接口说明DHT11温湿度相关介绍DHT11产品概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快 响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精

2021-10-09 19:48:50 5352 14

原创 3. 51——LCD1602显示 字符、字符串、数字

51——LCD1602显示 字符 或 字符串LCD1602简介LCD1602相关引脚LCD1602写命令、写数据相关操作图写指令 代码写数据 代码LCD1602显示程序步骤及如何初始化显示开关控制指令进入模式设置指令功能设定指令清屏指令设置从(x,y)开始显示显示字符 或 字符串显示字符显示字符串接线图代码整合LCD1602.cLCD1602.hmain.c效果展示LCD1602简介LCD1602相关引脚LCD1602写命令、写数据相关操作图写指令 代码void LCD_WriteComm

2021-10-07 11:56:57 42175 9

原创 2. 51——串口通信

51——串口串口的基本介绍波特率通信校验奇偶校验和校验CAC校验51串口内部结构并行通信串行通信同步通信异步通信串行口的控制寄存器SCON寄存器串口的基本介绍单片机通信是指单片机和单片机 或者 单片机和计算机的相互通信,一般比较多都是单片机(下位机)和计算机(上位机)作为通信。串行通信其实用的还是挺多的,就比如我们在调试程序时,可以通过串行口来调试程序。像什么蓝牙模块、语音模块等等也挺多是用串行通信。一般通信方式为两种:并行通信 和 串行通信。通信制式一共为3种:单双工: 一个只能发送,一

2021-10-05 11:16:35 573

原创 1. 51——中断、定时器 / 计数器

51——中断、定时器 / 计数器中断系统中断概念中断作用中断源及相关寄存器中断源及优先级中断允许寄存器 IE中断优先级控制寄存器低 IP定时器/计数器概念定时器/计数器控制寄存器 TCON中断系统中断概念CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。中断作用随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/

2021-09-29 22:15:14 4981

原创 10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

STM32——PWM 控制舵机通用定时输出PWMPWM的工作原理PWM的模式TIM_OCMode_PWM1 (边沿对齐模式)TIM_OCMode_PWM2(中央对齐模式)占空比舵机实物图接线舵机工作原理周期TPWM占空比TIM3 PWM输出 驱动SG90电机 配置过程:1. 使能GPIO时钟,TIM定时器时钟,部分重映射时钟2. 重映射定时器3. 配置GPIO结构体4. 配置通用定时器TIM结构体5. 配置PWMstm32 超声波感应开盖垃圾桶motor.c通用定时输出PWM以TIM3为例,STM32的

2021-09-27 14:11:31 12948 65

原创 9. STM32——HC_SR04超声波测距

STM32——HC_SR04超声波测距HC_SR04实物图基本参数工作原理时序图超声波测距步骤1. 使能GPIO时钟、定时器时钟2. 配置GPIO引脚3.配置TIM定时器时钟4. 配置NVIC优先级5. 开启TIM4定时器6. 关闭TIM4定时器7. TIM4定时器中断服务函数8. 获取Echo时间9. 获取距离整合代码HC_SR04.cHC_SR04.husart.cusart.hmain.c测距完成HC_SR04实物图基本参数工作原理时序图超声波测距步骤1. 使能GPIO时钟、

2021-09-25 16:27:30 21851 40

原创 8. STM32——系统定时器SysTick

STM32——系统定时器SysTickSysTick 配置库函数SysTick 中断时间的计算SysTick 配置库函数__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){ // 不可能的重装载值,超出范围 if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL);} // 设置重装载寄存器 SysTick->LOAD = (uint32_t)(tick

2021-09-23 10:33:54 947 2

原创 7. STM32——定时器中断(1秒闪烁灯)

STM32——定时器中断(闪烁灯)基本框架1. 配置定时器时钟在 stm32f10x_rcc.h 头文件中查找相关函数函数2. 配置定时器结构体在 stm32f10x_tim.h 头文件中查找相关函数函数3. 开启定时器中断在 stm32f10x_tim.h 头文件中查找相关函数函数4. 配置中断结构体在 misc.h 头文件中查找相关函数函数TIM2_IRQn 在 stm32f10x.h 头文件中可以查找到5. 搭建定时器中断服务函数闪烁灯代码整合tim.ctim.hmain.c闪烁灯基本框架1. 配

2021-09-20 21:38:37 15371 4

原创 6. STM32——用串口发送数据点亮LED(串口的中断接收)

STM32——串口中断接收1. 配置 GPIO 时钟、串口时钟、复用时钟2. 配置 GPIO 结构体3. 配置串口1. 2. 3. 步骤基本框架在 [5. STM32——串口发送字符、字符串 + printf 的重定向](https://blog.csdn.net/weixin_46105931/article/details/120385156?spm=1001.2014.3001.5501)4. 配置中断 NVIC 抢占优先级在 misc.h 头文件中查找相关函数函数USART1_IRQn 在 stm3

2021-09-20 18:27:59 11678 4

原创 5. STM32——串口发送字符、字符串 + printf 的重定向

STM32——串口发送字符、字符串 + printf 的重定向基本框架1. 配置时钟:配置GPIO时钟、窗口时钟、引脚复用时钟2. 配置GPIO结构体在 stm32f10x_gpio.h 头文件中查找相关函数函数3. 配置串口结构体在 stm32f10x_usart.h 头文件中查找相关函数4. 串口的发送STM32 串口通信中 USART_FLAG_TC 与 USART_FLAG_TXE 区别在 stm32f10x_usart.h 头文件中查找相关函数基本框架整合代码usart.cusart.hmain.

2021-09-20 09:54:27 9474 1

原创 4. STM32——固件库外部 中断 EXTI和NVIC 震动感应灯

STM32——固件库外部 中断 EXTI和NVIC 震动感应灯1.配置 GPIOA12.配置 EXIT 外部中断结构体3.配置NVIC中断优先级结构体4.搭建中断函数服务函数exti.cexti.hmain.c1.配置 GPIOA1//1.配置GPIOA1GPIO_InitTypeDef shake_init;//1.1使能GPIOA时钟,设置复用,中断线输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2Pe

2021-09-19 09:03:48 462

原创 3. STM32——固件库震动感应灯

固件库震动感应灯接线STM32 和 震动传感器 的接线STM32 和 继电器 的接线LED 和 继电器 的接线接线STM32 和 震动传感器 的接线VCC——3.3GND——GNDDO——GPIOA1STM32 和 继电器 的接线VCC——3.3GND——GNDIN——GPIOA3LED 和 继电器 的接线...

2021-09-18 17:31:05 442

原创 2. STM32——固件库点灯 + 呼吸灯

STM32——固件库点灯1. 新建固件库工程文件1.1 找到一个固件库模板1.2 打开 KEIL5 新建工程1.3 添加相关文件1.4 手动添加其他文件路径进来2. STM32固件库点灯2.1 在 User 底下创建 led 文件夹,led 文件夹创建 led.c .h 文件2.2 将 led.c 加入 USER 组2.3 添加 led.h 路径2.4 在 led.h 头文件中声明 LED_Init()函数(直接复制void LED_Init(void) + ;号)2.5 点灯开始2.5.1 使能APB2时

2021-09-17 13:21:38 2566 2

原创 1. STM32 环境搭建 + STM32 新建工程 + Yinyuer(ZCY) 的 STM32 寄存器首次点灯

1. STM32 环境搭建 + STM32 新建工程 + 寄存器点亮 LED 灯STM32 环境搭建安装 keil5下载安装芯片包百度网盘官网下载安装芯片包STM32 新建工程Yinyuer(ZCY) 的 STM32 寄存器首次点灯STM32 环境搭建安装 keil5百度云盘下载提取码:v2lp注意:安装路径不能出现中文下载安装芯片包百度网盘STM32F1xx_DFP.1.0.5.pack提取码:ot7hSTM32F4xx_DFP.1.0.8.pack提取码:di7e官网下载

2021-09-14 14:53:18 2176 4

原创 Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、signal signaction sigqueue 信号、semget semctl semop 信号量)

Linux 3.进程间通信(IPC)共享内存共享内存的接口指令shmget 创建获取获取共享内存shmat 映射:连接共享内存到当前进程的地址空间shmdt 断开与共享内存的连接shmctl 控制或者删除共享内存的相关信息共享内存 示例shmw.outshmr.out共享内存共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。共享内存的接口指令查看系统中的共享存储段ipcs -m删除系统中的共享存储段ipc

2021-09-12 16:21:47 928

原创 Linux 3.进程间通信(IPC)(pipe 无名管道、mkfifo 有名管道、ftok、msgget、msgrcv、msgsnd、msgctl 消息队列)

Linux 3.进程间通信(IPC)进程间通信:进程间方式:pipe 管道(无名管道)头文件及原型特点pipe 示例进程间通信:不同进程之间传数据、交换信息。进程间方式:管道(无名管道和命名管道)消息队列信号量共享内存socketsteams等。其中socket 和 steams 支持不同主机上的两个进程通信。pipe 管道(无名管道)通常指无名管道,是Unix 系统 IPC最古老的形式。头文件及原型#include <unistd.h>int pipe(in

2021-09-10 20:08:51 976 1

原创 Linux 2.进程(exec族函数 和 fork、system、popen函数)

Linux 2.进程(exec族函数和fork、system、popen函数)exec 族函数和 fork 函数的结合exec 族函数和 fork 函数的结合做一个类似有客户端连接了服务器,服务端创建一个子进程,然后去修改 test.config 文件中的 LENGTH 的值把它改成 8 。...

2021-09-09 12:45:45 454

原创 Linux 2.进程(exec族函数)

Linux 2.进程(exec族函数)exec族函数作用exec头文件及原型exec参数exec返回值execlexec族函数作用如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。exec头文件及原型#include <unistd.h>int execl(const char * path,const char * arg,…);int execle

2021-09-08 20:56:34 676

原创 Linux 2.进程(ps、top、fork、vfork、wait、waitpid、getpid、getppid)

进程什么是程序,什么是进程?程序进程如何查看系统中有哪些进程?1、使用 ps 指令查看2、使用top指令查看什么是进程标识符?什么是父进程,什么是子进程?C程序中的存储空间是如何分配的?什么是程序,什么是进程?程序就是静态的一个概念。比如 gcc a.c -o a.out那么这样就会在磁盘生成一个文件 a.out ,这个 a.out 就是一个程序。进程进程是我们程序的一次运行活动,当我们去运行这个 a.out 的时候,那么这个程序就跑起来了,此时系统中会多了一个进程。如何查看系统中有哪些进程?

2021-09-07 20:47:07 1735

原创 Linux 1.文件编程(fopen、fwrite、fseek、fread、flose、fputc、fgetc、feof)

Linux 1.文件编程(fopen、fwrite、fseek、fread、fputc、feof、fgetc)fopenfopen功能fopen头文件及原型fopen参数fopen返回值fwritefwrite功能fwrite头文件及原型fwrite参数fwrite返回值fseekfseek功能fseek头文件及原型fseek参数fseek返回值freadfread功能fread头文件及原型fread参数fread返回值fopenfopen功能使用给定的模式mode打开filename所指向的文件。

2021-09-03 15:49:48 931

原创 Linux 1.文件编程(main函数的带参的形式、实现cp指令、修改文件里面的数据、对文件写入一个整数、对文件写入一个数组、对文件写入一个结构体、对文件写入结构体数组)

文件编程(实现cp指令、修改文件里面的数据、对文件写入一个整数、对文件写入一个结构体、写入结构体数组)

2021-08-30 15:46:24 182

原创 Linux 1.文件编程(open、creat、write、read、lseek)

Linux 1.文件编程文件的打开及创建(open和creat)open函数的头文件文件的打开及创建(open和creat)open函数的头文件#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);

2021-08-16 01:58:43 2631

原创 24.C语言实战项目(链表、指针、结构体的综合运用):学生成绩管理系统

C语言实战项目:学生成绩管理系统学生结构体班级结构体创建学生链表创建班级链表打印出每一个学生的各科成绩、总分、平均分找出总分最高分学生的班级、学号、分数找出总分最低分学生的班级、学号、分数学生结构体struct Student{ int classNum; int xuehao; int Chinese; int maths; int English; float sum; float average; struct Student* next; };班级结构体stru

2021-08-11 01:37:18 554

原创 23.动态链表的创建——尾插法

动态链表的创建——尾插法核心代码核心代码struct Test* insertFromBehind(struct Test* phead,struct Test* new){ struct Test* p=phead; if(phead==NULL) { phead=new; return phead } while(p->next!=NULL) { p=p->next; } p->next=new; return phead;}

2021-07-31 23:40:30 150 1

原创 22.动态链表的创建——头插法

动态链表的创建——头插法核心代码核心代码struct Test* insertFromHead(struct Test* phead){ struct Test* new=NULL; while(1) { new=(struct Test*)malloc(sizeof(struct Test)); printf("Please input node:\n"); scanf("%d",&(new->data)) if(phead==NULL) { phe

2021-07-28 01:18:57 157

原创 21.链表的更改

链表的更改核心代码示例核心代码struct Test* gaiNode(struct Test* phead,int data,int newdata){ struct Test* p=NULL; p=phead; while(p!=NULL) { if(p->data==data) { p->data=newdata; return phead; } p=p->next; } return phead;}示例将链表中的 8 改成

2021-07-27 13:26:43 129

原创 20.链表节点的删除

链表节点的删除核心思路核心代码核心思路核心代码#include <stdio.h>struct Test{ int data; struct Test* next;};void printLink(struct Test* phead){ struct Test* point=phead; while(point!=NULL) { printf("%d ",point->data); point=point->next; } pu

2021-07-25 00:12:47 89

原创 19.链表插入——头插法

链表插入——头插法核心思想核心代码头插法示例核心思想当目标节点为第一个节点时当目标节点为非首节点时核心代码当目标节点为第一个节点时if(p->data==data){ new->next=p; return new;}当目标节点为非首节点时while(p->next!=NULL){ if(p->next->data==data) { new->next=p->next; p->next=new;

2021-07-19 10:37:08 294

原创 18.链表插入——尾插法

链表插入——尾插法核心思想核心代码注意示例核心思想找到要插到后方的节点 new->next = p->next p->next = new 核心代码void insertBehind(struct Test* phead,int data,struct Test* new){ struct Test* p; p=phead; while(p!=NULL) { if(p->data==data) { new->next=p

2021-07-09 17:31:04 1525

原创 17.计算链表节点个数 && 链表的查找

计算链表节点个数 && 链表的查找计算链表节点个数链表的查找示例计算链表节点个数int totalNodeNum(struct Test* phead){ int cnt=0; while(phead!=NULL) { cnt++; phead=phead->next; } return cnt;}链表的查找int searchNode(struct Test* phead,int data){ while(phead!=NULL) { i

2021-07-09 10:16:32 965 1

原创 16.链表静态添加和动态遍历

链表静态添加和动态遍历链表静态添加链表动态遍历示例链表静态添加直接在链表尾部加struct Text* tn={x,NULL};tn.next=&t(n+1)链表动态遍历void printLink(struct Test* phead){ struct Test* point=phead; while(point!=NULL) { printf("%d ",point->data); point=point->next; } putchar('\

2021-06-30 21:38:16 142

原创 15.链表是个好东西!good job!

链表的引入链表定义链表特点单链表的引入示例和数组相同,链表也是一种线性表结构。作为非常基础、非常常用的两种数据结构,数组和链表经常被拿来比较。链表定义链表是一种线性表数据结构。从底层存储结构上看,链表不需要一整块连续的存储空间,而是通过“指针”将一组零散的内存块串联起来使用。链表中的每个内存块被称为链表的“结点”,每个结点除了要存储数据外,还需要记录上(下)一个结点的地址。链表特点插入、删除数据效率高,只需要考虑相邻结点的指针改变,不需要搬移数据,时间复杂度是 O(1)。

2021-06-30 11:20:58 115

原创 Linux常用初级指令介绍和使用 && Linux虚拟机和windows间的文件传输方式 && /mnt/hgfs没有出现共享文件夹的解决办法

这里写目录标题/mnt/hgfs没有出现共享文件夹的解决办法:Linux虚拟机和windows间的文件传输方式Linux常用初级指令介绍和使用/mnt/hgfs没有出现共享文件夹的解决办法:sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000Linux虚拟机和windows间的文件传输方式Linux常用初级指令介绍和使用...

2021-06-29 21:50:19 207

原创 14.typedef关键字

typedef关键字作用示例typedef和结构体的配合使用一般结构体结构体指针当结构体成员里面定义了一个[函数指针](https://blog.csdn.net/weixin_46105931/article/details/117904949)时链表作用typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是

2021-06-28 10:31:47 137

原创 13.计算结构体的大小(面试)

计算结构体的大小结构体大小的计算必须满足两条原则:一般的结构体计算结构体的大小并不是将变量所占的字节数相加,而是按照一定的对齐规则进行计算结构体的大小的。优点:按照计算机的访问规则,这种对齐规则提升了效率。缺点:浪费空间。结构体大小的计算必须满足两条原则:结构体每一个成员相对于结构体首地址的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)。结构体的总大小必须是所有成员大小的整数倍(数组成员除外,结构体成员除外)。一般的结构体struct s1{ char a; //第

2021-06-27 19:06:52 270

原创 12.运用结构体指针、函数综合处理学生成绩

结构体指针函数综合处理学生成绩示例如下:注意:示例如下:#include <stdio.h>#include <stdlib.h>#include <string.h>struct Student{ char name[128]; int score; }; struct Student* init(int len){ int i=0; struct Student* p=NULL; p=(struct Student*)malloc(

2021-06-26 20:54:26 611

原创 11.结构体数组

结构体数组结构体数组定义示例注意:结构体数组定义一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗?很明显不可能,这时就要使用数组。结构体中也有数组,称为结构体数组。它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组。或者说同前面介绍的普通数组的定义是

2021-06-26 14:46:30 4910

原创 10.结构体指针

结构体指针结构体指针的定义结构体指针的定义

2021-06-24 13:01:30 134

原创 9.结构体的定义和使用

这里写目录标题结构体的声明结构体的定义结构体的声明关键字struct和结构体名组合成一种类型标识符,其地位如同通常的int、char等类型标识符,其用途就像 int 类型标识符标识整型变量一样可以用来定义结构体变量。定义变量以后,该变量就可以像定义的其他变量一样使用了;成员又称为成员变量,它是结构体所包含的若干个基本的结构类型,必须用“{}”括起来,并且要以分号结束,每个成员应表明具体的数据类型。struct为结构体关键字,Student为结构体的标志,{}内为结构体成员列表,其必须列出其所有成员,以

2021-06-23 12:40:51 416

原创 8.自己实现字符串操作API

自己实现字符串操作APIputsputs在这里插入代码片

2021-06-22 18:12:16 111

stm32 超声波感应开盖垃圾桶.zip

stm32 超声波感应开盖垃圾桶

2021-09-27

空空如也

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

TA关注的人

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