
单片机
文章平均质量分 70
Alen.Wang
智能机器人硕士,擅长复杂电路设计、嵌入式软件编程及系统架构设计,从事嵌入式AI开发工作,有多年项目开发经验。
我的联系邮箱 alen_wp@163.com
展开
-
stm32cubemx,串口接收第一帧数据全为0的问题
串口接收第一帧全为0原创 2023-01-06 14:19:51 · 2424 阅读 · 1 评论 -
stm32 hal串口中断分析
stm32 hal串口中断分析startup_stm32f103xe.s(115) : DCD USART1_IRQHandler USART1_IRQHandler HAL_UART_IRQHandler //调用HAL库中断处理公用函数。 功能:对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用 /* UART in mode Receiver --------...原创 2022-04-08 17:25:02 · 2379 阅读 · 0 评论 -
简单的串口接收超时函数
简单的串口接收超时函数类似于select 函数。设置的超时时间,若在规定的时间内接收到数据,则返回0(接收成功);否则返回-1适用场景:给一块设备发送信息,能够立马收到响应信息。/************************************************************************* * @函数名称 SerialKeyPressed * @函数说明 测试超级终端是否有按键按下 * @输入参数 key:按键 * @输出参数...原创 2020-07-29 17:08:14 · 2787 阅读 · 0 评论 -
51单片机的TXD、 RXD 既接了 232 又接了 485芯片 ,会导致通信失败!
51单片机的TXD、 RXD 既接了 232 又接了 485 ,会导致通信失败!下面是绘制电路板用的部分电路图:通信现象:1、我使用了USB-232的下载模块,把它接到P4上,发现单片机只能发送数据,却不能接收数据! 个人猜测是 485芯片的干扰。2、 只 使用 USB-232的下载模块 给电路板供电(把接在TXD 、RXD的杜邦线拔原创 2017-01-24 10:57:45 · 5323 阅读 · 2 评论 -
STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。以下是对脉冲宽度及频率的计算。1、脉冲宽度如下图所示,采集该高电平脉冲的宽度,只需要进入输入捕获上升沿检测,记录当前的发生上升沿时的CNT值,再进行输入捕获下降沿检测,也记录当前发生下降沿时的CNT值,两次CNT值的差值再根据计数的频率就可以算出脉冲的宽度。转载 2017-06-29 15:01:43 · 54464 阅读 · 6 评论 -
if语句的陷阱
#includevoid main(){ char a=0; if(a==0) { a=1; printf("00000000\n"); } else if(a==1) { a=0; printf("11111111\n"); }}输出结果是:0000原创 2017-06-29 14:06:32 · 747 阅读 · 0 评论 -
TIM_GetCounter与TIM_GetCapture1的区别
/** * @brief Gets the TIMx Input Capture 1 value. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. * @retval Capture Compare 1 Register value. */uint16_t T原创 2017-07-11 14:33:43 · 31625 阅读 · 2 评论 -
运放后的电压信号,校准方法
假设现在有 0~1.5v 的电压信号,经过2倍运放后,得到0~3v的电压值,由于运放存在缺陷(例如:失调电压和失调电流),和电阻的阻值精度问题,导致,最后采集到的电压值不准确。这个时候就需要校准。校准的方法:1、将单片机AD采集到的电压值,通过串口发送到PC上;记单片机采集到的电压值为实测值(X)2、使用直流稳压电源(这个电源精度一般为1% , 或者用精度更高的电源),用于提原创 2017-06-26 13:59:49 · 3327 阅读 · 0 评论 -
字符转换为16进制数字
//将1个字符转换为16进制数字//chr:字符,0~9/A~F/a~F//返回值:chr对应的16进制数值u8 chr2hex(u8 chr){ if(chr>='0'&&chr<='9') return (chr-'0'); if(chr>='A'&&chr<='F') return (chr-'A'+10); if(chr>='a'&&chr<='f') retur原创 2017-07-16 10:45:22 · 2072 阅读 · 0 评论 -
16进制数字转换为字符
//将1个16进制数字转换为字符//hex:16进制数字,0~15;//返回值:字符u8 hex2chr(u8 hex){ if(hex<=9) return (hex+'0'); if(hex>=10&&hex<=15) return (hex-10+'A'); return '0';}原创 2017-07-16 10:46:58 · 1360 阅读 · 0 评论 -
unicode gbk 转换函数
typedef unsigned short WCHAR;//字库信息结构体定义//用来保存字库基本信息,地址,大小等__packed typedef struct { u8 fontok; //字库存在标志,0XAA,字库正常;其他,字库不存在 u32 ugbkaddr; //unigbk的地址 u32 ugbksize; //unigbk的大小 u32 f原创 2017-07-16 10:55:24 · 1351 阅读 · 0 评论 -
单片机串口通信原理和控制程序
我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串。在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果。本节所提供程序的功能是,通过电脑串口调试助手下发三个不同的命令,第一条指令:buzz on 可以让蜂鸣转载 2017-06-17 16:35:15 · 7011 阅读 · 6 评论 -
单片机RS485通信接口、控制线、原理图及程序实例
RS232 标准是诞生于 RS485 之前的,但是 RS232 有几处不足的地方:接口的信号电平值较高,达到十几 V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。接口使用信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。传输距离有限,最多只能通信几十米转载 2017-06-17 16:24:04 · 14155 阅读 · 0 评论 -
串口发送一帧数据时,两个字节的间隔时间是多少?
串口发送一帧数据时,两个字节的间隔时间是多少?这里先搞懂什么是波特率: 波特率:发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud。如果波特率为9600,发送一个位需要的时间为1/9600s=0.0001042s=0.1042ms,这里按数据位为8位,停止位为2位, 加起来就是10位,10个位发送所需的时间为:0.1042*1转载 2017-06-17 16:19:24 · 18077 阅读 · 0 评论 -
图解Stm32使用jlink下载程序时jtag接口(SW和JTAG模式)的简化方法
用过stm32的人都知道stm32有两种常用下载程序的方法,用串口和jlink。串口下载方法和51差不多不多说,用jlink下载时接口引脚太多导致接口很大,很占pcb的面积,在此我就针对这个问题清晰的讲述下jlink下载程序时jtag接口的简化方法!希望对大家有用。! 我实验的是jlink v8和stm32f103rbt6! 如果用jt转载 2017-03-02 11:07:39 · 28964 阅读 · 1 评论 -
都是stm32的JTAG引脚惹的祸
转载请注明出处:http://blog.youkuaiyun.com/qq_26093511/article/category/6094215最近在调试08接口的LED显示屏,使用的是自己做的STM32板子。调试的时候,突然发现显示屏,怎么都不亮,我就开始怀疑人生了。。。。。。。。难道是程序问题?吧啦吧啦的查询时序图,修改修改,加延时。。。。然而并没有什么卵用!唉,都让原创 2017-02-23 10:40:02 · 6581 阅读 · 1 评论 -
stm32 奇怪的位赋值问题 出错了
1、在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题!(1) 、 OUT1_R1 是单片机的一个IO口 , dat是传进来的一个数据if ( (dat & 0x80) == 0)OUT1_R1 = 0; // 0是不亮,1是亮else OUT1_R1 = 1;(2)、 OUT1_R1 = (dat&0x8000); // stm32里,这样操作不原创 2017-02-25 21:00:38 · 2445 阅读 · 0 评论 -
12864 显示多种图形
/*******************************************************************************************************///程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能/***************************************************原创 2017-03-24 20:50:59 · 2186 阅读 · 0 评论 -
什么是C语言结构体字节对齐,为什么要对齐?
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取转载 2016-06-13 18:48:03 · 6495 阅读 · 0 评论 -
STM32的ADC1采集多条通道,可以不使用DMA功能吗?
类似的问题为什么我采集5条通道的电压,而采集到的值却都是第一条的呢?我什么时候需要使用DMA功能?Ⅰ关于ADC的一些知识STM32的ADC是一种12位逐次逼近型的模拟数字转换器。它有多达18条通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器原创 2017-07-07 17:20:02 · 9938 阅读 · 1 评论 -
二级指针如何分配动态内存并赋值
//二级指针如何分配动态内存并赋值#include #include int main(void){ int **p = NULL; //最好是显式初始化这个二级指针 以防不测 int m, n, i, j; printf("请输入数组的行数和列数:\n例如格式:5,6 :代表5行6列\n"); scanf("%d,%d", &m, &n); p原创 2017-10-21 16:44:34 · 3335 阅读 · 0 评论 -
MODBUS TCP和MODBUS RTU的差别
图片出自:http://wenku.baidu.com/link?url=dp3g5nnxecbcSoaPMS07zvk5aaWdSNZwVEnDD8AmSTXeUJww41mZBukTD69dCaiPw80V2WhhdNdgWt14ot7kxo6sgU3mt7FLogh_W5_z2ZC原创 2017-01-13 15:50:43 · 11649 阅读 · 0 评论 -
MODBUS ASCII和RTU两种模式的区别、优缺点
因为它传输的都是可见的ASCII字符,原来用RTU传输的数据每一个字节,用ASCII的话都要把这个字节拆分两个字节,比如RTU传输一个十六进制数0xF9,ASCII就需要传输字符'F'和字符'9',对应的ASCII码0x46和0x39两个字节,这样它的传输的效率肯定就比RTU低。从上表的比较我们可以看到,MODBUS的ASCII协议和RTU协议相比,MODBUS ASCII协议拥有开始和结束标记,而MODBUS RTU却没有,所以。输的都是可见的ASCII字符,因此在调试阶段就显得更加直观。原创 2017-01-10 10:06:06 · 36149 阅读 · 1 评论 -
PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯
转自:http://blog.youkuaiyun.com/vbvcde/article/details/7660497我们提供 PPI协议的官方文档,协议更新时间为2005年,下面是我们根据文档解析的PPI读取变量返回数据,网上的文献大部分都是讲解如何发送的,对于接收提的很少,其中接收有很多控制位,下面的表格都一一列出,如果想做可靠的工控必须对这些位进行解析,对照官方文档才能做出可靠的工控产品转载 2016-12-26 14:48:59 · 15593 阅读 · 6 评论 -
sizeof用法总结
由于不同位数的操作系统计算结果可能不同,下面是在32位的win7 下计算的。 1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组所占地址空间的大小(字节为单位)。如果是一个指针的话,则输出在该系统中地址的字节宽度,即(位宽/8)。#include <stdio.h>int main(){ char a[25]; char *b;...原创 2018-09-21 08:46:31 · 1283 阅读 · 0 评论 -
BCD码与10进制转换
关于BCD码,本文不做解释。本文只介绍8421 BCD码与10进制的转换。1、8421 BCD转10进制unsigned char bcd_to_hex(unsigned char data){ unsigned char temp; temp = ((data>>4)*10 + (data&0x0f)); return temp;}...原创 2019-02-19 13:07:58 · 10058 阅读 · 1 评论 -
stm32延时比实际需求慢了大概10倍的问题
2019年4月10日晚,我的一个朋友找我帮忙调试软件bug , 他跟我说:硬件绝对没问题的,因为是公司成熟的硬件电路图;肯定是软件问题。功能:将超声波的数据通过串口发送出去。运行现象:屏蔽超声波部分的代码,串口可以长时间发送,但是加上超声波后,单片机只能发送大概2分钟,就不发送数据了。超声波的程序没问题的,因为之前在开发板上测试通过了。在调试期间,突然发现程序大概每3秒发送一次,但是程序里的延时函...原创 2019-10-12 20:18:43 · 5469 阅读 · 0 评论 -
modbus读输入状态与读线圈状态的区别?
01 读线圈状态 描述读从机离散量输出口的 ON/OFF状态,不支持广播。附录B列出由不同控制器型号支持最大的参数清单。 查询查询信息规定了要读的起始线圈和线圈量,线圈的起始地址为零,1-16个线圈的寻址地址分为0-15。例:请求从机设备17读20-56线圈。QUERY Field Name Slave AddressFunction原创 2017-02-28 19:34:24 · 17114 阅读 · 2 评论 -
Modbus 通讯协议 (RTU传输模式)
第一章Modbus协议简介Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,翻译 2018-02-04 10:30:10 · 110019 阅读 · 7 评论 -
LT3756/LT3756-1/LT3756-2 - 100VIN、100VOUT LED 控制器
LT3756/LT3756-1/LT3756-2 - 100VIN、100VOUT LED 控制器特点3000:1 True Color PWMTM调光宽输入电压范围:6V至 100V输出电压高达 100V恒定电流和恒定电压调节100mV 高端电流检测可以采用升压、降压模式、降压-升压模式、SEPIC或反激式拓扑结构来驱动 LED可调频率范围:100kHz至 1MHz开路 LE原创 2017-07-09 10:48:48 · 933 阅读 · 0 评论 -
在液晶上显示数字思路,如显示123456789
//m^n函数//返回值:m^n次方.u32 LCD_Pow(u8 m,u8 n){ u32 result=1; while(n--)result*=m; return result;} //显示数字,高位为0,还是显示//x,y:起点坐标//num:数值(0~999999999); //len:长度(即要显示的位数)//void LCD_ShowCha原创 2017-10-08 18:28:06 · 9378 阅读 · 0 评论 -
用WINHEX合并两个或多个BIN文件
以前,我给W25Q16下载内容的时候,每次都要分别传输GBK字符、英文字符和图片BIN文件,每次都要传输好几次。后来,我发现,用WINHEX软件可以把这些BIN文件都合并到一个文件,只需要传输一次就可以了,大大的提高了效率。这一招,对于做产品特别的有帮助。这篇文章是我2015年1月3日写的,一直放在瑞生网,那时候我还没有开通微信公众号,好转载 2017-01-11 20:31:13 · 6284 阅读 · 0 评论 -
在液晶屏里显示浮点数的方法 (sprintf 的妙用)
思路:使用 sprintf 函数将浮点型数据转为指定格式的字符串#include #includeint main(){ unsigned char len,temp[10]; float a =1234.5689; len=sprintf((char *)temp,"%0.2f",a); printf("%d [%s]\n",len,temp); retu原创 2017-11-20 14:26:36 · 14038 阅读 · 4 评论 -
计算输入字符串里各个字符所占比例
#include #define MAX 100void detect(char s[]){ char ch[MAX];/*记录出现的字符*/ int num[MAX]={0};/*记录每个字符出现的次数*/ int i,j,n=0; for(i=0;s[i]!='\0';i++) { for(j=0;j<n;j++) if(s[i]==ch[j]||(原创 2017-11-23 10:22:45 · 1410 阅读 · 1 评论 -
C语言中的未初始化变量的值
C语言中未初始化的变量的值是0么全局变量 、静态变量初始值为0局部变量,自动变量初始值随机分配C语言中,定义局部变量时如果未初始化,则值是随机的,为什么?定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。转载 2017-11-25 11:56:54 · 15716 阅读 · 2 评论 -
C语言中 || 和 &&
|| 或操作,|| 为界将表达式分为两部分,他会先算前一部分,如果前一部分为真,他将停止运算,如果为假,他才会算第二部分,你这里第一部分就为真了,第二部分当然也就不会算了。例如: a || b ,只有在前一个条件a为假,才会去判断条件b ;若条件a为真,则条件b不会执行&&且操作 ,&&为界将表达式分为两部分,他会先算前一部分,如果前一部分为假,他将停止运算,如果为真,他才会算第原创 2017-12-21 21:36:05 · 66872 阅读 · 4 评论 -
linux c下,从路径名中分离文件名
首先介绍一些查找字符的函数1、strrchr头文件:#include strrchr() 函数用于查找某字符在字符串中最后一次出现的位置,其原型为: char * strrchr(const char *str, int c);【参数】str 为要查找的字符串,c 为要查找的字符。strrchr() 将会找出 str 字符串中最后一次出现的字符原创 2017-12-15 11:06:44 · 4977 阅读 · 0 评论 -
选择电源芯片应该注意哪些问题?
1、首先要考虑 温度 ,这款电源芯片的工作温度的范围; 比如我们选择的芯片的工作温度是0°~105°,那么这款芯片肯定不能在东北运行,因为东北那地方,冬天温度都是零下20几度,2、电流的输出;LT3756/LT3756-1/LT3756-2 - 100VIN、100VOUT LED 控制器特点3000:1 True Col原创 2017-07-09 10:46:32 · 1577 阅读 · 0 评论 -
外置式与增量式PID模板程序(51单片机c语言)
外置式PID模板#define MuBiaoCS 0 //目标常数#define CHang_aCS 0 //比例常数#define CHang_bCS 0 //积分常数#define CHang_cCS 0 //微分常数/****************************************************************************原创 2016-06-13 18:58:55 · 1486 阅读 · 0 评论 -
RS485波特率问题
最近再做一个项目,发现485不能正常发送数据,感到非常奇怪!后来查阅相关资料才发现可能是 485波特率设置过高(我设置的485波特率是115200)! 后来把波特率改小一点,改成9600 ,结果就能正常通信了!波特率越高,代表传输信号频率越高。相同的电缆,信号频率越高时,感抗越大,信号在传输线上的损耗也就越大。因此,波特率越高,传输距离越短。原创 2016-06-15 17:02:20 · 46214 阅读 · 10 评论