单片机

单片机是嵌入式系统的核心元件,使用单片机的电路要复杂得多,但在更改和添加新功能时,带有单片机的电路更加容易实现,这也正是电器设备使用单片机的原因。那么在单片机电路的设计中需要注意的难点有哪些?你都解决了吗?下面分享10个单片机电路设计中的难点,一起来学习吧~

1、单片机上拉电阻的选择

“”

“”

大家可以看到复位电路中电阻R1=10k时RST是高电平 ,而当R1=50时RST为低电平,很明显R1=10k时是错误的,单片机一直处在复位状态时根本无法工作。出现这样的原因是由于RST引脚内含三极管,即便在截止状态时也会有少量截止电流,当R取的非常大时,微弱的截止电流通过就产生了高电平。

2、LED串联电阻的计算问题

通常红色贴片LED:电压1.6V-2.4V,电流2-20mA,在2-5mA亮度有所变化,5mA以上亮度基本无变化。

“”

3、端口出现不够用的情况

这时可以借助扩展芯片来实现,比如三八译码器74HC138来拓展。

“”

“”

4、滤波电容

滤波电容分为高频滤波电容和低频滤波电容。

1、高频滤波电容一般用104容(0.1uF),目的是短路高频分量,保护器件免受高频干扰。普通的IC(集成)器件的电源与地之间都要加,去除高频干扰(空气静电)。

2、低频滤波电容一般用电解电容(100uF),目的是去除低频纹波,存储一部分能量,稳定电源。大多接在电源接口处,大功率元器件旁边,如:USB借口,步进电机、1602背光显示。耐压值至少高于系统最高电压的2倍。

5、三极管的作用

1)开关作用:

“”

LEDS6为高电平时截止,为低电平时导通。

限流电阻的计算:集电极电流为I,则基极电流为I/100(这里涉及到放大作用,集电极电流是基极的100倍),PN结电压0.7V,R=(5-0.7)/(I/100)

2)放大作用:集电极电流是基极电流的100倍

3)电平转换:

“”

当基极为高电平时,三极管导通,右侧的导线接地为低电平,当基极为低电平时,三极管截止,输出高电平。

6、数码管的相关问题

“”

数码管点亮形成的数字由a,b,c,d,e,f,e,dp(小数点)构成,字模及真值表如上图。

7、电流电压驱动问题

由于单片机输出有限,当负载很多的时候需要另外加驱动芯片 ,比如74HC245。

8、上拉电阻

上拉电阻选取原则

1、从节约功耗及芯片灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能会导致边沿变平缓。

综合考虑:上拉电阻常用值在1K到10K之间选取,下拉同理。

上下拉电阻,上拉就是将不确定的信号通过一个电阻嵌位在高电平,下拉同理。

1)电平转换,提高输出电平参数值。
2)OC门必须加上拉电阻才能使用。
3)加大普通IO引脚驱动能力。
4)悬空引脚上下拉抗干扰。

9、晶振和复位电路

晶振电路

1)晶振选择:

根据实际系统需求选择,6M,12M,11.0592M,20M等待。

2)负载电容:

对地接2个10到30pF的电容即可,常用20pF。

3)万用表测晶振:

直接用红表笔对晶振引脚,黑表笔接GND,测量电压即可。复位电路把单片机内部电路设置成为一个确定的状态,所有的寄存器初始化。

51单片机的复位时间大约在2个机械周期左右,具体需要看芯片数据手册。一般通过复位芯片或者复位电路,具体的阻容参数的计算,通过google查找。

10、按键抖动及消除

按键也是机械装置,在按下或放开的一瞬间会产生抖动,如下图:

“”

消除方法有两种:软件除抖和硬件除抖,其中硬件除抖是应用了电容对高频信号短路的原理。

软件除抖是检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

来源:凡亿PCB
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 46

想必大家对蓝牙都不陌生,平时或多或少都用过,但单片机中的蓝牙模块是怎样的呢?这一期的干货将带你走进蓝牙模块的世界。

1、蓝牙模块简介

蓝牙模块是一种常用的无线通信模块,广泛应用于各种各类智能设备。无线蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于短距离2.4G的无线通讯模块。

对于最终用户来说,蓝牙模块是半成品,通过在模块的基础上功能再开发、封装外壳等工序,实现能够利用蓝牙通讯的最终产品。其中低功耗蓝牙模块(BLE)是指支持蓝牙协议4.0或更高的模块,也称为BLE模块。

“JDY-31"
JDY-31

“
HC-05
更多蓝牙模块小伙伴们可自行搜索

2、版本

蓝牙版本有V1.0、V2.0、V3.0、V4.0,最新的是V4.0,蓝牙向下兼容,比如带有V2.0的手机不能搜索识别蓝牙3.0的模块,反过来则可以。

由于苹果设备对蓝牙设备进行特殊设置,所以V4.0之前的蓝牙串口模块不能直接应用于苹果。使用苹果的朋友如果遇到手机与蓝牙模块配对不成功的情况,可以试试在应用商店搜索LightBlue,至于LightBlue的使用方法,小编也不太清楚,有需要的小伙伴可以去摸索摸索(或者另外买个安卓的~)。

