- 博客(76)
- 收藏
- 关注
原创 DSP28335课设:音乐流水灯的设计
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡器、 压电蜂鸣片、 阻抗匹配器及共鸣箱、 外壳等组成。多谐振荡器由晶体管或集成电路构成, 当接通电源后( 1.5~15V 直流工作电压),多谐振荡器起振,输出1.5~5kHZ的音频信号, 阻抗匹配器推动压电蜂鸣片发声。无源蜂鸣器。
2024-06-21 00:47:59
2788
4
原创 DSP28335:实现音乐播放器(定时器1中断)
LED模块并没有用到,这是我之前写其他工程留下来的。起风了(简谱对应的代码如下)晴天简谱对应的代码如下。
2024-06-20 13:48:59
661
2
原创 DSP28335:定时器
TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。
2024-06-20 02:17:56
2027
原创 DSP28335:中断系统
F28335共支持7个外部中断XINT1-XINT7(前面12个是CPU的中断线,),其中XINT1-XINT2只能对GPIO0-GPIO31配置;XINT3-XINT7只对GPIO32-GPIO63配置。XINT13还有一个不可屏蔽的外部中断XNMI共用中断源。每一个外部中断可以被选择为正边沿或负边沿触发,也可以被使能或者禁止(包括XNMI)。可屏蔽中断单元包括一个16位增计数器,该计数器在检测到有效中断边沿时复位为0,同时用来准确记录中断发生的时间。
2024-06-20 01:32:10
2019
原创 DSP28335:独立按键控制LED灯
行列扫描法检测时, 先送一列为低电平, 其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平, 若检测到某一行为低电平(这时我们又确定了行数), 则我们便可确认当前被按下的键是哪一行哪一列的, 用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键, 当有键被按下时便可判断出按下的键是哪一个键。I/O口有上拉电阻,默认GPIO是高电平,当你按下的时候,与GND连接,所以变成了低电平。唯一需要考虑的是,抖动的问题:大部分通过软件进行滤除。
2024-06-17 01:33:17
1094
原创 C语言基础:自定义类型
这些都是内置类型------C语言自己的数据类型复杂对象就不能只有单一的类型,需要我们自定义一些复杂类型——也叫自定义类型比如结构体 枚举 联合体用来描述书 和 人。
2024-06-09 21:31:32
871
原创 C语言基础:字符串函数使用与剖析
这个函数什么意思呢?比如一个字符串为 zpw@bitedu.tech我们要拆分为 zpw bitedu tech 三个字符串,把@和.作为分隔符使用这个函数,就会把@改为\0,同时把z的地址返回来调用一次函数只能切割一次,strtok有某种记忆的功能,他会记住把分隔符变成\0的位置。
2024-06-06 16:25:43
433
原创 C语言基础:字符串函数使用和剖析(2)
常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变,从第一个字符开始比,第一个字符分出大小的话就不用再往下比了,第一个字符相等,再比较第二个字符。字符串是怎么比较的:是比字符串的多少吗?当然不是,比的是字符的ASCII码,此时出现了两个def,第一个位置的d地址被返回,从而打印defabdef。没有const不行,常量字符串是无法更改的,此时p1,p2为常量指针。num的单位是字节,size_t是无符号整形。模拟实现这个函数自己可以做一做。NUL或Null-'\0'
2024-06-05 14:22:27
372
原创 C语言基础:字符函数和字符串函数
统计\0之前的字符的个数: 所以答案是6.注意事项字符串以'\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。注意函数的返回值为size_t,是无符号的( 易错 )=unsigned intint main()elsereturn 0;打印的是str2>str1= '\0')count++;str++;
2024-06-02 16:06:17
663
原创 C语言基础:头歌编程作业
为了完成本关任务,需要定义一个指针变量指向任意一个数组元素,擂主是指针变量指向的数组元素,遍历数组,将每个数组元素依次和指针变量指向的数组元素比较。如果大就将这个数组元素的地址赋给指针变量,否则指针变量的值不变,直至最后一个数组元素,即可得出指针变量指向的数组元素为最大。求最大值的擂台赛算法思想:从数组中任意找一个数组元素作为擂主,默认是最大值,遍历数组,将每个数组元素依次和擂主比较,如果比擂主大就将这个数组元素的值赋给擂主,否则就离开,直至最后一个数组元素,即可得出擂主就是最大值。
2024-06-02 15:29:08
789
原创 c语言基础:指针作业题
scanf函数读取字符串时遇到空格是不会读取的,所以输入的字符串hello world,只会对hello进行逆序。assert函数的作用是判断指针不为空指针,条件成立往下执行,不成立显示报错。想要有空格的换一个函数,用gets函数(读取一行)可以读取空格。写一个函数,判断一个字符串是否为另一个字符串旋转之后的字符串。给定s1=AABCD s2=BCDAA, 返回1;给定s1=abcd, s2=ACBD,返回0;例如:是旋转得来的,返回1,不是,返回0.实现一个函数,可以左旋字符串中的k个字符。
2024-05-31 11:22:07
423
原创 c语言基础:指针笔试题
第二个分析结果是错的,错误原因很明显,数组名是首元素地址,但是二维数组的首元素地址并不是第一行第一列元素的地址,而是第一行元素的地址,加1即跳到第二行,得到第二行元素的地址,解引用即得到第二行元素,得到第二行数组名,即第二行的首元素地址,指向6,减一,指向5,cpp[-2]=*(cpp-2) 我的疑问:*[]加在一起可以抵消掉吗?第一个分析结果是对的,ptr1的指向确实是对的,强制类型转换的原因也在于因为二维数组的指针类型是数组指针,强制转换为int 型的指针,所以加一减一即跳过有4个字节大小。
2024-05-30 00:00:00
276
原创 c语言基础:数组的运用以及在内存中的地址的理解
为啥错了当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。所以接收的是指针,指针的大小是4个字节,4/4=1,sz大小是1.我们指针数组名就是首元素地址,毫无疑问,传参的时候arr传过去就是首元素地址,只是为了便于理解,我们说把数组传过去了,数组传过去了,我们拿一个数组接收,所以我们的形参写的是int arr[];但是,实际上我们写的规范一点应该写一个指针去接收,正确的冒泡排序:(在主函数算出sz,再传给形参。
2024-05-27 14:32:46
957
原创 C语言基础:数组
数组是一组相同类型元素的集合。//type_t 是指数组的元素类型//const_n 是一个常量表达式,用来指定数组的大小常见错误:因为const_n 是一个常量表达式,不能是变量。
2024-05-26 15:40:11
734
原创 C语言基础:数组在内存存储的大小(sizeof,strlen求大小)
会报错, &arr-数组的地址,按理说存在数组指针里面 char(*p)[7]=&arr;元素类型为char(*)[7];而strlen接收的类型是 const char *,有所冲突。16 第二行的数组名,计算的是第二行的数组大小(错误)strlen 求字符串长度的函数,遇到\0结束。
2024-05-20 16:32:36
526
原创 C语言基础:指针详解
实现计算器:下面是一般写法:(即通过各种各样的函数来一一实现)缺点是很明显的:比如增加计算器功能,就得多写几个函数,同时在选择结构上多加了很多行代码。下面是通过函数指针数组来实现 ,什么是函数指针数组:肯定是数组:数组的元素是函数指针,记住:&add和add都表示函数的地址,没有任何区别。
2024-05-19 21:51:46
881
原创 C语言详解:数组指针
解释一下,arr是指针数组,五个元素是指针,&arr之后,拿到的是数组的地址,所以要用指针数组,但是数组的类型是什么呢?是char*,为啥呢,比如int arr【5】,arr 5个元素是int 型,而我arr的元素是char*的类型。arr是数组名,即首元素地址,我们知道,二维数组可以看成一维数组,所以二维数组的首元素地址不是第一行第一列的元素的地址,而是第一行元素的地址。parr3首先与【】结合,说明是数组,数组的类型是int(*)【5】,就是我们本节学的指针数组,其实表示方式还是有很多种的,
2024-05-15 15:38:43
469
原创 C语言基础:初识指针(二)
当你不知道指针变量初始化什么时,可以初始化为空指针我们看NULL的定义,可以看出NULL是0被强制转化为Void* 类型的0;实质还是个0;如何避免野指针:1.指针初始化2.小心指针越界3.指针指向空间释放即使置NULL4.避免返回局部变量的地址5.指针使用之前检查有效性。
2024-04-26 11:15:00
403
原创 C语言学习:初识指针(一)
与其给出指针的定义,看完让人模糊不清,不如给出下面几个通俗易懂的要点。指针理解的2个要点:1.指针是内存中一个最小单元的编号,也就是地址2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量这两句话引出新的概念,什么是内存呢内存是什么?内存是用于暂时存储CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。可以比作一个房间,用来存储数据的载体。下图所示,我们把内存分成一个个小格子之后,我们给它一个个编号,这个编号就是一个地址,那我们会想两个问题编号是如何产生的呢?
2024-04-21 20:06:46
1081
原创 C#基础:类,对象,类成员简介(第四节课)
类是对现实世界事物进行抽象所得到的结果事物包括“物质”(实体)与“运动” (逻辑)建模是一个去伪存真,由表及里的过程。
2024-04-07 22:02:00
1238
原创 C#学习:初始类与名称空间
比如我们有了1000个类,我们把1000个类搁在一起,你想使用其中一个类时,你会发现找起来很麻烦,那这就相当于你有1000本书,你把1000本书堆在屋子里,没有分门别类,那你想再去找一本书时那就比较麻烦了。名称空间就是把类用良好的结构组织在一起。起这样的一个作用。
2024-04-07 16:05:55
1137
原创 C语言项目:数组与函数实践:扫雷游戏
1.如果位置不是雷,就显示周围有几个雷2.如果位置是雷,就炸死结束游戏3.把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束。
2024-03-17 13:00:48
787
原创 32单片机基础:输入捕获测频率
在PWM模块中,执行的逻辑是,初始化TIM2的通道1,产生一个PWM波形,输出引脚是PA0,通过SetCompare1的函数,可以调节CCR1寄存器的值,从而控制PWM的占空比。分别读取四个通道的CCR,这四个函数和上面的SetCompare1,2,3,4是对应的,读写的都是CCR寄存器,输出比较模式下,CCR是只写的,要用SetCompare写入,输入捕获模式下,CCR是只读的,要用GetCapture读出,第五步:选择从模式的触发源,触发源选择为TI1FP1,这里调用一个库函数,给一个参数就OK了。
2024-03-07 12:35:29
1070
原创 32单片机基础:TIM输入捕获
这样与测周法的操作步骤是一样的,上升沿用于触发输入捕获,CNT用于计数计时,每来一个上升沿,取一下CNT的值,自动存在CCR里,CCR捕获得到的值,就是计数值N,CNT的驱动时钟,就是fc,fc/N就得到了待测信号的频率,另外还有个细节问题,就是每次捕获之后,我们都要把CNT清零一下,这样下次上升沿再捕获时,取出的CNT才是两个上升沿的时间间隔。触发源,就是选择从模式的触发信号源的,触发源选择,选择指定的一个信号,得到TRGI,TRGI去触发从模式,从模式可以选择一项操作来自动执行。这就与中界频率有关了。
2024-03-05 16:29:50
1170
原创 通信原理:通信的基本概念(第一节课)
我们先看一个调幅AM无线广播系统我们信号举个例子:可以看出,我们研究的参量不一样,对应的模拟和数字信号也会与我们看上去的不同。
2024-03-03 23:54:14
522
原创 32单片机基础:PWM驱动舵机,直流电机
接线图如上图所示。注意,舵机的5V 线不能接到面包板上的正极,面包板上的正极只有3.3V,是STM32提供的,所以要接到STLINK的5V,我们如何驱动舵机呢?由之前我们介绍原理知道,要输出如下图对应的PWM波形才行,只要你的波形能按照这个规定,准确的输出,就能驱动。
2024-03-03 18:44:10
2132
原创 PWM驱动呼吸灯
这些其他外设也是同理,比如我们要是有SPI的MISO引脚,那就是PA6,如果要I2C2的SCL引脚,那就是PB10,这个关系是定死的,不能任意更改。这些函数就是用来单独设置输出比较的极性的,带个N的就是高级定时器里的互补通道的配置,OC4没有互补通道,所以没有OC4N的函数,那这里可以设置极性,在结构体初始化的那个函数也可以设置极性,这两个设置极性的作用是一样的,结构体初始化只不过是用结构体一起初始化的,而在这里是一个单独的函数进行修改的,一般来说,结构体里的参数,都会有一个单独的函数可以进行修改的。
2024-03-03 13:39:30
1615
原创 C#学习:初识各类应用程序
Solution是针对客户需求的总的解决方案,举例:汽车经销商需要一套销售软件,然后能够帮他宣传自己的这个商品然后能够帮他宣传自己的这个商店,让大家了解到他卖的哪些汽车。汽车经销商不懂软件,你懂软件,所以他来找你,你为了解决他的这个需求,那你要向他提供一些完整的这个解决方案,这就是Solution.console lication,控制台,人机交互窗口,这样的程序没有界面,就是靠命令与用户去交互,一般都是有一定计算机操作水平的人来使用的。2.要能就跟着操作,一遍一遍的练习,为的是熟悉手里的工具,培养感觉。
2024-02-29 15:29:46
1409
原创 32单片机基础:TIM输出比较
为了理解方便,置有效电平就是置高电平,置无效电平就是置低电平这三个模式都是当CNT与CRR值相等时,执行操作,这些模式就可以用做波形输出了,比如相等时电平翻转这个模式,这个可以方便的输出一个频率可调,占空比始终为50%的PWM波形,比如你设置CCR为0时,那当CNT每次清零时,就会产生一次CNT =CCR的事件,这就会导致输出电平翻转一次,每更新两次,输出为一个周期。LED不会立马熄灭,而是有一定的惯性,过一段时间才会熄灭,电机也是,当电机断电时,电机的转动不会立马停止,而是有一定的惯性,过一会才停。
2024-02-29 13:45:47
1228
原创 32单片机基础:定时器定时中断&定时器外部时钟
第一步:RCC开启时钟,这个基本上没=每个代码都是第一步,在这里打开时钟后,定时器的基准时钟和整个外设的工作时钟就会同时打开了。下图是定时器框架的所有结构,我们只需要把这里面的每个模块都打通,就可以让定时器工作了,第三步:配置时基单元,包括预分频器,自动重装器,计数模式等,这些参数用结构体配置。第五步:配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。第二步:选择时基单元的时钟源,对于定时中断,我们就选择内部时钟源。当计数器使能后,计数器开始计数了,当计数器更新时,触发中断。
2024-02-29 00:55:00
1655
原创 32单片机基础:TIM定时中断
定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候,那它在这个基准时钟进行计数的过程,实际上就是计时的过程。比如在STM32中,定时器的基准时钟一般是主频72MHz,如果我对72MHz计72个数,那就是1MHz也就是1us的时间,如果计72000个数,那就是1KHz也就是1ms的时间。计数器就是用来执行计数定时的一个寄存器,每来一个时钟,计数器加1,预分频器,可以对计数器的时钟进行分频,让这个计数更加灵活。自动重装寄存器就是计数的目标值,就是我们想要计多少个时钟申请中断。
2024-02-27 00:22:01
1850
原创 32单片机基础:旋转编码器计次
如果把一相的下降沿用作触发中断,在中断时刻读取另一相的电平,正转时B就是高电平,反转是B就是低电平,这样就能区别旋转方向了。只不过这样在操作上有一些小瑕疵,比如你正转的时候,由于A相先出现下降沿,所以你刚开始动,就进中断了,而反转时是A相后出现下降沿,所以就是你转到位了,才进行中断。所以打算A,B都触发中断,只有在B相下降沿和A相低电平时,才判断为正转,在A相下降沿和B相为低电平时,才判断为反转。这样保证正转和反转都转到位了,才执行数字加减的操作,同时可以演示两个初始化代码。
2024-02-25 00:44:45
920
原创 32单片机基础:对射式红外传感器计次
接线如下图:在HardWare建立两个文件:如图如何配置外部中断,根据下面图,我们需要把外部中断从GPIO到NVIC这一路出现的外设模块都配置好。把这条信号打通就OK了。1.配置RCC:把我们这里涉及的外设时钟都打开,不打开时钟,外设是没法工作的2.配置GPIO,选择我们的端口为输入模式3.配置AFIO,选择我们用的这一路的GPIO,连接到后面的EXTI4.配置EXTI,选择边沿触发方式,比如上升沿,下降沿,或者双边沿,选择触发响应方式,可以选择中断响应和事件响应,
2024-02-24 23:37:23
1845
原创 32单片机基础:EXTI外部中断
触发信号通过或门后,就兵分两路,上一路是触发中断的,下一路是触发事件的,触发中断会置一个挂起寄存器,这相当于是一个中断标志位,我们可以读取这个寄存器判断是哪一个通道触发的中断如果挂起寄存器置1,它就继续往左走,和中断屏蔽寄存器共同进入一个与门,然后至NVIC中断控制器,这里的与门实际就是开关的作用,因为1与上任意的数x,等于这个任意的数x,0与上任意的数x,都等于0.这就相当于,中断屏蔽器给1,另一个输入就是直接输出,也就是允许中断。画一个斜线写在20,表示的是,就是20根线,代表20个通道。
2024-02-24 12:09:25
1741
原创 32单片机基础:OLED调试工具的使用
根据上述接线图,PB6,PB7为0或1,因为OLED要接0和1, 正好影响到了,不过这个也是没关系的,我们直接不初始化这两个引脚就行了,如果STM32的引脚上电后,如果不初始化,默认是浮空输入模式。这里存的是OLED的字库数据,因为OLED显示屏是不带字库的,想要显示字符图形还要先定义字符的点阵数据,下面就是这些字符的点阵数据,也就是字库。比如让你学习C语言,但是不允许使用printf这个打印函数,那你想一下,C语言是不是根本没法学,同样,给你一个单片机,但是没有任何显示参数的东西,那你也没法学单片机。
2024-02-21 19:13:10
2253
原创 32单片机基础:GPIO输入
两种方式,我们一般用下接的方式。第一个图:注意点。当按键按下,PA0接地,被置为低电平, 但是一旦按键松手,PA0悬空,引脚电压不确定。所以无论怎么读引脚也不知道知否被按下,所以为了解决这个问题,所以必须要求PA0是上拉输入的模式,这样引脚悬空的话,就会被置为高电平,这样我们我们就可以读取PA0的电压就知道按键是否被按下。但是第二个图就不会出现问题,按下时,被置为低电平,松手,由于上拉电阻的作用,被置为高电平。这样引脚就不会出现浮空状态。所以此时PA0可以配置浮空输入和上拉输入。
2024-02-21 17:12:29
3738
原创 32单片机基础:GPIO输出
下面都是理论知识,可以稍微看一看,GPIO的基本结构:GPIO位结构:电路图说明:保护二极管:IO 引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于 VDD 时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输
2024-02-20 23:44:56
3046
原创 STM32入门教程:新建工程
可以看出这种方式需要不断查手册来了解每一个寄存器的每一位是用来干啥的,而且这个操作方式也有一个弊端,就是我们除了PC13之外的位都配置了0,这样就会影响到其他端口的原有配置,如果我们要做到只配置PC13而不影响其他位,需要&=和|=的操作,所以寄存器的操作方式,代码简单,不太方便操作。STM32的开发方式有:基于寄存器的方式,基于标准库也就是库函数的方式,基于HAL库的方式,基于寄存器的方式与使用51单片机一样,是程序直接配置寄存器。下面工程就是建好了,但是这里工程文件空空如也,这个工程还是不能直接用的。
2024-02-20 02:58:41
887
原创 51单片机编程应用(C语言):DS1302实时时钟
CE,I/O,SCLK,是我们主要操作的引脚,我们操作这三个引脚把芯片内部的时钟读出来。这个协议就规定,在时钟上升沿的时候,I/O的数据将会被写入,在时钟下降沿,DS1302就会把自己的数据输出。在哪就是我们要操作哪一个寄存器,这么多寄存器,每个寄存器是有地址的,类似于房间的门牌号。写入数据还是读出数据,所以就有了上面的控制寄存器。当然,上面只是RTC的寄存器,还有很多其他的寄存器,只是我们只要操作时钟,这些寄存器就够了。的下降沿就把数据发出来,如果是写,就在每个时钟的上升沿把数据写进去,
2024-02-18 02:21:10
1617
原创 51单片机编程基础(C语言):LED点阵屏
类似于数码管,要用到肉眼视觉效应。扫描,才能把每一个LED都能选中,从而显示我们想要的图形,否则, 只能一次点亮一个LED,
2024-02-14 22:22:10
1505
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人