0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用LED或AVR微控制器读取二进制手轮或指轮开关上的数字

454398 来源:wv 2019-10-08 09:35 次阅读

步骤1:零件列表

为了便于指导,我正在使用以下零件:

您可能需要这些

二进制手轮或指轮开关。这些可以在在线的主要电子商店购买,或者如果您在科罗拉多州,请查看Boulder的J.B. Saunders。他们便宜地买了它们!

无焊面包板

烙铁,焊料,连接线(我使用24规格绞线是因为它非常易弯曲)

AVR微控制器

我正在使用ATmega328p,它位于Modern Device裸露的主板上

我正在使用USB BUB对AVR进行编程

可选

四个LED(用于说明编码)

四个电阻(用于LED。我使用了我已经在板凳上摆了200欧姆(我很懒惰 2 ))

现代设备]

如果您要使用四个二极管关于将反向极性插入MCU引脚的偏执狂

一些用于编写或编译固件的东西

我使用AVR Studio 4.16 SP1,但是您也可以使用:

Windows

WinAVR进行Windows AVR开发

FreeBSD/Linux(其他* NIX变体)

pkg_add -r avr-gcc -or- cd /usr/ports/devel/avr-gcc/ && make install clean pkg_add -r avr-libc pkg_add -r avr-gdb

对于Linux,您将安装相同的东西,但使用特定的粒子包管理实用程序。

Mac

我在这里没有经验,所以我建议Ladyada的教程为此。

您可能还希望使用其他实用程序,例如Eclipse,但这应该是一个好的开始。

现在您已经知道需要什么,我们将其组合在一起,但是要做到这一点,您需要知道二进制开关的工作方式。..。.所以让我们继续下一步吧!

第2步:二进制开关和真实表

正如我在简介中简要提到的,二进制开关是对其进行编码的开关状态为二进制。二进制是一种使用两个离散状态(一个和零)来表示其他符号的编码方法。每个一个或零称为一个“位”,这些位通常串在一起分成八组,称为一个“字节”。并非字节中的所有位都必须用于编码,但是ASCII字符集是仅使用7位的显着示例(存在扩展版本)。此指令中的按钮开关的范围是0到15,并使用四位对表盘上的数字进行编码。

简短的二进制算术

以了解四位如何表示16种不同的数字数字,我们必须稍微了解一下二进制编码对该开关的作用(以及一般情况)。

从第一张图片中,您应该能够看到实际上从键盘背面有五个打击垫开关。这些分别标记为1、2、4、8和C。C被视为公用端子。也就是说,它是开关电路的一部分,始终与开关中打开的任何开关相连。在我的设置中,我将“ C”垫接地,并且任何电流都将从断开的开关流出,并从C端子流出并向下流至地面。因此,“ C”盘不会对表盘正面的数字进行编码时所用的位。这是指轮开关内部开关电路的电流吸收器。

1、2、4和8填充对数字的位进行编码。以二进制形式,字节中1和0的位置和数字用于确定字符集中单个单元的身份,或者出于我们的目的,确定在表盘上选择的数字。因为我们的集合中有四个位,所以一和零的唯一组合的最大数量为2 4 =16。记住这一点的最佳方法是增加可能性的数量(这里有两个可能性:1或0)乘以位数(此处我们有4位:填充1、2、4和8)。如果我们要在四个位置写出1和0的所有唯一组合,则看起来像这样:

No 1&aposs One 1 Two 1&aposs Three 1&aposs Four 1&aposs ------ ----- ------- --------- -------- 0000 0001 0011 0111 1111 0010 0101 1011 0100 1001 1101 1000 0110 1110 1010 1100

所以我们有16种独特的可能性来安排0和1,并且方便地,此开关的计数器从0到15。当一个计划组合在一起时,这很好。但是您可能想知道,是否存在一种模式来说明这四个位的排列方式(顺便称为Nibble)如何代表数字。我很高兴你问。

还记得垫的1、2、4和8吗?那不是营销人员反复无常的标签。让我们再次看看我们的数字模式。每个位位置都有一个“位置”,可以将其视为“ 2的幂”位置读取,其中最低有效位在第0位开始。也就是说,我们使用从0开始的索引,并从零开始计数到一,再到二,以此类推,而不是在以1开头的白话中计数。因此,2 0 = 1,2 1 = 2,2 2 = 4,依此类推。从右到左排列此字符,它的四位模式0101看起来像这样:

Place --》 8 4 2 1 0 1 0 1

