- 博客(78)
- 收藏
- 关注
原创 ESP8266简单介绍
CIFSR:STAIP,"192.168.1.105" //结果。+CIFSR:STAMAC,"84:f3:eb:4e:bd:7a" //结果。AT+CWJAP="TP-LINK_408","xingzhilou408" //指令。AT+CIPMODE=1 //开器透传模式。AT+CWMOOE=1 //设置其为STA模式。
2025-04-18 19:59:32
368
原创 蓝牙遥控插座项目
其中核心代码为此中断服务函数 获取的数据主要存储在uart2_rx_buf中 strstr函数是一个用于查找子字符串的库函数。这个函数在一个字符串(haystack)中搜索另一个字符串(needle)的第一次出现,并返回一个指向该位置的指针。如果没有找到匹配的子字符串,则返回NULL。通过手机端发送on off 就可以实现控制继电器开关。因此在这里用于查找是否为on off。以下为手机端HC蓝牙助手截图。
2025-04-18 15:49:14
115
原创 蓝牙的AT指令
不区分大小写,均以回车、换行结尾,部分 AT 指令需要对模块 34 脚 PIO11 一直置高电平才有效。与手机连接后(最好使用安卓手机app HC蓝牙调试助手) 串口调试助手就能和手机实现信息互联。在没有与手机连接时 串口数据接收如下。
2025-04-17 14:57:45
177
原创 HC-08蓝牙模块介绍
上面的「连接」是指模块通过蓝牙协议连接上主机或从机,并非物理意义上的连接。HC-08 蓝牙模块是通过串口与单片机进行通信,这个模块既可以作为主机也可以作为从机(通过 AT 指令配置)。注意,在硬件接线的时候蓝牙模块的 TXD 要和单片机的 RXD 相连接,蓝牙模块的 RXD 要和单片机的 TXD 相连接,也就是所谓的「交叉接线」。• VCC:输入 3.2~6V 的电源(注意,上面一层邮票口的模块不能接 5V 的电源,需要底板降压至 3.3V);当按键按下后,主机将清除已被记录的从机地址。
2025-04-16 20:57:52
205
原创 串口通信及框图
采用差分电平,逻辑1:两线间的电压差为+(0.2-6)v 逻辑0:两线间的电压差为-(0.2-6)v。串口通信的接口类型包括TTL、CMOS、RS-232和RS-485等,他们分别代表了不同的电平水平。逻辑1:-3v---- -15v 逻辑0:+3v-----+15v。逻辑1:供电电压的最大值 逻辑0:0v。逻辑1:5v 逻辑0:0v。
2025-03-10 16:14:54
139
原创 串口简单讲解
例如,当系统以每秒50个二进制符号传输时,信息速率为50bit/s,信号速率也为50Bd(波特)。或者表示信号调制过程中,单位时间内调制信号波形的变换次数,通常用RB表示,单位是波特(Bd或Baud,前者规范)。如果1码元的时间长短为200ms,则每秒可传输5个码元,那么码元速率(波特率)就是5Bd。异步通信:双方不需要严格的时钟同步,,每个数据块之间通过特定的起始位和停止位进行分隔,接受方可以独立地识别每个数据块。,通常用Rb表示,其单位是比特/秒(bit/s或b/s,英文缩略语为bps)。
2025-01-06 10:38:22
199
原创 WWDG窗口看门狗实验
喂狗环节 不能主函数中while进行 因为必须要注意复位的条件 (延时时间注意)以下为wwdg.c文件。按照如下流程进行编程。
2024-12-23 20:38:07
196
原创 WWDG窗口开门狗
寄存器(WWDG_CFR)储存的是 W[6:0]的值 寄存器(WWDG_CR)储存的是T[6:0]的值 经过比较 当T[6:0]>W[6:0]时 置1 经过与门 后复位置1 达到最终目的。窗口看门狗通常用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障,会在满足一定条件的情况下 进行复位动作。产生复位的条件 ① 当递减计数器的值小于0x40(若看门狗被启动)则产生复位动作。(可超时的时间范围是T[5:0]:在0X40-W[6:0]之间)用于设置 预分频器2。
2024-12-23 18:49:36
287
原创 独立开门狗 IWDG
IWDG本质上是一个12位的递减计数器 当计数器的值从某个初始值开始递减 并一直减到0时,系统会产生一个复位信号(IWDG_RESET)CPU在接收到这个复位信号后 会重新启动系统 以确保系统从可能的错误或死锁状态下恢复。他使用专门的低速时钟(LSI)作为时钟源 及时在主时钟发生故障时,IWDG可以在停止模式和待机模式下工作,确保在这些模式下系统仍然受到保护。在计数器的值见到0之前,如果程序通过特定的“喂狗”操作(或重置计数器的值)来刷新计数器 那么就不会产生复位信号 系统将继续正常运行。
2024-12-23 15:43:03
146
原创 感应开关垃圾桶
在主函数中定义开启垃圾桶的函数(在这个函数中 当超声波传感器一直检测到 那么就会一直执行打开垃圾桶的指令 因此为了避免这种情况 可以加入判断条件 if(dustbin_status == CLOSE) 如果一直处于开启状态 那么就不能执行) 关闭垃圾桶的函数。还要注意在while循环中 一定要适当延时 从而使系统正常执行。首先将感应开关垃圾桶所需要的模块 加入到程序当中。
2024-12-21 14:49:03
221
原创 超声波传感器
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) //无需调用自动执行 HAL_TIM_Base_Init()被调用后自动调用。
2024-12-20 19:20:19
526
原创 SF90舵机介绍
通过在sg90.c文件中 写sg90_angle_set(uint16_t angle)的函数来实现角度与ccr值的转换。在Tout(定时器溢出时间)=20 ms arr=200 psc=7200 条件下 每计一个数的时间为0.1ms。则在此条件下 0—180 ° 计数5—25 存在线性关系。下面为sg90.c文件代码。
2024-12-20 10:16:06
145
原创 测量按键按下时间
在此回调函数中 HAL_TIM_IC_CaptureCallback() 一定要注意设置succeed_flag标志位 这样当一次捕获下降沿 一次捕获上升沿后 succeed_flag 置1 激发另一个if条件语句即pressed_time_get 函数 从而计算按键按下时间 结束后一定要用memset(&capture_status, 0, sizeof(capture_status));来清除结构体当中的值 从而为下一次再次捕获做准备。如图回顾一下上面的测量案件按下时间原理图。
2024-12-17 14:11:17
313
原创 捕获上升沿和下降沿
当进入按键中断时,首先检测下降沿,此时falling_flag为0 故进入else printf函数输出下降沿 置falling_flag 为1 清空通道 设置检测上升沿。当松开时 falling_flag为1 进入if语句 输出捕获到上升沿 清空通道 设置为下降沿检测 最后一定要将结构体中的所有都清空 这样就回到了最开始的状态。流程图如上 但过于繁琐 有很大程度的冗余。
2024-12-16 16:36:52
278
原创 实现按键按下(低电平)检测到下降沿
中断服务函数,定时器2中断TIM2_IRQHandler(void) 要包含公共服务函数HAL_TIM_IRQHandler(&ic_handle)HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2) //输入通道配置。
2024-12-13 16:10:13
634
原创 串口调试功能
在keil中的设置,在主函数中 加入#include '' uart1.h'' 在main中初始化uart1_init(115200);// 115200为波特率 必须和串口调试中的波特率相同 要加printf("hello world!// 其中\r\n 为回车换行符 在魔法棒中 要勾选。在串口调试助手中,串口选择可以通过拔下CH340来得知串口位置。
2024-12-13 13:24:52
180
原创 通用定时器之输入捕获功能
计算低电平的时间: 首先检测下降沿 在检测到下降沿后 cnt重新开始计数 在低电平期间有n次溢出 然后检测上升沿 计算剩下的ccr值 最终计算总的计时器计数的个数 N*(ARR+1)+CCRx 最后再根据一次计数的时间来进行计算。
2024-12-13 13:10:33
132
原创 呼吸灯调节pwm占空比实验——我快呼吸不上来了
在代码中由于cnt从0增长到500 这是由硬件控制的 因此cnt的增长速度总是比ccr的增长速度要快的多 下面以具体数值举例比较过程。修改设定CCR寄存器的值(通过修改CCR的值来改变占空比) 在这里选定的是向上计数 PWM1的模式 选择低电平为有效电平 (cnt=1 ccr=1 cnt=ccr 高电平 灭 循环二 低电平在一个周期内占比少 但有亮。cnt=398 ccr=0 cnt>ccr 高电平占空比基本为1 灭的状态。
2024-12-12 17:40:45
523
原创 PWM波形
PWM波形 是一种占空比可变的脉冲波形,这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。也就是说,PWM波形中的高电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字编码。分频率 = 占空比变化步距 (50.1%-50%)步距为0.1%占空比 =Ton /Ts 即高电平持续时间和总的时间之比。频率 = 1/Ts 周期的倒数。以下为定时器输出PWM波配置步骤。
2024-12-11 19:46:28
394
原创 定时器的中断流程
首先是定时器的初始化函数 在这个函数中应包含时基工作参数配置(HAL_TIM_Base_Init())和 管控使能更新中断 启动计时器的(HAL_TIM_BASE_START_IT() )并且传入的都是&timer_handle 只需包含Instance 和 Init 两个 而在init中又包含4个 Period ControlMode Prescaler AutoReloadPeriod 四个。在主函数中,只需调用timer_init(5000-1,7200-1);以下为timer.c。
2024-12-09 14:13:20
111
原创 定时器的介绍
Ft为默认的72M PSC为分频数 ARR为计数值 Tout为溢出时间(一般自定)Ft/(PSC+1)为频率 故(PSC+1)/Ft为每个数计时的时间 总共需要计(ARR+1)个数,因为要溢出所以要加1。下面为定时器的计数模式:有三种方式 向上计数 向下计数 中心对齐计数。定时器包含三种 高级定时器 通用定时器 基本定时器。下面主要讲解通用计时器。
2024-12-09 11:19:25
225
原创 第二个项目完结——排队控制系统
/这个函数无需调用,是因为在系统中自带调用,可直接执行,执行的逻辑是每1ms 系统中断一次 执行一次void systick_isr(void)这个函数 ,因此可以看到在此函数中延时函数可用if (led1_task_cnt<1000) led1_task_cnt++;可以很清晰的看到有两个状态(允许通行 不允许通行的状态,那么需要用if 和if else 进入到不同的状态) 在每个状态下编写需要完成的事件 中断(在此项目中是红外传感器)一般是要单独放在一个线程里的。以下位task.c代码。
2024-12-07 12:06:30
391
原创 LCD1602 代码实现字符串显示
首先是各引脚的定义,是为了后续更方便的更改引脚,同时定义出每个引脚的高低电平名称,是为了后续更方便的取用高低电平。一个是初始化GPIO口(输出形式是推挽输出 低电平触发 故默认上拉电平)代码和其他GPIO口的初始化没有区别。(4) 以后每次写指令,读/写数据操作均需要检测忙信号(一般不需要)另一个初始化是上电初始化(是固定的 可以不用及流程 需要就直接看)只需要传入想要的 行 列(首字符的) 和 字符串 就可以。(8) 写指令 06H:显示光标移动设置。(5) 写指令 38H:显示模式设置。
2024-12-06 10:01:17
380
原创 LCD1602 基础简介
例如 我想要显示 1 这个字符 输入的二进制地址信息为 0011 0001B 可以根据AS II 来进行转换验证 其十进制为49 AS II 表示字符 1。第一行第三列 02H 转化为二进制是0000 0010B 但是 D7要置1 因此 要加上1000 0010B。第二行第五列 44H 转化为二进制是0100 0100B 但是 D7要置1 因此 要加上1000 0010B。结果就是1100 0100B。结果就是1000 0010B。以上为16个引脚的介绍。
2024-12-05 16:42:45
247
原创 红外传感器HW—201
当红外发射管发射后 并且接收到后 会亮绿灯 且在out端输出低电平。调节灵敏度,当顺时针旋转时,灵敏度变高,检测的距离会变远 反之.
2024-12-03 19:59:00
449
原创 使用Systick模拟多线程
以上为task.c文件中的代码 要注意这里的task1() 与 task2()函数 目的是设置标致位 当task_flag =0 时,return立马返回 不执行下面的代码 仅当task_flag =1时 才会执行下面的代码。介绍一下为什么只需调用task1()和task2()函数 而不进行 systick_isr ()函数的调用 因为这是。这个代码的意思是 HAL_IncTick() 每到1ms进行一次中断的执行 自动执行一次下面的函数的调用。所以不会在主函数中调用。
2024-12-03 19:29:07
183
原创 手撸带操作系统延时函数
told的位置和tnow的位置会有两种可能, 上面那个计算tcnt=told-tnow (因为systick是递减的)下面的那个图tcnt=reload-(tnow-told) 取两边的值。reload:systick重装载的值。ticks:一共需要计多少数。told:上次循环VAL的值。tcnt:已经计了多少数。tnow:当前VAL的值。
2024-12-03 16:00:49
221
原创 systick寄存器介绍
系统定时器是一个 24位的向下递减(5,4,3,2,1)的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。COUNTFLAG 寄存器 当SYSTICK向下递减取到0时,该寄存器置1,若要读取该位,则自动请0;CLKSOURCE 寄存器 当置1时 为内核时钟源 (1分频) 当置0时为外部时钟源(8分频);系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
2024-12-02 19:49:56
436
原创 第一个STM32项目——电动车报警器
①点击遥控器A按键,系统进入警戒状态,一旦检测到震动(模拟小偷偷车),则喇叭发出声响报警,吓退小偷。②点击遥控器B按键,系统推出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,让车主尴尬。中断代码(包括震动传感器的和433M无线收发的)
2024-12-02 19:00:35
197
原创 433M无线收发模块 控制LED灯点亮 熄灭
以下为中断EXTI.c的代码 注意初始化的部分 433M为高电平导通 因此初始的时候要给低电平 上升沿触发 特别注意 这里选择的引脚一个是PA12 一个是PB5 是为了练习服务函数。在中断代码中要注意使用标志位 因为这样可以使得重要的内容在主函数中编写 使得代码各个模块更加的清晰。注意每次使用后都要对标志位置0即False。
2024-11-29 10:15:02
449
原创 433M 无线收发模块介绍
上图为433M无线收发模块 其中A B C D为控制 D0 D1 D2 D3 高低电平 433M无线模块默认低电平,当按键按下后导通为高电平,若用4个继电器连接(继电器为低电平触发,因此连接后,继电器上的四个灯都是亮的,即4个继电器时闭合的,当按下开关开启)连接后无需代码支撑,就可以实现闭合。
2024-11-28 16:19:37
545
原创 STM32继电器模块讲解
继电器分低电平触发 和高电平触发 意思为输入为低/高电平时导通 以下为工作原理 (用小电流控制大电流 防止发生意外 通过衔铁吸附来进行控制)VCC(+): 供电正极(最好是3.3v)。连接此引脚到电源(通常是直流电源),以提供继电器线圈所需的电流。NC(Normally Closed): 常闭接口,继电器吸合前与COM连接,吸合后悬空。NO(Normally Open): 常开接口,继电器吸合前悬空,吸合后与COM连接。COM(Common): 公共端,通常是中间的触点,与常开或常闭触点相连。
2024-11-28 11:19:31
473
原创 stm32 振动传感器实现检测震动 灯亮2s 设置标志位
特别注意标志位的函数 一个vibrate_flag_set输入函数 因为vibrate_flag是一个全局变量 而vibrate_flag_get 是输出函数。在主函数中 要避免if函数多次执行 最好的方式就是将vibrate_flag_set(FALSE) 从而只执行一次 达到延时2s的目的。在中断服务例程(ISR)中,应该避免做任何复杂的操作或延时,因为中断服务程序执行时会中断主程序的执行,任何复杂的操作可能会导致系统不稳定。因此,通常在中断处理中,我们只设置一个标志位(例如。
2024-11-28 10:51:38
251
原创 震动传感器 SW-8010P
在产生震动时输出低电平。电源指示灯只要接通gnd和vcc(3.3v)就会亮启 开关信号指示灯 只有在产生震动时才会亮启。
2024-11-26 20:26:42
245
原创 EXTI配置流程 含中断延时消抖点亮小灯
(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) 参数1是STM32 的特殊中断数字见图 参数2是抢占优先级的等级 参数3是 响应优先级的等级 注等级越低越优先。函数中有自定义的void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数 需要编写想要的中断效果。以下是主函数 main()的代码。
2024-11-26 16:12:28
380
原创 STM32的AFIO讲解
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数中。AFIO总共有4个寄存器,这是因为一个寄存器可以选择4个那么4个寄存器就可以选择4✖4 16个。如图AFIO的作用就是在所有的GPIOX中选择16个。而AFIO寄存器的作用就是确保选择的这16个。
2024-11-26 16:05:29
1445
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人