51单片机
文章平均质量分 65
LaoZhangGong123
老家亲友若相问,就说我在写代码。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
重点学习三极管放大电路设计
本文系统介绍了三极管的基本原理与应用。主要内容包括:1)三极管类型(NPN/PNP)及电路符号识别;2)三个工作区(截止、放大、饱和)的偏置条件;3)关键参数符号及含义(如UBE(on)、VCEO、β值等);4)直流通路分析与静态工作点计算;5)等效电路模型及输入/输出电阻计算;6)共射极放大电路设计,重点分析发射极电阻RE的作用(稳定工作点、负反馈等),并提供具体参数计算方法。文章通过公式推导和实例计算,详细说明了三极管在放大电路中的应用要点。原创 2025-12-16 17:18:32 · 1008 阅读 · 0 评论 -
“do{}while(0)”的作用
本文分析了do{}while(0)在C/C++编程中的三种典型应用场景:1)作为代码分块工具,允许在块内定义局部变量;2)用于宏定义,避免宏替换时因缺少大括号导致的逻辑错误;3)替代goto语句实现流程控制,提高代码可读性。在Linux内核和开源代码中,这种结构既能确保宏替换后的语法正确性,又能保持代码整洁,是解决复杂宏定义和流程控制问题的有效方案。通过实例对比展示了do{}while(0)相比直接使用大括号或goto语句的优势。原创 2025-12-01 14:58:04 · 446 阅读 · 0 评论 -
学习“指针函数,函数指针,指针数组,数组指针”
本文介绍了C语言中指针函数、函数指针、指针数组和数组指针的概念及用法。指针函数是返回指针的函数,函数指针是指向函数的指针变量。指针数组是元素为指针的数组,数组指针则指向一个数组缓冲区。通过typedef为函数指针类型创建别名,可以简化声明。文中提供了完整的测试代码,展示了如何使用结构体数组存储不同函数指针,并通过名称匹配调用相应函数。测试结果表明,系统能正确识别函数名并执行对应的函数操作,未匹配时执行默认函数。该实现方法可用于构建灵活的基于名称的函数调用机制。原创 2025-11-28 16:59:41 · 415 阅读 · 0 评论 -
“stdlib.h“中的函数
本文详细分析了C标准库<stdlib.h>中的数值转换和随机数生成函数。主要介绍了三类函数:1)基本转换函数(atoi、atol、atof)将字符串转换为数值;2)高级转换函数(strtol、strtoul、strtod)支持进制转换并返回剩余字符串指针;3)随机数函数(rand、srand)及其实现原理。文章通过代码示例展示了各函数的使用方法,特别比较了在不同系统架构下的行为差异,如32位与16位系统中atoi/atol的区别。此外,还介绍了绝对值函数(abs/labs)和除法函数(div/l原创 2025-11-22 11:42:58 · 584 阅读 · 0 评论 -
“string.h“中的函数
摘要:本文详细介绍了C语言标准库"string.h"中的常用字符串处理函数,包括字符串长度计算(strlen)、内存设置(memset)、字符串复制(strcpy/strncpy/memcpy/memmove)、字符串比较(strcmp/memcmp)、字符串搜索(strchr/strstr)等函数的使用方法和注意事项。通过代码示例演示了各函数的正确用法,并特别强调了内存溢出的风险及防范措施。文章还包含了自定义字符串处理函数(strnchr/strnstr)的实现,为开发者提供了全面的字原创 2025-11-22 11:38:20 · 643 阅读 · 0 评论 -
C语言控制语句
本文介绍了C语言中的控制语句,主要包括选择结构和循环结构。选择结构部分详细讲解了if语句(单分支、双分支和多分支)和switch语句的语法格式及应用实例,并比较了两者的使用场景。循环结构部分阐述了while、do-while和for三种循环语句的语法特点,通过具体代码演示了不同循环方式的使用方法。此外还介绍了break、continue、goto等流程控制语句的功能特性,最后概括了顺序结构、选择结构和循环结构三大基本程序结构的特点。全文通过丰富的代码示例,系统性地讲解了C语言流程控制语句的语法规则和实际应用原创 2025-11-22 11:33:30 · 407 阅读 · 0 评论 -
C语言中的构造类型
本文介绍了C语言中的构造数据类型,包括数组、结构体、联合体和枚举。数组是相同数据类型的连续存储元素集合,分为一维和二维数组,可通过下标或指针访问。结构体允许组合不同数据类型成员,需注意内存对齐问题。联合体让成员共享同一内存空间,适合处理同一数据的多种表示方式。枚举用于定义整型常量集合,可指定或使用默认值。文章详细说明了这些类型的声明格式、内存分配规则和访问方法,并强调了使用时的注意事项,如数组越界和结构体内存对齐等问题。这些构造类型大大增强了C语言处理复杂数据的能力。原创 2025-11-22 11:31:21 · 934 阅读 · 0 评论 -
字符和字符串
本文介绍了C语言中字符和字符串的基础知识。主要内容包括:字符表示方法(ASCII码1字节,汉字GBK编码2字节)、常用转义字符及其含义、ASCII字符表(需重点记忆0-127字符)、字符串定义(以'\0'结尾的字符序列)。详细讲解了printf函数的格式化输出:整数(%d/%i)、无符号数(%u)、十六进制(%x/X)、八进制(%o)、浮点数(%f/F)、科学计数法(%e/E)、字符(%c)、字符串(%s)等多种格式符的使用方法,并配有具体示例说明不同格式控制符(如宽度、补零等)的输出效果。原创 2025-11-22 11:26:25 · 309 阅读 · 0 评论 -
STM32单片机C语言运算符
C语言运算符详解:本文系统介绍了C语言中的各类运算符,包括算术运算符(+、-、*、/、%等)、关系运算符(>、<、==等)、逻辑运算符(&&、||、!)、位运算符(&、|、~等)、赋值运算符(=、+=等)以及特殊运算符(sizeof、指针运算符等)。通过代码示例详细演示了每种运算符的使用方法,并提供了运算符优先级表。特别强调了自增/自减运算符的前后置区别("++在前先加,++在后先用后加")以及强制类型转换等重要概念。文章还涵盖了条件运算符、逗号运算符原创 2025-11-22 11:24:40 · 776 阅读 · 0 评论 -
STM32单片机函数
本文介绍了C语言中函数的基本概念和使用方法。首先通过数学中的线性函数类比说明C语言函数的概念,然后详细讲解了函数的声明格式(无参数无返回值、带参数无返回值、带参数带返回值等)。接着阐述了void关键字在函数中的应用,包括表示无返回值和避免未使用变量警告。文章还详细说明了return语句的用法、函数参数传递方式(数值传递和指针传递),并介绍了函数指针的概念与使用方法。最后简要提及了表达式语句的分类。全文通过具体代码示例帮助理解函数在C语言中的实际应用。原创 2025-11-22 11:19:29 · 511 阅读 · 0 评论 -
STM32单片机指针变量
本文介绍了指针变量的基本概念和应用。指针变量存储另一个变量的内存地址,在MDK-ARM编译器中固定占用4字节空间。文章详细说明了一维指针和二维指针的声明格式及使用方法,包括通过指针间接修改变量值的操作。重点阐述了void和void**这两种通用指针类型的特点:void可指向任何数据类型,void**则指向void*指针。在使用这些通用指针时,需要通过类型转换才能正确访问数据。通过多个具体示例,展示了如何声明、初始化和操作不同类型的指针变量。原创 2025-11-22 11:16:34 · 368 阅读 · 0 评论 -
STM32单片机变量
本文介绍了C语言中变量的基本概念和使用规范。主要内容包括:1)变量命名规则要求具有可读性,以字母或下划线开头;2)变量声明格式及访问方式,可通过变量名直接访问或获取地址;3)变量类型分为局部变量和全局变量,详细说明了auto、static、extern等修饰符的使用场景;4)介绍了const和volatile修饰变量的特性;5)通过示例说明了同名全局变量和局部变量的处理方式。文章还提供了各种数据类型变量的声明示例,包括整型、浮点型和布尔型等。原创 2025-11-22 11:14:50 · 282 阅读 · 0 评论 -
STM32单片机在KEIL中的数据类型
本文详细介绍了MDK-ARM编译器支持的数据类型及其特性。主要内容包括:1)基本数据类型(char、int、float等)的位数、字节数和取值范围;2)通过typedef定义的类型别名(如int8_t、uint32_t等);3)单精度和双精度浮点数的IEEE 754存储格式解析;4)编译器特殊定义(如__IO、__I等)及STM32专用数据类型;5)各类型数值范围的定义(INT32_MAX等)。文章强调要掌握这些数据类型的关键特性,建议使用编译器默认配置,并提供了浮点数存储格式的详细计算示例。原创 2025-11-22 11:11:35 · 784 阅读 · 0 评论 -
如何方便打开或关闭“串口输出的调试信息”
摘要 本文提出了一种通过宏定义来控制串口调试信息输出的方法。通过定义DEBUG_PRINTF宏代替直接使用printf函数,在开发阶段可将宏定义为printf(VA_ARGS)输出调试信息,产品发布时只需将宏定义为空即可关闭所有调试输出。文中详细展示了宏定义方法,并提供了完整的STM32 USART1串口初始化及配置代码,以及包含调试信息输出的主程序示例。这种方法实现了调试信息的灵活控制,避免了在最终产品中手动删除大量printf语句的繁琐工作。原创 2025-11-19 14:04:01 · 472 阅读 · 0 评论 -
解决Error: L6411E: No compatible library exists with a definition of startup symbol __main.
摘要:编译时遇到"Error:L6411E"报错,提示缺少与__main相关的启动符号定义。经排查发现是连接问题,解决方法为删除相关设置后重新编译即可。操作步骤:在指定位置点击"OK"确认后再次编译。该问题与工程中的main函数定义有关。原创 2025-10-16 16:52:15 · 269 阅读 · 0 评论 -
字节内的位序和多字节的大小端模式
本文介绍了位序和字节序的概念及其在通信中的应用。位序指字节数据在传输时的各位排列顺序,分为MSB(最高有效位)和LSB(最低有效位)。不同通信协议采用不同的位序:串口从LSB开始传输,I2C和CAN从MSB开始传输,而SPI可配置。字节序分为大端模式(高字节存低地址)和小端模式(低字节存低地址),KEIL是小端模式,IAR是大端模式。通信中需注意不同协议和编译器的大小端模式转换,如以太网采用大端模式。理解这些概念对数据通信和硬件编程至关重要。原创 2025-10-13 15:18:47 · 645 阅读 · 0 评论 -
#define 宏名() (变量名=常数)的问题分析
本文探讨了C语言中宏定义的使用方法及注意事项。文章首先介绍了无参宏定义和带参宏定义的基本语法格式,并通过#define M(a+b)和#define Add(x,y)等示例说明其替换功能。然后重点分析了宏定义在判断语句中的使用问题,通过#define uip_close()(UIPFlag=UIP_CLOSE)的实例,指出将赋值操作放入宏定义可能导致的逻辑错误,并提供了测试代码验证。最后以uIP移植中的httpd.c为例,说明在特定场景下将宏定义作为执行语句的合理性。文章通过具体案例对比,强调了在不同应用场原创 2025-09-30 15:57:05 · 254 阅读 · 0 评论 -
UIP中的psock_generator_send()的宏分析
本文分析了开发软件中常见的宏定义问题,以UIP代码为例解析了三个关键宏定义:1)PT_THREAD宏将函数声明替换为字符返回类型;2)PT_BEGIN宏通过switch-case结构实现流程控制;3)PT_END宏包含清理和返回值操作。通过逐层展开宏定义,揭示了底层代码逻辑,为理解使用宏定义的程序提供了分析方法。文章指出,掌握宏展开技巧是读懂这类代码的关键。原创 2025-09-29 17:09:39 · 265 阅读 · 0 评论 -
“声明变量”的语句前加typedef
摘要:typedef在变量声明前使用可定义新数据类型。例如"typedef u16 uip_ip6addr_t[8]"将uip_ip6addr_t定义为含8个u16元素的数组类型。程序演示了该用法:先定义IPv6地址类型uip_ip6addr_t,声明数组并赋值,最后通过串口打印各元素值及类型大小。结果显示该类型占16字节(8个u16元素),验证了typedef创建新数据类型的特性。(149字)原创 2025-09-26 15:30:33 · 385 阅读 · 0 评论 -
在不同的“*.c”文件中可以定义相同名字的宏
在不同".c"文件中可以定义同名宏,因为每个源文件独立编译,宏作用域仅限于当前文件。这与全局变量不同,不会产生跨文件的宏定义冲突。每个文件中的宏替换只影响本文件代码,即使宏名相同也不会相互覆盖。因此uip-split.c、uip.c和yiyyi.c中的BUF宏可以共存,各自在本文件内有效。原创 2025-09-26 10:47:50 · 136 阅读 · 0 评论 -
将AD16中的“Library图标按钮”放在左边显示的好处
摘要:AD16软件中,默认Projects显示在左侧水平展开,Library在右侧竖直折叠。可通过点击Library的"图钉按钮"固定显示,或将其拖至左侧与Projects并列,便于切换操作。若误关闭Projects或Library面板,可通过View→WorkspacesPanels→System→选择对应选项重新显示。该操作方式类似Protel99SE的界面布局。原创 2025-09-22 14:15:30 · 351 阅读 · 0 评论 -
AD元件库左边的浏览不见了怎么办?
摘要:本文介绍了在Altium Designer软件中恢复PCB和SCH元件库左侧浏览窗口的方法。当PCB元件库浏览窗口消失时,可通过View→Workspaces Panels→PCB→PCBLibrary路径恢复;同理,SCH元件库浏览窗口消失时,可通过View→Workspaces Panels→SCH→SCHLibrary路径恢复。掌握这些操作技巧能有效提升PCB设计和原理图绘制的工作效率。原创 2025-09-22 10:46:18 · 443 阅读 · 0 评论 -
晶振的等效串联阻抗大小对晶振起振的影响
无源晶振的等效串联阻抗(ESR)是关键的电气参数。ESR过大会导致起振困难、停振及增加电路功耗等问题。选型时应优先选择ESR值较小的晶振,通常尺寸越大的晶振ESR越小。较小的ESR意味着更低的能量损耗和更易起振。常见的封装形式包括金属面贴片、陶瓷外壳玻璃封装及HC-49US贴片封装等,其中HC-49US贴片封装表现较优。原创 2025-09-18 17:10:10 · 314 阅读 · 0 评论 -
解决万能板焊接高速时钟线的问题
万能板焊接裸导线连接PCB接口存在高频干扰隐患,尤其影响I2C/SPI等信号传输。作者通过两次失败实验发现,过孔上锡形成的"天线"结构会导致通讯故障。建议改用排线焊接方案,虽外观不美观但能确保稳定工作。这提醒工程师在电路连接方式选择时,可靠性比美观更重要。原创 2025-09-16 14:04:26 · 261 阅读 · 0 评论 -
AD16的PCB拼板
本文介绍了PCB拼板操作的具体步骤:首先确定PCB尺寸(50x24mm),通过Shift+点击选中板框;使用复制功能后,在特殊粘贴设置中调整间距参数(Y向26mm)和拼板数量(1x3);完成后删除原PCB并添加5mm工艺边。此外还说明了如何通过绘制Boardcutout区域在3D视图中显示开槽效果,最后通过快捷键关闭飞线显示以查看3D效果。该流程涵盖了从基础拼板到3D可视化的完整操作链。原创 2025-09-10 10:40:31 · 709 阅读 · 0 评论 -
解决AD16的PCB顶层和底层同时摆放插件引起元件会变绿
AD16设计PCB时,顶层和底层同时摆放插件元件会变绿的解决方法:进入Design > Rules > Placement,取消勾选ComponentClearance选项,确认后即可消除元件摆放警告。原创 2025-09-09 16:06:23 · 305 阅读 · 0 评论 -
解决“AD16原理图元件库中的元件不能整体旋转”之问题
本文介绍了在AD16原理图元件库中实现元件整体旋转的方法:1)点击DXP菜单进入Preference设置;2)选择Schematic-GraphicalEditing选项;3)取消AlaysDrag的勾选。完成这三步设置后,即可实现元件的整体旋转功能。该方法通过修改软件默认设置解决了AD16中无法整体旋转元件的问题。原创 2025-09-04 16:29:34 · 321 阅读 · 0 评论 -
声明结构和给结构赋值
本文介绍了在C语言结构体中定义和使用函数指针的三种方法。通过_WIZCHIP结构体示例,展示了如何在结构体中嵌套定义函数指针成员(如CRIS、CS等子结构体),并详细说明了三种赋值方式:1)声明时使用点标记法初始化;2)声明时使用顺序初始化;3)运行时通过专用函数动态注册。特别演示了回调函数机制,如通过reg_wizchip_cs_cbfunc()函数注册SPI片选操作函数,实现硬件抽象层的灵活配置。这种技术在嵌入式开发(如W5500网络芯片驱动)中广泛应用,相比教科书中的简单结构体赋值。原创 2025-08-13 14:59:50 · 604 阅读 · 0 评论 -
秋游四褐山
深秋时节,作者重忆四年前四褐山秋游。野菊灿烂,农家小院,黑狗护崽,山径蛐蛐声声。与友登望江塔远眺长江,夕阳下江面如金,三角洲上沙鸥翔集。此景勾起童年河边嬉戏记忆。归途采花追逐,青春笑语回荡山野。1998年10月16日追记这段永驻心间的美好时光。(149字)原创 2025-07-29 16:31:47 · 145 阅读 · 0 评论 -
移动网络会自动打开吗?
摘要:最近发现关闭移动网络后,手机会自动重新开启该功能。经排查发现是打开了“自动切换移动数据”开关导致的。一开始怀疑移动公司做手脚,后来发现手机厂商的软件问题,手动配置会被篡改。原创 2025-05-29 09:31:56 · 1116 阅读 · 0 评论 -
什么样的领导才是好领导?
打工人就是打工,和气生财,非必要,不要夺人饭碗。无为而治,也许会更好。原创 2025-05-19 10:21:21 · 422 阅读 · 0 评论 -
keil中不用srand()设置种子值rand()也可以生成随机数
rand()在生成随机数时,同时将将这个随机数设置为下一个种子值,这就是,keil不用srand()设置种子值,rand()也可以生成随机数的原因。原创 2025-05-06 10:36:52 · 745 阅读 · 0 评论 -
分析rand()和srand()函数的功能
分析rand()和srand()函数的功能,如何设置随机发生器,生成随机数。在Keil环境中,如果不使用srand()函数,直接调用rand()函数也可以生成随机数。调用rand()不但可以生成一个新的随机数,而且也会更新“种子值”。原创 2025-05-05 22:50:00 · 1271 阅读 · 0 评论 -
测试因strcpy执行拷贝引起的内存溢出
测试因strcpy执行拷贝引起的内存溢出。原创 2025-05-05 19:58:12 · 204 阅读 · 0 评论 -
分析atoi(),atol()和atof()三个函数的功能
分析atoi(),atol()和atof()三个函数的功能。原创 2025-05-05 19:50:57 · 577 阅读 · 0 评论 -
分析strtol(),strtoul()和strtod()三个函数的功能
分析strtol(),strtoul()和strtod()三个函数的功能,重点分析strtol()和strtoul()之间的区别。原创 2025-05-05 19:31:00 · 1002 阅读 · 0 评论 -
strstr()和strpbrk()函数的区别
strstr()和strpbrk()函数的区别。原创 2025-05-04 15:36:14 · 466 阅读 · 0 评论 -
C语言中memmove和memcpy
C语言中memmove和memcpy的区别。原创 2025-05-03 18:22:25 · 611 阅读 · 0 评论 -
AD16制作3D封装元件
AD16使用“IPC Compliant Wizard…”制作3D封装元件步骤。原创 2025-04-28 16:06:04 · 1122 阅读 · 0 评论 -
AD16如何执行DRC检测
AD16如何执行DRC检测,DRC检测主要用来查看走线是否出现通断,以及是否出现短路。原创 2025-04-24 17:39:36 · 1974 阅读 · 0 评论
分享