自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 #pragma pack的简单介绍

#pragma pack 是用来改变字节对齐的,大概用法有一下几种**#pragma pack(n) 修改为n字节对齐#pragma pack(push) 把当前使用的字节对齐方式压栈#pragma pack(pop) 把最后压栈的字节对齐方式出栈,恢复到#pragma pack(push)之前的字节对齐方式#pragma pack() 恢复默认字节对齐方式,这个跟具体的设备有关系,可能是4字节对齐,也可能是8字节对齐。常用组合, 先压栈,然后修改为自己想用的字节对齐方式,使用结束后,出栈,

2022-02-25 10:27:39 580

原创 mount.vboxsf: mounting failed with the error: Invalid argument

和往常一样,今天打开虚拟机,sudo mount -t vboxsf gitcode /mnt/code 加载共享文件,结果没有加载成功,报mount.vboxsf: mounting failed with the error: Invalid argument 的错误, 这个操作已经重复了很多次了,不知道今天为什么会出错。尝试过重启虚拟机,重启电脑,全部失败,准备重新安装增强功能(设备->安装增强功能),结果报下面的错误从网上搜了很多,基本都是初次安装遇到的问题,而我是正常使用的很久,突然出

2022-01-10 15:19:03 5465 6

原创 This application failed to start because no Qt platform plugin could be initialized

运行qt程序时出现上面错误,实际是缺少qwindows.dll的原因,如果运行电脑上没有安装qt, 那么打包的时候需要把该内容打包进去,如使用Enigma Virtual Box打包时没有包含platforms目录以及qwindows.dll,就会报上面的错误。加上platforms和qwindows.dll后问题消失,注意qwindows.dll一定要放在platforms下面,不能放在和Qt5Core.dll同一目录下。...

2021-04-13 09:33:38 1654 1

原创 exe依赖库打包程序Enigma Virtual Box