3、工作模式

蓝牙模块具有两种工作模式:

命令响应工作模式和自动连接工作模式。

当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行 AT 命令,用户可向模块发送各种 AT 指令,为模块设定控制参数或发布控制命令。

AT 指令只能在模块未连接状态下才能生效,一旦蓝牙模块与设备连接上,蓝牙模块即进入数据透传模式(AT指令是应用于终端设备与PC应用之间的连接与通信的指令,AT 即Attention。AT指令是以AT作首,以字符结束的字符串,AT指令的响应数据包含在其中。每个指令执行成功与否都有相应的返回。)
不同的蓝牙模块对应的蓝牙AT指令集是有差别的,一般在卖家提供的蓝牙模块中文数据手册中,里面都有对应的AT指令集。

4、配置

将蓝牙模块与usb转ttl的RXD、TXD、GND、VCC连接好,按着蓝牙模块上的小按键不放,然后上电(按住上电是配置模式,直接上电是正常使用模式),使用蓝牙测试软件,让模块进入绝对AT模式,获取模块信息,可以得到蓝牙模块的信息。

通常配置波特率、主从机、配对密码,可以设置模块参数,设置设备名称、连接密码等。须确定波特率一致,不然会出现乱码而不能成功地进行之间的信息互传。

蓝牙模块可以当全双工串口使用,无需了解复杂的蓝牙协议。

5、硬件连接

和连接转换模块一样,蓝牙模块的RX连接单片机的TX,蓝牙模块的TX连接单片机的RX,还有VCC和GND管脚连上就好了,其他管脚通常不用管。

6、程序

下面这个程序是用手机连接蓝牙,在蓝牙串口助手发送1,单片机执行数码管显示函数,发送0,数码管灭。

主函数

“”"

在中断中接收数据

“”"

51单片机的串口中断是一个字节一个字节地接收数据的,比如手机向单片机发送了数据“123”,单片机中的中断函数会进入三次,把数据“123”分三次接收完,一次接收一个字符。

7、手机端操作

手机连接蓝牙,通过手机蓝牙串口助手发送数据(蓝牙串口助手直接在手机应用商店找)。
蓝牙模块有带一个指示灯,在连接成功蓝牙之前,蓝牙上面的红灯一直在闪烁,成功连接后,红灯会停止闪烁,每发送一条指令,电脑端的串口调试助手就能收到手机端发送的消息。

“”

大部分蓝牙串口app能修改手机页面的按键名称,可根据需要自行修改。

调试好了蓝牙模块和手机之间的通信之后,可以通过手机蓝牙串口调试助手发送一些字符,让单片机执行特定的命令。可以尝试做一个蓝牙遥控小车,控制家电开关通断等等。

以上是一个简单的蓝牙模块的使用,还有各种神操作就让大家自己去尝试啦~

本文转载自:华师无协
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。

围观 431

在入门单片机时,想必大家都都会遇到一下这种情况:

unsigned char a = 0x12;
unsigned char b = 0x34;
unsigned int c = 0;

如何把两个8位数据合在一起变成16位数据呢?

一般情况下大家都会这样做,我最初是也是这么做的。

方法1 【使用移位指令】

 int c = (a<<8)|b;

方法2 【使用指针】

unsigned char *cptr;
cptr = (unsigned char*)(&d);
cptr[0] = a;
cptr[1] = b;

方法3 【强制指针类型转换】

*((unsigned char*)(&d)) = a;
*((unsigned char*)(&d)+1) = b;
或
((unsigned char*)(&d))[0] = a;
((unsigned char*)(&d))[1] = b;

以上这三种方法都是没有错误的,但在keil编译器中编译出的结果是不一样的。第三种方法编译出的代码会更简洁。

今天就交给大家第4种方法

方法4 【联合体】

typedef union{
unsigned int i;
unsigned char c[2];
}u_int;
unsigned char dH = 0x11, dL=0x22;
unsigned int d;
u_int ud;
ud.c[0] = dH;
ud.c[1] = dL;
d = ud.i;
此时d = 0x1122;

这里就是利用了联合体union的特性来实现把两个8位数据合并成一个16位数据的方法。在C语言里操作指针最容易出现错误,所以在遇到这样类似的问题,大家不妨使用联合体的方式进行处理数据,既不容易出现错误,生成的代码又简洁。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 25

在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案。

一是 GPIO 口直接检测单个按键,如图1.1所示;

二是按键较多则使用矩阵键盘,如图1.2所示;

三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;

四是利用单片机的 ADC,在不同的按键按下后,能够使得 ADC 接口上的电压不同,根据电压的不同,则可以识别按键,如图 1.4 所示。

“图
图 1.1 方案一

“图
图 1.2 方案二

“图
图 1.3 方案三

“图
图 1.4 方案四

在以上四种设计上,各有优点和不足。

第一种,是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。

第二种,优点是能够在有限的 GPIO 情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。

第三种,是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用。

