- 博客(26)
- 收藏
- 关注
原创 位置式PID——小车类学习心得
err变量=期望值-实际值,也就是我们常说的误差err_last变量=上一次的误差err_sum变量=误差的累加现在总结一下位置式PID算法中 P,I,D三个参数的作用以及含义P变量:中文名字是比例调节,个人浅显理解是加入这个变量可以使实际值更快的到达你设定的期望值,P的比例越大达到期望值的时间就越短,但是P不是越大越好,如果P过大,确实会让实际值更快的达到期望值,但是伴随而来的问题也很大,首先:1.会让系统更加不稳定,会出现大幅度振荡,会让你的实际值在期望值这个范围内振荡,你们想想,达到速度越快出现误
2022-07-02 15:03:02
1674
1
原创 STM32通用定时器的个人总结
STM32104ZET6系列的芯片中,定时器一共有一下三种分类:高级定时器,通用定时器,基本定时器。这里主要讲一下通用定时器,首先,计数器模式一共有三种,分别为向上,向下或向上向下计数,其中:向上计数的通俗意思就是,计数器从0开始计数,一直加到重装载值,然后产生一个溢出事件,然后又从0开始计数,如此往复。向下计数跟向上计数是一个意思,就是过程反过来了,他先从重装载值开始计数到0;向上向下计数又称中央对齐计数:计数器从0开始计数到重装载值,产生一个溢出事件,然后又从重装载值开始递减到0,又产生一个
2022-01-25 21:04:50
6289
2
原创 STM32串口通信
串行通信是一种很常用的通信方式,串行通信的原理是按数据位顺序传输,优点是占用资源少,缺点是传输速度慢。串行通信一共有三种工作模式,分别为,单工、半双工、全双工。单工的工作模式是只能往一个方向传输数据。半双工工作模式可以双向传输数据,但是只有一条传输数据线,在某一时刻只能往一个方向传输数据,实际上他也是一个特殊的单工传输。全双工工作模式可以同时双向传输数据,他有两条数据线,因此可以同时双向传输数据。而我们常说的串口通信就是一种串行异步通信,单总线也是一种串行异步通信,串行同步通信的有IIC总线,S
2022-01-15 20:58:34
3337
原创 NVIC中断优先级的管理个人总结
在STM32的103系列的单片机中,一共有16个内核中断和60个可屏蔽外部中断,相比于51单片机的中断数量多出了很多个,那么怎么样来管理这么多个中断呢,这是就要用到NVIC中断优先级的管理了,103系列的32单片机在管理中断上采用了分组管理的措施,一共可以分成4个组别,同时给每个中断设置一个抢占优先级跟响应优先级。我们来说说抢占优先级跟响应优先级啊,其实很简单抢占优先级高的中断有先执行的特权,并且还可以打断其他低抢占优先级中断的执行,如果抢占优先级一样的话就看响应优先级谁高谁先执行。放图:而且一
2022-01-12 21:26:34
226
原创 STM32中IO口的端口复用个人总结
在资源丰富的32系统中,有着许多的外设,所以IO口的使用就很紧张,端口复用的大概意思就是:同一个IO口存在多个外设,比如在PA9,PA10这两个IO就可以当成普通的IO口用,同时也可以当作串口1的输入输出端口,只需要使能串口1时钟总线即可把PA9,PA10复用为串口,不在是普通的IO口。...
2022-01-12 21:14:54
2496
原创 STM32滴答定时器的观后感
STM32CM3/CM4滴答定时器个人总结观看完正点原子的滴答定时器之后,我了解到了Systick定时器是一个简单的定时器,并且对于CM3/CM4内核的芯片上都会有Systick定时器。而且Systick滴答定时器是一个24位的倒数计数定时器,而且每当计数到0时,就从LOAD寄存器中重装值到VAL当前值寄存器减减,每当VAL寄存器的数字减到0之后,会把CTRL寄存器中的第17位(位段16)的数置为1,而且每当你读取CTRL寄存器中的第17位之后,他将会自动置为0。Systick滴答定时器常用的3个寄存
2022-01-10 11:08:09
387
原创 I2C总线的EEPROM24C02按页操作
直接进入正题,我们先来分析一下,24C02的按页写时许与注意事项:注意事项:首先你要确认你的24C02器件一次按页写入能够写多少个字节,这个建议去查看官方数据手册,这里为例的是一次只能读取8字节的24C02页写操作的启动与单字节写一样是:启动总线-器件寻址-子器件寻址-写入数据-停止信号!当然应答信号不要忘记给哦,谁接收谁应答!!在按页写之前要考虑好器件的内存空间和一次最多能够读取多少个字节,要不然可能会擦写掉你之前写入的数据,因为一旦发送的字节超出了范围,那么器件的地址计数器就会自动翻转,简单来说
2021-11-13 23:27:39
3417
2
原创 蓝桥杯:完全平方数
#include <stdio.h>#include <math.h>#define X 1000000000000long long f(long long num, long i){ int a, b; b = num*i;//将两个数相乘得到平方数 a = sqrt(b);//然后使用sqrt函数开平方 if (a*a == b)//上一句得到的值的平方如果相乘等于b的话就说明主函数的b就是我们要找的最小正整数 { return 1; } ret.
2021-05-14 18:43:58
1145
2
原创 1016 部分A+B (15分)
思路:计算每个指定数字出现的次数并记录下来,然后传函数计算并返回结果。#include <stdio.h>#include <math.h>int fannum(int k, int sum1);int fank(int shu1, int sum1);int main(void){ int shu1, shu2; int sum1, sum2; int num,num1; scanf("%d %d %d %d", &shu1, &sum1, &.
2020-09-15 12:25:32
77
原创 用宏函数编写PTA的1011 A+B 和 C (15分)
需要注意题目中所给数据范围是[-2 31,2 31],而int型的数据范围是[-2 31,2 31-1],最大值超过int型数据的范围,并且两个int型数据相加也可能超过int型,因此在本题中需使用long long 作为ABC的数据类型。题目描述:给定区间 [−2 31,2 31] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。输入格式:输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔
2020-09-02 17:58:53
288
原创 PAT1009 说反话 (20分)
**1009 说反话 (20分)**给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。输出格式:每个测试用例的输出占一行,输出倒序后的句子。输入样例:Hello World Here I Come输出样例:Come I H...
2020-09-01 10:32:13
298
原创 C语言1007 素数对猜想 (20分)
1007 素数对猜想 (20 分)让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。输入格式:输入在一行给出正整数N。输出格式:在一行中输出不超过N的满足猜想的素数对的个数。输入样例:20输出样例:4思路:第一步,先找到正整数N以内的全部素数,并用一
2020-08-29 19:47:37
474
原创 PAT C语言1005 继续(3n+1)猜想 (25分)
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖
2020-08-29 10:18:49
177
1
原创 C语言PAT1004 成绩排名 (20分)
1004 成绩排名 (20分)读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含 1 个测试用例,格式为第 1 行:正整数 n第 2 行:第 1 个学生的姓名 学号 成绩第 3 行:第 2 个学生的姓名 学号 成绩… … …第 n+1 行:第 n 个学生的姓名 学号 成绩其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。输出格式:
2020-08-28 18:55:57
479
原创 C语言中的变参宏:(...)与__VA_ARGS__怎么使用
宏是通过预处理器在程序运行前执行的,宏由三个部分组成,第一部分是#define预处理指令,第二部分是选定的缩写,也称为宏,第三部分称为替换体,或替换列表:#define(预处理指令) MAX(选定的缩写) 5(替换体),宏的起名规则跟其他变量的规则一样,由数字,字符,下划线组成,其中不能首字符不能是数字,宏分为两大类,一类是类对象宏,一类是类函数宏,好了,宏的基本知识讲到这里就结束先了,现在我们来讲讲变参宏的使用,我们先给出一个声明:#define MAX(X,…) printf(" HELLO x=
2020-08-19 10:06:08
566
原创 C语言怎么样将十进制转换成二进制
观察以下代码:`我用到的主要知识点有:字符串,位操作。有不懂的可以在评论区评论我会解答你们的`#include <stdio.h>#include <limits.h>#define MASK 01 //这个明示常量的二进制是00000001`char * itob(char * st, int n);int main(void){ int conut1, conut2; int num; char st[CHAR_BIT*sizeof(
2020-08-15 18:28:07
1335
原创 怎么样编写一个扑克牌发牌函数
先定义一个结构体,里面的成员有存储花色和牌面的数组,然后在主函数里面声明一个结构体数组p大小为52,用来存储花色跟牌面,还有一个的整型数组arc大小也是52,用来存储牌面跟花色的顺序。1.void baoc(CHUC p[])函数:首先先编写一个void baoc(CHUC p[])函数,这个函数用来保存52张扑克牌,这个函数里面用了两个数组指针来分别保存花色与牌面,如果把52张扑克牌按1到52的牌面顺序来排序,那么strcpy函数里面的(i/13)的意思是i<13的相除都是0那么就可以把存储花色的
2020-08-06 21:18:49
885
1
原创 C语言fwrite函数
fwrite函数的原型是**size_t fwrite(const void *p,size_t SIZE,size_t count,FILE *fp);**处存在stdio.h头文件中第一个参数是一个指针,或者数组地址。第二个参数SIZE是这个指针或者数组单个存储单元的大小。第三个参数是从数组或者指针中写入到文件中的字符个数。第四个参数是文件指针。函数的返回值是从数组或者指针存储到文件的字符个数,正常运行的返回值一般是count,总而言之当你想把一些字符存储到文件中时,就可以考虑使用这个函数。
2020-08-06 20:48:28
6515
原创 C语言怎么样从文件中读取特定的一行字符
让我们从一道例题来分析,分析我都写在注释里面了。例:编写一个程序,以一个字符和任意文件名作为命令行参数。然后输入字符所在的整行内容。(此题目是我为了讲解而自己想的,若有不足之处请多指教)代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>//这个函数的返回值用来作为主函数中if语句是否输出int has_ch(char ch, const char *line);int main(int
2020-08-01 21:58:47
5616
原创 fgets函数的使用
fgets函数的函数原型:char *fgets(char * ch,int mode,FILE *fp);第一个参数ch是一个字符数组;第二个参数mode表示这个数组需要读取多少个字符;第三个参数fp表示一个文件指针;fgets函数可以在读取(mode-1)个字符后就结束,或读取到换行符后结束,再或者读到文件结尾后结束;例子:char ch[10]; int mode=10;(假设fp已经分配好了)fgets(ch,10,fp);这个函数表示从fp这个文件指针中读取10个字符第一种情况:当
2020-07-29 21:49:07
15940
原创 fread函数的使用
fread函数的原型是:size_t fread(void * ch,size_t mode,size_t number,FILE *fp)。第一个参数是数组的地址;第二个参数是数据类型的大小;第三个参数是需要读取多少个这样的数据类型;第四个参数是文件指针。该函数正常情况下返回的值是number,这表示读取了多少个数据。例子:double ret[10];(其中有一个文件指针名为fp)fread(ret,sizeof(double),10,fp);这个例子表示fread函数将要从fp文件指针中
2020-07-28 22:50:57
4392
原创 malloc函数的注意事项
malloc函数定义在#include <stdlib.h>的头文件中,函数原型的void *malloc(unsigned int ret)类型如果申请不成功就会返回NULL,void * 是一种不指定指向的指针,可以是任意的指针,但是得强制转换类型,如 :以下代码片段int *p;p=(int *)malloc(4);malloc函数一般是跟free()函数结合使用,因为malloc函数是在堆里面寻找的内存,这是由我们程序员自己管理的内存,所以使用之后要记得用free()函数释放内存
2020-06-24 22:21:08
724
原创 函数strlen的使用
函数strlen是C语言的提供的函数,它包含在#include <string.h>这个头文件中,strlen函数接受的实参是一个字符串数组,返回值是字符串数组的长度,不包括空字符在内,返回的值是一个int类型的整数值。...
2020-06-01 23:33:39
12495
原创 ## 数组跟指针的关系
数组跟指针的关系先简单说一下指针和数组的基本概念指针是一个变量,声明形式为 int * p,其中 * 号是一个解引用符,变量p储存的是一个地址。数组是一个多个同类型元素的集合体,例如声明一个数组int * a[4]数组,数组名a是一个地址,这个地址跟&a[0]是等价的,也就是数组表示的是第一个数组元素的地址。指针跟数组的关系以下文章都以两个变量展开说明int * p,int a[4]第一:我们先以地址的形式来理解他们的关系,当指针得到了数组的首地址之后,就可以把指针跟数组一样使用了,因
2020-06-01 19:55:21
86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人