一般通过visual studio 编译的时候可以分为静态编译和动态编译:静态编译: 将所有代码生成一个文件,不需要外部链接库。优点是生成的程序可以在任何PC上运行,不需要安装其他库,确定是比较大,因为所有用到的东西都要到里面。动态编译:只生成最小的可执行文件。优点是文件小,带UI的程序可能只有几百KB,缺点是要用到动态链接库,电脑上如果没有安装动态链接库将无法运行。我是用visual studio+Qt进行程序开发,本来想生成静态编译的,但是后来发现Qt只提供dll文件,不提供源码(可能付费的企业

2021-04-12 11:06:05 879

原创 qtmain.lib(qtmain_win.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MT_St

使用VS2017+QT编译生成一个exe, 不想依赖dll库,所以修改成了静态编译,修改方法如下:在VS中将项目 -> 属性 -> C/C++ -> 代码生成 -> 运行库 修改为/MT(release修改为/MT, debug 修改为/MTd. 并且把所有cpp文件都通过属性修改成了/MT但修改后编译报下面错误qtmain.lib(qtmain_win.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项:> 值“MD_Dyn

2020-11-30 10:46:51 2349

原创 【51单片机】DS1302时钟芯片

简介DS1302是一个时钟芯片,可以记录时间日历,包括年、月、日、时、分、秒、星期,并能自动计算闰年,很多对时间敏感的设备都有该设备,该设备可以有主备两个电源输入,主电源用外接电源供电,备电源接电池,保证在断电的情况下,时钟芯片可以正常工作,重新上电后时间正确。主要性能指标(1)DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。(2)内部含有31个字节静态RAM,可提供用户访问。(3)采用串行数据传送方式,使得管脚数量最少,简单SPI 3线

2020-09-25 10:29:33 4723

原创 【51单片机】温度传感器DS18B20原理

简介DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。特点1、适应电压范围宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电2、独特的单线接口方式,DS18B20在与微处理器连接时

2020-09-22 15:33:52 6733

原创 【编程技巧】设置和清除位

我们在代码实现中,经常会有需要设置或清除某一位的操作,如设置和清除最低位(设置最低位即是把最低位赋值为1,清除即为赋值为0),具体实现如下:data |= 0x01; //设置最低位data &= 0xFFFE; //清除最低位大家觉得这个实现由什么问题吗?注意存在两个问题:设置时使用0x01人容易,但是清除的时候每次都要计算比较麻烦不知道data占用几个字节,就不好确认是使用0xFFFE还是0xFFFFFFFE我们修改后如下:#define BITMASK (0x01)da

2020-09-21 11:41:16 600

原创 【51单片机】IIC总线

什么是IIC 总线?IIC是Inter IC Bus的缩写,是由PHLIPS提出的一种串行总线,具备多主机系统所需要的包括总线裁决和高低速器件同步功能的高性能串行总线。IIC总线有时称为I2C总线(读I方总线)。IIC总线的结构IIC总线只有两根双向信号线,一根是数据性SDA,另一根是时钟线SCL。所有设备都是连接在这两根总线上,IIC总线通过上拉电阻接正电源,当总线空闲时,两根总线均为高电平。当连接到总线上的任一器件输出低电平,总线变为低电平,及各器件的SDA和SCL都是“与”的关系,有一个为低

2020-09-21 11:13:42 2103

原创 【51单片机】串口通信

标题什么是串口通信?串口通信又叫串行通信,是相对于并行通信来的,并行通信是将数据的位在不同的数据线上进行同时传输,如下图:优点: 控制简单, 传输速度快;缺点: 传输线较多,长距离传输时,成本高,并且各位同时接收困难(可能会受到干扰或每个线的导电不一样导致到达的时间不一致)串行通信是将数据字节分成一位一位的形式在一条传输线上逐个传输,如下图:优点:传输线少,长距离传输时成本低,并且可以利用现成的电话线网络设备;缺点: 数据传输控制比并行复杂,速度比并行低;所以计算机内部用并行线比较多,而计

2020-09-14 14:45:42 1654

原创 【51单片机】计时器/计数器中断

51单片机中有2个 定时器/计数器 中断,之所以叫定时器/计数器,是因为它既可以当定时器,也可以当计数器,其实本质上都是计数器,如果给一个稳定的时钟源,那么它就是一个定时器的。(下面我说的计数器或定时器都是一回事,不要在意为什么有的地方是定时器,有的地方是计数器)首先,定时器的计数是加1的,而不是减1的,当加到最大值时,再次加1就会变成0,此时就会触发计数器中断。51中常用的是16位计数器,最大值是65535,如果要计数1000次,那么计数器赋值应该为65535-1000+1(达到最大值后要再加一次才行。

2020-09-11 12:14:30 11298 1

原创 【51单片机】中断系统

什么是中断系统?中断是CPU在执行主程序过程中,被外来的中断信号打断,转而去执行中断程序,执行万中断程序后,CPU再继续执行原来的主程序。中断系统的优点:分时操作: CPU可以分时为多个I/O社保服务,提高了计算机的利用率;实时响应: CPU能够及时处理应用系统的随机事件,系统的实时性增强,没有中断,CPU必须循环处理,等到下次循环到了才能处理随机时间。可靠性高:实时性的提高,使得CPU可以及时的响应处理设备故障,掉电等突发事件,从而使系统的可靠性提高。51单片机有5个中断源:INT0,I

2020-09-10 16:43:28 2435

原创 【51单片机】LED点阵

这次的程序是通过控制LED点阵,点亮一个+号。我们使用的是一个8×8的电子,需要操作16bit,实现对行和列的管理,这点其实和矩阵按键是有些类似,只不过一个是输入,一个是输出,都是通过逐行扫描实现的(矩阵按键由于每次只检查一个按键,也可以使用行列扫描)。下面是LED点阵的原理图从上图可以看出,每一个LED都是一个发光二极管,要让某一个LED发光,就需要在一端设置为高电平(1),另一端是低电平(0);按照上图的实现,行是要设置为高电平,列设置为低电平,行列交叉的LED就会被点亮。每次可以控制一行或一列的

2020-09-10 10:08:22 1756

原创 【51单片机】74HC595芯片

74HC595芯片是一款单片机中用到的串转并的芯片,可以用着需要引脚特别多的地方,如LED点阵,LED电子通常有88,1616,3232以及更多,以1616为例,如果都直接链接在MCU上,将占用所有MCU的IO引脚,更多及借不了了,所以需要通过74HC595芯片把串口转为并口;74HC595芯片的原理图如下:注意不通电路板上标号的名字不一定一样,如SER在有的地方标为DS,但相同的是引脚号,都是14.QA-QH(15,1-7 )这个8个引脚是并口的输出引脚,QH是最高位,QA是最低位;QH’(9)

2020-09-10 09:47:44 2163

原创 【51单片机】矩阵按键

矩阵按键,顾名思义,就是形成矩阵的按键,一般由多行多列组成,如下图是一个4*4的矩阵按键;如果是独立按键,需要占用16个MCU引脚,而使用矩阵按键只需要8个其原理图如下:矩阵按照是如何检测哪个按下的呢?矩阵按键分为行和列,没有按键按下的时候,行和列是断开的,而当某一个按键按下时,改按键对应的行和列就会短接,电平会变成相同;由于矩阵键盘中没有电阻,所以当按键按下时,一个高电平和低电平短接会把高电平拉低。这也是矩阵键盘实现的基本原理。矩阵键盘有两种扫描方式:逐行扫描:高4位P17-P14链接每一行

2020-09-09 10:28:34 4888

原创 【51单片机】独立按键

独立按键就是每一个按键链接一个 MCU的引脚,每个按键之间没有任何关系,和LED 的操作类似,不过LED是写高低电平,而独立按键是读高低电平的值。如定义了独立按键为sbit K1=P3^1; 这个K1的值就是独立按键的值,当K1为0时(低电平)标识按键被按下,当K1位1时(高电平)标识按键被释放。下面是利用前面的LED和数码管实现的独立按键功能,当每次按下K1时,LED1变为相反的状态(亮变灭,灭变亮),数码管1的数字加1;按下K2时,LED2变为相反的状态,数码管2的数字加1;#include<

2020-09-08 15:10:37 3067

原创 【51单片机】动态数码管

上一节讲了静态数码管,静态数码管通过MCU上的8个引脚直接输出到一个数码管,输出的值可以直接显示在数码管上,但是如果我们有8个数码管呢?就需要8*8=64个MCU引脚,但是我们的51单片机的一共只有4个8位输出引脚,而且其他引脚还需要输出其他的内容,所以明显不够用,动态数码管就应运而生。动态数码管的原理是通过MCU上的8个引脚链接8个数码管的段引脚(如上图),也就是MCU输出的内容8个数码管都能收到,而且是一模一样。这样不就只能显示一样的内容了吗? 所以我们还需要位选引脚,确定哪个数码管生效,8个数码管

2020-09-08 11:12:06 2046 3

原创 【51单片机】静态数码管显示

什么是数码管?数码管非常常见,就是8字形管,形状很红路灯的倒计时一样,不过红绿灯是用多个LED模拟数码管,从上图可以看到一个数码管有8段组成,abcdefg七段组成数字,dp是小数点,而七段数码管就 是少了dp小数点;数码管的abcdefg分别对应P0的低7位,dp对应第8位;由于我们的是共阴极的,所以只要在对应的段上加上高电平就可以点亮这个数码管。我们的代码实现如下:#include<reg52.h>typedef unsigned char u8;typedef unsigned

2020-09-07 10:59:30 3475

原创 【51单片机】蜂鸣器程序

现在我们要写第一个蜂鸣器程序了,蜂鸣器有两种:有源蜂鸣器:内部含有震荡电路,只要输入直流电压,就可以发声;无源蜂鸣器:无震荡电路,需要输入一定频率的交流电,才可以发生,发声的频率和输入交流电的频率有关;我现在用的就是无源蜂鸣器,那如何产生交流电呢?就是给蜂鸣器的引脚不停开关,对,就是如此简单,开关的快,声音的频率就高,慢就低,废话不多说,上代码#include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;sb

2020-09-07 10:32:26 16141

原创 【51单片机】LED闪烁程序

我们已经知道如何点亮和熄灭LED了,接下来就是如何让LED闪烁了,原理其实很简单,就是让点亮LED 然后再熄灭,如此反复,程序如下:void main(){ while(1) { LED1=0; LED1=1; }}但运行起来发现LED是常亮的,明明是不停的开-关,为什么是常亮呢?因为开关的太快,了解一些显示技术的人应该知道,我们的手机电视上画面也不是静止的,而是不停的开关,由于速度够快,余辉会持续一段时间,让我们看不到熄灭的瞬间,这个也是,我们需要加上延时;下面是我们能正常运行的

2020-09-07 10:18:57 15980

原创 【51单片机】第一个程序,点亮led灯

51单片机开发工具是使用的Keil,一个继承开发环境,具体这里不做介绍,第一个程序很简单,就只有下面几行代码:#include<reg52.h>sbit LED1=P2^0;void main(){ LED1=0; while(1);}首先#include<reg52.h>, 该头文件包含了单片机定义的引脚地址,如P2的地址;有人可能问为什么是reg52.h而不是reg51.h,其实都可以的,因为我用的是89C52,所以包含了reg52.h,其实reg51.h和re

2020-09-06 22:35:40 7438

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除