要确定“ 0101”代表的数字,我们要做的就是找到每个里面有1的地方,加上两个数字的幂。在我们的示例中,第1和第4位有一个。加1 + 4,得到5,因此,二进制数字0101代表十进制数字5。这不令人兴奋吗?让我们尝试另一个,即使我们的交换机只有四个位,这个也要完整的8位。这是一个好习惯,下次您会印象深刻。

01101110代表的十进制数字是多少?在这里是它们的位置:

128 64 32 16 8 4 2 1 0 1 1 0 1 1 1 0查找具有1的位置,并将这些位置号加在一起。那将是64 + 32 + 8 + 4 + 2 =110。非常容易,是吧?现在知道了这一点,我们就可以采用我们的4位开关,并形成一个相对于小数点为1的引脚号矩阵(数字逻辑1的电压高于逻辑零的电压,在我们的情况下分别为5V和0V)。他们代表的数字。参见下面的第二张图片,我制作了一个表格来表示开关上的打击垫,根据拨盘前面选择的数字,该打击垫将为逻辑1。现在我们可以开始构建东西了。请跟随我进入下一步!

步骤3:焊接开关和测试二进制逻辑

是时候将焊料放到焊盘上了,开始制造东西了。

拿起连接线,剥去两端约半厘米。只要使用不会混淆电线的颜色,无论使用哪种颜色或根本不使用其他颜色都没有关系。当您发现填充板“ 2”代替填充板“ 4”时,您将尝试调试二进制逻辑错误。

现在是验证或说服自己二进制逻辑正确的好时机。为此,我带了四个LED和四个220欧姆电阻,并将它们放在面包板上。您可以根据您的LED颜色和正向电压要求使用180欧姆甚至1k电阻。对于您的电源,您可以使用5V稳压电源(在其中一张照片中,这是我的面包板上悬挂的小电路),也可以通过Arduino,BBB等为该板供电。选择是您自己选择。

将C线连接到5V(请注意这一点,因为在连接到微控制器时会做相反的事情)。

连接线1、2、4 8个至自己的电阻,其后接LED的正极。如果您不确定,那是长腿。然后将LED的另一侧接地。

该电路应类似于我下面的电路。如果您真的不确定,请在图片中包含原理图以显示LED测试电路。还请注意,我在图片中从左到右显示了二进制文件。只要电线连接到正确的LED,就可以将电线从左到右或从右到左连接到测试电路中,并且可以将它们与真值表进行比较以确认逻辑,这无关紧要。

一旦您确信该Universe可以按照您可以连接微控制器的方式正常运行。

第4步:连接微控制器并加载代码

选择MCU上空闲的四个端口并将其配置为输入。我在设置中选择了PD [2..5],但是选择哪一个都没关系,如果您打算使用U(S)ART通信,请谨慎使用PD [0..1],因为这些引脚是通常为此保留。我很确定Arduino和其他克隆也将针脚0和1映射到其USB FTDI端口。作为一种可选措施,您可以选择安装二极管(在右侧条纹下方的图片中)。有些主板具有保护功能,但是如果您在主板上玩裸AVR芯片,那可能不是个坏习惯。在闻到足够多的晶体管烧毁之后,您便可以执行这些操作。

建立与输入引脚的连接后,只需简单地读取引脚并处理数据即可。您可以读取引脚和发光二极管的指示灯,用于处理串行通信的设置中断,或者如果将多个开关串在一起,则可以将它们用作电子锁,在授予访问权限之前测试引脚以查看是否输入了正确的组合

第5步:[可选] AVR代码示例

好的,好的,我不会让您挂断电话。我认为您可能都具备读取I/O引脚的能力,因此这并不意味着侮辱您的智慧。这只是我写的一小段代码,用于读取引脚并通过ATmega328p中的USART将数据发送到FreeBSD盒上的串行端口。

我不使用Arduino库,仅使用纯C语言,因此您可能必须相应地调整您的。也许有一种更优雅的方法,但这是我想出的。

#include #include #include “uart.h”#define SWITCH_M 0b00111100int main(){ USART_init(BAUD_9600); DDRD = 0x00; // inputs for switches PORTD = 0xFF; // pullup on PD[2..5] (we have negative logic on switch now) uint8_t bcode = 0x00; for (;;) { bcode = (PIND & SWITCH_M); // bcode = 00xxxx00 bcode = (bcode 》》 2); // bcode = 0000xxxx bcode |= 0xF0; // bcode = 1111xxxx USART_tx(~bcode); // bcode = 0000xxxx bcode = 0x00; _delay_ms(2000); } }