第四种,优点是,只需要单片机的一个 ADC 接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。

在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。

改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图 1.5 所示。只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。

“图
图 1.5 改进一

改进二:在原有的 ADC 按键的基础上,也可用增加二极管的方式,实现按键中断,并在中断服务程序里进行 AD 转换,从而识别按键。电路如图 1.6 所示。

“
图 1.6 改进二

改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消抖和软件消抖。现在分享一个十分简单且有效的硬件消痘方法:给按键并联一个 104 左右的电容。软件上基本不用处理即可避免抖动。

改进四:在按键扫描检测的方案下,如果主循环中有某个函数占用时间较长,则按键会发生或长或短的“失灵”,现分享我的一个解决方案。将按键扫描放到定时器中断里面,这样就可周期性地检测按键按下情况,不受主循环的影响。并且,能解析出按键的不同状态,即按下、按住、弹起、未按下这四种状态,用以实现更丰富的功能。

但需注意两点:

一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。

二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。

本文转载自:multisim
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 474

对于单片机程序占了多少字节?单片机还剩多少存储空间?

想必你看到这篇文章时对这两个问题也很迷糊吧,接下来我就把自己所了解到的关于单片机程序占用空间大小的问题做一个整理,方便自己也方便他人。

1、STM32类单片机在程序编译后会出现下面图片中所示内容

“”

上图中分别有Code、RO-data、RW-data、ZI-data,

Code:表示所要执行的代码,程序中所有的函数都位于此处。

RO-data:表示只读数据,程序中所定义的全局常量数据和字符串都位于此处。

RW-data:表示已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。

ZI-data:表示未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处。

通过上面的描述就可以看出:

  • 下载到单片机FLASH的程序是:Code+RO-data+RW-data(上图中数据为字节数,kb=byte/1024);

  • 运行在RAM中的数据是:

    RW-data+ZI-data;

2、51类单片机编译后会有如下画面

“”

上图分别有data、xdata、const、code。

data:片内RAM区消耗。

xdata:片内扩展区RAM区消耗。

code:表示所要执行的代码,程序中所有的函数都位于此处。

下载到单片机FLASH中的程序大小为:code+const

下载到单片机RAM的大小为:data+xdata

本文来源:博客园-Brianzhangzhang,转载请注明出处!
原文链接:
https://www.cnblogs.com/brianblog/p/7117896.html

围观 217

1、单片机内部需要储存器、累加器,这些都需要逻辑门电路。比如锁存器就是一个D触发器,而触发器的置1、清0、置数的功能都需要跳变沿。D触发器就是上升沿后存入数据,而这个上升沿就得外部提供脉冲,这就是脉冲信号 ,而这个脉冲信号就是我们稳定的时钟信号。

2、单片机运行需要时钟支持—–就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。单片机可以看成是在时钟驱动下的时序逻辑电路。

以MCS–51单片机为例:MCS–51单片机为12个机器周期执行一条指令,也就是说单片机运行一条指令必须要用12个时钟周期。没有这个时钟,单片机就跑不起来,也就没办法定时和进行和时间有关的操作。

时钟电路是微型计算机的心脏。CPU就是通过复杂的时序电路完成不同的指令功能的。MCS—51的时钟信号可以由两种信号产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号;另一种为外部方式,时钟信号由外部引入。

3、电路中的晶振即石英晶体震荡器。由于晶振具有非常好的频率稳定性和抗外界干扰的能力,所以,晶振是用来产生时钟信号的,通过时钟信号来控制电路工作。 晶振的应用范围是非常广的,它的质量、频率精度也是差别很大的。通讯系统用的信号发生器的信号源,绝大部分也用的是石英晶体振荡器,通讯系统对晶振的精准度也有比较高的要求。 晶振是时钟电路中最重要的部件,它的主要作用是向显卡、网卡、主板等配件的各部分提供基准频率,它就像个标尺,工作频率不稳定会造成相关设备工作频率不稳定,自然容易出现问题。 晶振在数字电路的基本作用是提供一个时序控制的标准时刻。数字电路的工作是根据电路设计,在某个时刻专门完成特定的任务,如果没有一个时序控制的标准时刻,整个数字电路就会成为“聋子”,不知道什么时刻该做什么事情了。

首先我们要明确的一点是,单片机是一个集成芯片,它是由非常复杂的数字电路和其他电路集成的。而数字电路包括时序逻辑电路,可以说,没有时序,就没有数字电路,也就没有单片机。所以,单片机离不开时钟。

其二,单片机中的众多寄存器,存储器等是由D触发器构成,而操作D触发器就需要时钟沿,自然也就离不开时钟。

其三,单片机执行程序需要一个程序计数器,而程序计数器是与时钟脉冲直接挂钩的,每来一个时钟脉冲,程序计数器就加1。就像上面提到的那样,51单片机每12个时钟周期就执行一条程序,没有时钟,单片机就没法执行程序。

所以,说时钟就像是单片机的”心脏”,恰当至极。

本文转载自:博客园(博主:轻轻的吻)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 174

页面

订阅 RSS - 单片机