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
    +关注

    关注

    242

    文章

    23158

    浏览量

    658658
  • AVR微控制器
    +关注

    关注

    0

    文章

    11

    浏览量

    6801
收藏 人收藏

    评论

    相关推荐

    hex格式和二进制的区别

    。 它以ASCII文本形式表示的十六进制数据,每两个十六进制字符对应一个字节。 HEX文件包含了记录类型、数据长度、地址、数据以及校验和等信息,具有结构化且包含校验码的特点。 二进制二进
    的头像 发表于 11-18 15:24 302次阅读

    二进制编码的精度与分辨率

    数字电子系统中,二进制编码扮演着至关重要的角色。它负责将外部世界的模拟信号转换为计算机可以理解的数字信号。精度和分辨率是衡量二进制编码
    的头像 发表于 11-06 09:56 239次阅读

    二进制编码在自动化领域的作用

    二进制编码是一种将二进制信号转换为数字信号的电子设备,广泛应用于自动化领域。 一、二进制编码
    的头像 发表于 11-06 09:53 238次阅读

    二进制编码的故障排除指南

    二进制编码是一种将二进制信号转换为数字信号的电子设备,广泛应用于计算机、通信和自动化控制系统中。当二进
    的头像 发表于 11-06 09:49 236次阅读

    二进制编码的种类及特点

    二进制编码是一种电子电路,用于将二进制信号转换为其他格式,如十进制、格雷码等。以下是一些常见的二进制编码
    的头像 发表于 11-06 09:47 298次阅读

    二进制编码应用场景 二进制编码与模拟编码比较

    编码是将信息从一种形式格式转换为另一种形式的设备。在数字和模拟系统中,编码扮演着至关重要的角色。二进制编码
    的头像 发表于 11-06 09:45 282次阅读

    二进制编码工作原理 如何选择二进制编码

    二进制编码是一种数字电路,它将输入的二进制代码转换为对应的输出信号。在数字系统中,编码器用于将数据从一种形式转换为另一种形式,以便于处理和
    的头像 发表于 11-06 09:44 336次阅读

    二进制补码及与原码的互相转换方法

    表示负数。其余位表示数值的大小。 二进制补码‌是一种用于表示有符号整数的二进制编码方式,常用于‌计算机系统中。在补码系统中,一个数字的补码是通过对其原码进行位取反(即一补数反码),然
    的头像 发表于 09-19 22:25 394次阅读

    二进制串行计数工作原理是什么?

    数字电路设计中,计数是一种非常关键的组件,用于测量时间、计数事件跟踪状态变化等。其中,二进制串行计数作为一种常用的计数
    的头像 发表于 05-28 15:52 767次阅读

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

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

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

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

    鸿蒙二进制数组创建

    背景 c++层数据都是二进制,需要转换成arrayBuffer透传到ets层给业务使用,但是鸿蒙的使用下面两个api创建出来的二进制数组数据都是错误的。 接口
    的头像 发表于 01-31 15:24 1225次阅读

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

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

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

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

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

    10进制转换为二进制是计算机领域中非常重要的一个问题。在计算机中,所有的数据都是以二进制形式进行存储和处理的。因此,我们常常需要将10进制数转换为
    的头像 发表于 01-11 09:14 2259次阅读