从我的车轮开关从0开始并循环向上,我得到以下输出:

0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22416

    浏览量

    645765
  • AVR微控制器
    +关注

    关注

    0

    文章

    11

    浏览量

    6786
收藏 人收藏

    评论

    相关推荐

    如何实现二进制和BCD码数据的相互转变?

    如何实现二进制和BCD码数据的相互转变? 二进制码是将十进制数字表示为二进制数和十进制数的一种表示方法。在计算机系统中,
    的头像 发表于 02-18 14:51 383次阅读

    二进制与逻辑电平的变化范围

    二进制中的两个数字0和1称为位(bit, 是二进制数字binary digit的缩写)。在数字电路中,使用两个不同的电平表示这两个位。一般情况下,1 用高电平表示,0用低电平表示,这种
    的头像 发表于 02-04 16:54 518次阅读
    <b class='flag-5'>二进制</b>与逻辑电平的变化范围

    二进制、八进制、十六进制在现实当中有什么意义?

    ,我们可以从数字存储和数据传输的角度来看这些进制的意义。计算机内部使用的是二进制,即由0和1组成的数字系统。这是因为计算机中的所有数据都被转化为二进
    的头像 发表于 01-16 11:14 554次阅读

    10进制转换为二进制的算法

    的基本原理。十进制数是我们日常生活中最常见的数字系统,它由0到9十个数字组成。而二进制是计算机科学中使用的数字系统,它只由0和1两个
    的头像 发表于 01-15 10:32 553次阅读

    你知道十进制二进制如何进行转换吗?

    你知道十进制二进制如何进行转换吗? 当我们提到数字系统时,最常见的是十进制系统和二进制系统。十进制
    的头像 发表于 12-20 17:05 656次阅读

    ldr文件能否转成二进制16进制文件?

    1 ldr文件能否转成二进制16进制文件?想用MCU加载ldr文件! 2 生成的ldr文件可以通过CCES或者VDSP++软件烧录到flash中,但是这种方法太慢了,效率低,不适合批量生产。可不可以用flash烧录
    发表于 11-30 08:16

    进制、十六进制二进制数制的区别

    计算机内部一般也是8位的倍数(8位= 1字节),所以每个字节可以方便地用2个十六进制数字表示。对于工程师来说,这比长的二进制数字序列更容易处理,但是计算机内部仍然是以2为基数的二进制数字
    的头像 发表于 11-28 10:45 627次阅读
    十<b class='flag-5'>进制</b>、十六<b class='flag-5'>进制</b>和<b class='flag-5'>二进制</b>数制的区别

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两种?

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两种? 二进制最佳接收原理是计算机通信中的重要概念,它是指在二进制通信中通过一定的方法,使接收机在信号传输过程中能够准确、可靠地接收到
    的头像 发表于 11-27 16:19 552次阅读

    请问bcd码和二进制有什么关系?

    这个bcd码和二进制有什么关系? bcd 表示0011001是19(十进制) 二进制表示0011001是25(十进制) 这个怎么确定是哪个???
    发表于 10-07 06:02

    M451如何丢弃函数的二进制代码填入SRAM的二进制代码

    应用程序 : 示例代码演示了如何丢弃函数的二进制代码, 然后填入 SRAM 的二进制代码, 然后调用它 。 BSP版本:M451系列BSP V3.01.001 硬件: 任何 M451 系列板块
    发表于 08-30 07:35

    如何读取二进制文件,IAR怎么输出二进制BIN文件

    IAR怎么输出二进制BIN文件?
    发表于 08-28 17:19

    如何丢弃函数的二进制代码填入SRAM的二进制代码?

    应用程序 : 示例代码演示了如何丢弃函数的二进制代码, 然后填入 SRAM 的二进制代码, 然后调用它 。 BSP版本:M451系列BSP V3.01.001 硬件: 任何 M451 系列板块
    发表于 08-23 06:34

    二进制数开源分享

    电子发烧友网站提供《二进制数开源分享.zip》资料免费下载
    发表于 06-26 11:40 0次下载
    <b class='flag-5'>二进制</b>数开源分享

    构建LED二进制计数器

    电子发烧友网站提供《构建LED二进制计数器.zip》资料免费下载
    发表于 06-12 09:54 0次下载
    构建<b class='flag-5'>LED</b><b class='flag-5'>二进制</b>计数器

    基于AT89C51单片机TIMER0控制LED二进制计数仿真及代码

    基于AT89C51单片机TIMER0控制LED二进制计数仿真及代码
    发表于 05-04 14:36 1次下载