输入设备在任何电子项目中都起着至关重要的作用。这些输入设备可帮助用户与数字世界互动。输入设备可以像按钮一样简单,也可以像触摸屏一样复杂。它根据项目的要求而变化。在本教程中,我们将学习如何将操纵杆与PIC微控制器接口,操纵杆是与数字世界进行交互的一种很酷的方式,几乎每个人在青春期都将使用操纵杆来玩视频游戏。
游戏杆看似是一个复杂的设备,但实际上它只是两个电位计和一个按钮的组合。因此,只要我们知道如何使用该MCU的ADC功能,就可以很容易地与任何MCU进行接口。我们已经学习了如何将ADC与PIC一起使用,因此这只是与操纵杆接口的一种替代方法。建议新手入门学习上述ADC项目以及LED闪烁序列项目,以使其更易于理解。
所需材料
- PicKit 3用于编程
- 操纵杆模块
- PIC16F877A集成电路
- 40-引脚IC支架
- 穿孔板
- 20 MHz晶振OSC
- Bergstik针
- 220ohm电阻
- 任何颜色的5个LED
- 1个焊接套件
- IC 7805
- 12V适配器
- 连接线
- 面包板
了解操纵杆模块:
操纵杆有不同的形状和尺寸。 下图显示了一个典型的 操纵杆模块。游戏杆不过是安装在智能机械装置上的几个电位器和按钮。电位计用于跟踪操纵杆的X和Y移动,按钮用于感测是否按下了操纵杆。两个电位器都输出一个模拟电压,该电压取决于操纵杆的位置。通过使用一些微控制器解释这些电压变化,我们可以获得运动的方向。以前,我们将操纵杆与AVR连接,将操纵杆与Arduino和Raspberry Pi连接。
在将任何传感器或模块与微控制器接口之前,重要的是要了解其功能。这里的操纵杆有5个输出引脚,其中两个用于电源,三个用于数据。该模块应使用+ 5V供电。数据引脚被命名为VRX,VRY和SW。
术语“ VRX”代表X轴上的可变电压,术语“ VRY”代表Y轴上的可变电压,“ SW”代表开关。
因此,当我们向左或向右移动操纵杆时,VRX上的电压值将发生变化,而当我们向上或向下进行变化时,VRY也会发生变化。类似地,当我们对角移动它时,VRX和VRY都会变化。当我们按下开关时,SW引脚将接地。下图将帮助您更好地了解输出值
电路原理图:
现在我们知道操纵杆的工作原理,我们可以得出一个结论,我们将需要两个ADC引脚和一个数字输入引脚来读取操纵杆模块的所有三个数据引脚。完整的电路图如下图所示
正如您在电路图中所看到的,我们使用两个电位计RV1和RV3代替了操纵杆,作为模拟电压输入和开关的逻辑输入。您可以遵循紫色标记,以匹配引脚名称并进行相应的连接。
注意,模拟引脚连接到通道A0和A1,数字开关连接到RB0。我们还将连接5个LED灯作为输出,这样我们就可以根据操纵杆的移动方向发光一个。因此,这些输出引脚从RC0到RC4连接到端口C。平移电路图后,我们可以继续进行编程,然后在该电路上模拟程序,然后在面包板上构建电路,然后将程序上载到硬件。为了给您一个想法,完成上述连接后,我的硬件如下所示
操纵杆接口编程:
将操纵杆与PIC接口的程序非常简单明了。我们已经知道操纵杆连接到哪个引脚以及它们的功能是什么,因此我们只需要从引脚读取模拟电压并相应地控制输出LED。
本文档的末尾给出了完成此操作的完整程序,但是为了解释这些内容,我将代码分成以下有意义的小片段。
通常,程序都是通过设置配置位来启动的,因此,我们将不再讨论设置设置位的问题,因为我们已经在LED闪烁项目中学到了此设置,并且该项目也是如此。一旦配置位被置位,我们就必须定义ADC功能以在PIC中使用ADC模块。在如何将ADC与PIC教程一起使用时也了解了这些功能。之后,我们必须声明哪些引脚是输入引脚,哪些是输出引脚。这里的LED连接到PORTC,因此它们是输出引脚,操纵杆的Switch引脚是数字输入引脚。因此,我们使用以下几行进行声明:
// ***** I / O配置**** // TRISC = 0X00; // PORT C用作输出端口 PORTC = 0X00; //使所有引脚为低 TRISB0 = 1; // RB0用作输入 // *** I / O配置结束** ///
该ADC引脚不需要被定义为输入使用,将被指定为输入引脚的ADC功能时,因为销。定义引脚后,我们可以调用 我们先前定义的 ADC_initialize 函数。该功能将设置所需的ADC寄存器并准备ADC模块。
ADC_Initialize(); //配置ADC模块
现在,我们进入无限的 while 循环。在此循环中,我们必须监视VRX,VRY和SW的值,并基于这些值来控制LED的输出。我们可以通过使用以下几行读取VRX和VRY的模拟电压来开始监视过程
int joy_X =(ADC_Read(0)); //读取操纵杆的X轴int joy_Y =(ADC_Read(1)); //读取操纵杆的Y轴
该行将分别将VRX和VRY的值保存在变量 joy_X 和 joy_Y中 。函数 ADC_Read(0) 表示我们正在从通道0(引脚A0 ) 读取ADC值。我们已经将VRX和VRY连接到引脚A0和A1,因此我们从0和1进行读取。
如果您可以从我们的ADC教程中重新获得信息,则我们知道我们读取了模拟电压,作为数字设备的PIC将从0到1023读取它。该值取决于操纵杆模块的位置。您可以使用上面的标签图来了解对于操纵杆的每个位置可以期望得到什么值。
在这里,我使用极限值200作为下限,使用极限值800作为上限。您可以使用任何您想要的东西。因此,让我们使用这些值并开始相应地使LED发光。为此,我们必须使用IF回路将 joy_X 的值与预定义的值进行比较,并如下所示将LED引脚设为高电平或低电平。评论行将帮助您更好地理解
if(joy_X <200)// Joy上移 {RC0 = 0; RC1 = 1;} // 如果(joy_X> 800)//则使 上方的LED发光// Joy向下移动{RC0 = 1; RC1 = 0;} //发光下部LED 否则//如果未移动 {RC0 = 0; RC1 = 0;} //关闭两个LED
同样,我们也可以对Y轴的值执行相同的操作。我们只需要用 joy_Y 替换变量 joy_X 并控制下两个LED引脚,如下所示。请注意,当不移动操纵杆时,我们将同时关闭两个LED灯。
if(joy_Y <200)// Joy向左移动 {RC2 = 0; RC3 = 1;} // 如果(joy_Y> 800)则 向左发光,否则// Joy向右移动{RC2 = 1; RC3 = 0;} //右发光LED 否则//如果未移动 {RC2 = 0; RC3 = 0;} //关闭两个LED
现在我们还有最后一件事要做,我们必须检查开关是否按下。开关引脚连接到RB0,因此我们可以再次使用if循环并检查其是否导通。如果按下该按钮,我们将转动LED指示已按下该开关。
if(RB0 == 1)//如果按下Joy键RC4 = 1; //发光的中间LED否则RC4 = 0; //关闭中间LED
仿真视图:
可以使用Proteus软件来模拟整个项目。一旦编写了程序,就编译代码并将仿真的十六进制代码链接到电路。然后,您会注意到LED灯根据电位计的位置发光。仿真如下所示:
硬件和工作方式:
使用Simulation验证代码后,我们可以在面包板上构建电路。如果您一直在关注PIC教程,您会发现我们使用的性能评估板与PIC和7805电路焊接在一起。如果您也有兴趣制作一个电路,以便将其与所有PIC项目一起使用,则将电路焊接在性能板上。或者,您也可以在面包板上构建完整的电路。硬件完成后,如下所示。
现在,使用PICkit3将代码上传到PIC单片机。您可以参考LED闪烁项目以获取指导。程序上传后,您应该注意到黄灯变高。现在,使用操纵杆并改变旋钮,对于操纵杆的每个方向,您都会注意到相应的LED变高。当按下中间的开关时,它将关闭中间的LED。
这项工作只是一个示例,您可以在其上构建许多有趣的项目。该项目的完整工作也可以在本页末尾的视频中找到。
希望您理解该项目并喜欢构建它,如果这样做有任何问题,请随时将其发布在下面的评论部分,或将其写在论坛上以获得帮助。