2024-09-01
售卖作品
00

目录

1 烧写程序
2 LCD1602
3 PCF8591
4 独立按键
5 直流电机
6 小灯
7 DS1302
8 DS18B20
9 蜂鸣器
10 数码管
11 光敏电阻
12 串口发数据
13 EEPROM AT24C02
14 矩阵键盘
15 红外遥控器
16 如何为某个节点添加上拉电阻

基础操作需要看一下以下的博客,跟着走一遍。

安装MPLAB V4.05+XC8 V1.41,老师不会管你用什么版本,别的版本bug多,老版本反而好用:

https://blog.csdn.net/x1131230123/article/details/100907773

安装proteus 8.9:

https://blog.csdn.net/x1131230123/article/details/106951776

做一个基础实验(想改写到MPLAB V5+XC8 V2也看这里的博客6.3 移植操作指南):

https://blog.csdn.net/x1131230123/article/details/108757436

实物连接指南(持续更新):

https://blog.csdn.net/x1131230123/article/details/108780168

多机仿真需要额外学习这个链接的内容(当题目需要用到多块单片机):

https://blog.csdn.net/x1131230123/article/details/108934292

1 烧写程序

前面我们已经利用MPLAB生成了hex文件,并把hex文件弄到proteus进行单片机仿真了。

这一节关注的就是怎么把hex文件弄到单片机实物上去运行。

这个就看《 单片机原理及应用(PIC 单片机)实验指导书》实验里第四章节内容。

在这里插入图片描述

2 LCD1602

仿真图里只关心数据线,电源线无所谓,所以可以看到下图里LCD1602就7根线好好接到了单片机,而别的引脚都可以不接。但在实物中需要关注得更多。

在这里插入图片描述

实物样子:

在这里插入图片描述

实物电路图:

在这里插入图片描述

从电路图就可以看到LCD1602很多引脚都是在PCB里连接了的:比如3号引脚就是接了一个滑动变阻器R40的,在实物图中也可以看到R40(蓝色的那个,可以用螺丝刀扭它),这个滑动变阻器作用就是调节LCD显示对比度的,在后面下载了程序缺看不到显示,就能看到很多黑色格子,这时调节一下这个动变阻器改变对比度或许是有用的。

此外应该关注到,J10跳线应该短接,这样VCC电源才能和LCD1602-VCC节点连接,相当于这是给LCD1602供电的设置,如果不短接,相当于电源断路,LCD1602不会工作。

关注了上面2点后,我们就可以关注到信号线了,我们应该像仿真图里的连接那样,将7根信号线连接好。

为什么我们没用仿真图里LCD1602的D0 D1 D2 D3信号线呢?

专注下面几个点:LCD1602可以8线控制,D0到D7都连接;我们这种接法是4线接法,只用连接D4 D5 D6 D7;4线接法比8线更加节省单片机引脚,利于资源充分利用;教科书上用的4线接法,有现成程序;我有试过8线控制,结果是仿真能好好运行,实物却不工作,这个时候需要调试时序;我手里没有PIC板子,所以不可能调试时序;4线和8线的程序不一样的。

或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。

[如果你想学习LCD1602更多,请点我]

LCD1602的程序为啥那么写?能解释一下吗?个人看法

是教科书的程序,想要深入研究可以百度一下LCD1602的用户手册;我们更关心怎么用它,想要它显示字符需要做2件事,第一件事就是调用函数LCD_CSH()初始化它,第二件事就是想要在第0列第1行的位置上显示字符串hello就应该这么写:LcdWriteString( 0, 1, "hello" ); 这类底层程序是非常基础的程序,不需要重复造轮子,百度一下现成程序知道怎么用就好。举个例子,下面这个函数,无非就是让单片机引脚依照LCD1602控制时序改变引脚高低电平,懂得深与浅又能怎么样呢,下次你想自己写个程序的时候,第一时间还是去复制粘贴上次写的,而不是翻着手册把下面这个函数再写一遍。

c
/* LCD写命令 */ void LCD_WRITE( unsigned char R1, unsigned char FLAG ) { unsigned char R2; LCD_BUSY(); LCD_RW = 0; NOP(); LCD_RS = FLAG; R2 = (R1 >> 4) & 0x0F; PORTD &= 0xF0; NOP(); LCD_E = 1; PORTD |= R2; NOP(); NOP(); LCD_E = 0; R2 = R1 & 0x0F; PORTD &= 0xF0; NOP(); LCD_E = 1; NOP(); PORTD |= R2; NOP(); NOP(); LCD_E = 0; NOP(); LCD_RS = 0; NOP(); PORTD &= 0xF0; }

3 PCF8591

如果是做波形发生器实验,我们需要PCF8591产生电压信号,PCF8591的15号引脚就是电压输出引脚。

对照下面的图,我们应该有几个操作:

(1)短接J3的2个排针,使得PCF8591芯片供电。

(2)不能短接P66的2个排针,应该拔下来,并把P66下面的排针(这里就是PCF8591的15号引脚)连接到示波器的屏蔽线笔的勾针;

(3)按照仿真图连接信号线SCL SDA到单片机;

(4)示波器的GND线应该和实验箱子上的任意一个GND连接。(共地)

在这里插入图片描述

控制PCF8591输出一个电压很简单:

c
iic_send_char( 0x90 ); /* iic写入iic器件地址 */ iic_send_char( 0x40 ); /* 写入DAC转换信号 */ iic_send_char( 100 ); /* 写入电压 */

0x90 是固定的器件地址,0x40是PCF8591内部的寄存器地址,最后写入一个0到255之间的整数就可以了,PCF8591就能根据这个整数输出一个电压值,0到255代表了0到5V。

什么是iic?

IIC是一种通信协议。协议详情又得多百度了,因为一句话说不完。我们只要知道,单片机和PCF8591的信号线只有2根,采用了IIC协议进行通信,单片机通过2根线发送了控制信息给PCF8591,PCF8591根据收到的控制信息产生了电压。

或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。

如果你想学习pcf8591更多,请点我

如果你想学习pcf8591更多,请点我22222222

4 独立按键

8个独立按键互不相干,用多少连多少,只用关心信号线就好。

在这里插入图片描述

说一下独立按键的检测原理,只需要单独看一个按键说一下就行。按键的两端分别接了GND和单片机引脚。当用户没有按下按键,相当于单片机的引脚出来接了个电阻(排阻),然后接了VCC,此时单片机的引脚读取到的电瓶就是高电平1.如果用户按下了按键,相当于单片机的引脚出来接了GND,此时单片机的引脚读取到的电瓶就是低电平0.

5 直流电机

ULN2003这块芯片就是电平驱动力转换的一块芯片。接直流电机直接姐在JP37的2根针处就好,同时单片机信号控制脚接到JP32的五号引脚,当单片机输出低电平,IN5也是低电平,直流电机导通。

在这里插入图片描述

在这里插入图片描述

仿真中为了简便,只注重信号线,如下图,黑色的就是电机,一端接VCC,一端接单片机引脚,单片机引脚输出低电平的时候电机就会转。从信号来说,实物P37那里也是单片机引脚输出低电平电机就会转。

在这里插入图片描述

6 小灯

实物中JP15接单片机引脚,单片机引脚直接接到JP15,然后单片机引脚输出低电平小灯点亮。

在这里插入图片描述

我这个版本仿真里的小灯一直有点问题,不得不加个继电器在里面,但只需要关注信号就好,仿真里面也是单片机引脚输出低电平,小灯点亮。所以连接实物的时候去关注信号线是哪一个引脚就可以。不要去管仿真图里这个继电器,直接将单片机引脚接到小灯的负极就能控制小灯!!

在这里插入图片描述

更新一下:不是我仿真软件版本有问题,先前是我设置错了。

双击小灯,设置小灯为数字型的。

在这里插入图片描述

设置好之后就能很好地控制了。

在这里插入图片描述

7 DS1302

一定得把纽扣电池装着,不然就不会正常工作。纽扣电池小心没电了。

三根信号线跟着仿真图接就好了,不要接错了。

在这里插入图片描述

这个模块是要了解一个基础知识,首先大家在心里应该有一个印象,这个模块只要装上电池它就是能够自己走时的,单片机只是去读取它的这些时间寄存器。这个模块的寄存器里面装着的是年月日时分秒和星期几。

单片机也可以向这些寄存器里面写入自己想要的时间(年月日时分秒和星期几),那么这个模块就会跟着我们设置的时间走,也就是一个初始化。

那么现在就有一个问题,如果这个芯片刚从工厂出来的时候,我们不对他进行写入时间,看里面的时间是多少。答案就是它里面的时间是随机的。

所以我们现在的使用过程是这样的:首先由单片机向里面写入一个时间,然后这个模块他就会自己走时,最后单片机会循环的读取里面的寄存器从而清楚现在的时间。

那么我们现在就可能会遇到这样一个问题:程序里面每一次上电后单片机都会向里面写入一个固定的初始时间,可是我们想要的并不是这样的效果。

我们的想要的效果是这样的:我只想要写入一次,比如在今天10:00我打开单片机,单片机程序写入一个10:00的时间给模块。当我在今天11:00打开单片机,我看到的时间依然是10:00,那是因为单片机程序还是会上电写入一个10:00的时间。可是我想在今天的11点打开单片机的时候看到单片机显示的时间是11点。

想要达到这种效果的解决办法有2个,我写给了大家最简单的办法,大家也只用知道这一种办法就好:我在今天10:00下载完程序之后,我应该把程序里面那句初始时刻写入时间的程序给删除掉,然后再下载一次。这样在后面每一次开机过程中,单片机就不会再写入初始时间了,我们就能够读取到内部正常走时。为什么模块能够正常走时呢?因为它有一块备用的纽扣电池提供电能。

那么现在我们关心的问题就是这个写入时间的程序在哪个地方,肯定是在while(1)语句之前的某些地方的,得自己找一下。

以下图程序为例,首先找到while(1)语句,程序是一目了然的。在红色的圈里面就是在进行赋值,把rtctime结构体设置好,完后用set_time( &rtctime ); 这句话去写入了时间,自然,写入的时间就是7:59:58。假如我现在在14:30:00做实验,我准备在14:40:00做时间矫正,我会把红圈里面赋值成14:40:00,然后下载程序进去。这个时候由于我还没有删除写入时间的语句,所以我每按一次单片机的复位按键,单片机程序就会从头执行,自然也就执行得到写入时间语句,也就是说,我每按一次复位按键,单片机都会往模块里面写入时间14:40:00。那么我在14:30:00下载程序,然后我就慢悠悠的等10分钟,等14:40:00到来的那一刻,立马按一下复位按键。这个时候模块里面的时间就和正常世界的时间是一样走时的了,这个时候我们一定不要再按复位按键或者给单片机断电,这个时候我们需要做的就是把这个写入时间这个语句给删除掉,然后重新下载一遍程序。由于新下载的这个程序里面没有写入时间语句了,所以在后续的使用过程中模块里面的时间始终和自然世界的走时一样。

以上的段落仅仅针对于按键不可以修改时间,假如按键能够修改时间,你就直接删除这句写入时间就可以,反正你能通过按键调节,调节之后程序里面自然有向模块中写入新的时间。但是还是有一点值得考虑,如果闹钟是一个固定时间,为了方便演示,肯定是把当前时间设置为一个马上就要到达固定时间的时间点,这样方便演示。

在这里插入图片描述

或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。

如果你想学习DS1302更多,请点我

8 DS18B20

(1)关注信号线,依照仿真图将信号线接在JP35处的排针。

(2)得找老师要一个DS18B20器件插到U5或者U7, U5和U7是对称的,随便插哪里效果一样;

(3)插的时候注意半圆方向。

(4)可以用手摸DS18B20加热,可见显示屏上读取显示的温度会改变。

在这里插入图片描述

或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。

如果你想学习DS18B20更多,请点我

9 蜂鸣器

关注信号线,依照仿真图将信号线接在JP22处的排针。

这是无源蜂鸣器。

在这里插入图片描述

无源蜂鸣器和有源蜂鸣器啥区别?

控制电路没区别,内部构造有区别。

有源蜂鸣器:在上面的原理图中如果蜂鸣器是有源蜂鸣器,那么JP22是低电平的时候,8550三极管导通,此时蜂鸣器上方电压就是VCC,下方就是GND,有源蜂鸣器的特点此时就直接就鸣叫了。有源蜂鸣器内部有一个500HZ(可能不是这么大小)的震荡电路,通电后直接工作起来使得振动片以500HZ振动,听起来就是500HZ的声音。有源蜂鸣器的声音频率是固定的。

无源蜂鸣器:在上面的原理图中如果蜂鸣器是无源蜂鸣器,那么JP22是低电平的时候,8550三极管导通,此时蜂鸣器上方电压就是VCC,下方就是GND,无源蜂鸣器的特点就是此时无源蜂鸣器不会鸣叫。因为无源蜂鸣器内部没有震荡电路,只能依靠频率地通电断电来控制。可知JP22是低电平是通电,JP22是高电平是断电。如果JP22是给一个1000HZ的50%占空比的方波,那么无源蜂鸣器就会以1000HZ的声音鸣叫。

无源蜂鸣器的程序:

(1)如果是想鸣叫一声:

c
for(i=0;i<100;i++) { 给高电平 延时0.5ms 给低电平 延时0.5ms }

(2)如何放音乐?

音乐简谱中可以知道每个音符的频率 和鸣叫时间。

举个例子

比如有一段音乐只有三个音,是下面这样:

首先1000HZ 响200ms,然后700HZ响50ms,最后1500HZ响100ms。

我们就需要控制单片机程序在蜂鸣器控制引脚上输出这个波形:

在这里插入图片描述

精准控制频率也就是时间,只有定时器功能去弄。

响多久可以用软件延时函数等待那么多时间。

10 数码管

只需要关注信号线,JP70需要短接。其余3根信号线就跟着仿真图接。

在这里插入图片描述

在这里插入图片描述

或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。

如果你想学习HC595数码管更多,请点我

11 光敏电阻

光敏电阻本质是一个电阻,电阻值能随光强变化,一般地,光强越强,电阻数值就越低。、

如果我们能界定电阻大小,就能大概判断光强大小。

在下图里,把光敏电阻街道JP40的2和3口,那么光敏电阻就和R53电阻组成通路。

依据光敏电阻型号不同,光敏电阻的变化范围也不同,这里的电路这么设计估计给的光敏电阻就是在10k欧姆以内变化。

当光强很弱的时候光敏电阻如果是10k,那么Aout节点的电压就是2.5V。灯光强逐渐变强,光敏电阻的电阻数值开始减小,Aout节点的电压也会变得越来越小。我们利用单片机的电压采集模数转换能力,就能够采集到Aout节点的电压。所以注意点有:

(1)J2的2个排针需要短接;

(2)单片机电压采集引脚接到JP42的AOUT引脚。

(3)光敏电阻接到JP40的2和3口。

在这里插入图片描述

12 串口发数据

在proteus中直接有一个虚拟终端,虚拟终端器件就是下图左边这个东西。

串口通信是2根信号线,单片机的发送信号线(带TX字样)引脚需要接要虚拟终端的接收信号线(带RX字样);单片机的接收信号线(带RX字样)引脚需要接要虚拟终端的发送信号线(带TX字样),反着来的。

在这里插入图片描述

除了接线外,还应该设置波特率。在仿真图的非运行状态下,双击虚拟终端器件可以看到下图,9600baud波特率,数据位8位,停止位1位。

在这里插入图片描述

总结一下,2个器件通信,每个 器件所设置的波特率等信息应该一样。那么我们这里就是单片机和虚拟终端这2个器件通信,单片机的波特率设置依靠了单片机程序,虚拟终端的波特率设置依靠上图这个面板。

在了解到上述事情后,我们看一下实物。

原理图如下。MAX232是一个电平匹配的芯片,包含了2路串口接口。也就是说,JP8那里四个引脚,引脚1和引脚2是一起作为一路串口接口,引脚3和引脚5是一起作为一路串口接口。我们只用取其中任意一个,但是,选用引脚1和引脚2后数据就会往DB1金属头传,选用引脚3和引脚4后数据就会往DB2金属头传。这个金属头是一种叫DB9的接口,有一种线专门可以插这里,线的另一端就可以插别的器件上,这样单片机就可以和别的器件通信。

在这里插入图片描述

下面就认识一下各种线。

下图里这种线就很单纯,2端都是DB9的接口。可以连接2个DB9的插头。一般用于单片机和单片机通信。

在这里插入图片描述

还有一些别的不单纯的线如下面三张图。下面图里的这些线一端是db9接口,一端是USB接口。为什么说这些线不单纯呢:下面这些图里面的DB9接口并不是一个单纯的DB9接口,可以隐隐约约看到里面是带有芯片的,这个头子和我们上图中看到的头子是不一样的。它里面带有一块ch340芯片,如果电脑上装了ch340芯片的驱动,那么这个线插电脑上电脑就能够识别并且能够读取ch340芯片传递出来的信息。我们暂且叫这个线为 232转USB线

单片机想传递数据给电脑,经历了这么样一个过程:单片机通过串口模块发送电平二进制数据,MAX232芯片将电平转换了一下,转换后发送到ch340芯片,ch340芯片又将数据包装了一下发给电脑。

在这里插入图片描述

可以不要ch340芯片吗?不可以。

可以不要MAX232转换电平吗?

可以!直接买个下图这模块,一端插电脑,另一端用杜邦线直接和单片机的2个通信引脚连起来,再接根供地线即可。

在这里插入图片描述

上面啰里八嗦讲了很多串口连接的原理,其实也就下面这几个步骤:

(1)在老师那里拿一根232转USB线

(2)用这个线连接电脑和板子上的一个接口,用DB1吧

(3)用2根杜邦线,一根连接JP8引脚1和单片机引脚RC6,一根连接JP8引脚2和单片机引脚RC7.(DB1)

(4)试验箱的供电应该是由电脑供电,这样默认的GND就是同一个GND。

(5)在电脑上打开串口调试助手,去打开你的CH340端口,此时电脑就能收到CH340发来的信息了。(在电脑的设备管理器里可以看到电脑的硬件信息,连接上CH340后里面会有CH340的一个设备信息)(如果插入CH340后,设备管理器里面没有CH340的设备信息,那么就是没有安装驱动程序,驱动程序找我要或者网上搜)(上面所说的CH340也有替代芯片,比如PL2303,都有对应的驱动程序,功能原理均一致)

13 EEPROM AT24C02

这个东西的目的就在于,如果单片机向EEPROM内部写入一个数值后,就算整个系统掉电,我们下一次去读取EEPROM内的数值,可以读到我们之前写入的那个值。

一般EEPROM有一段地址存储空间,比如0x00到0xff,每个地址可以装一个字节。这次你往哪个地址写入,下一次你应该往同样的地址读取出数据。

为了方便掩饰,程序在最开始就有一个写入操作,写入的是固定数值。这和DS1302掉电走时的改写方法有点类似,可以参考一下上面讲DS1302的内容。

我们在做实物的时候应该有这样一个操作过程:首先把原程序下载到单片机里面去,然后删除下图中的写入那一句程序(记作新程序),最后把新程序再次下载到单片机里面去。这样就能够正常使用了。

不同程序的程序片段可能有所区别,注意寻找一下开头的写入操作那句程序。

在这里插入图片描述

14 矩阵键盘

首先回顾一下独立按键的检测原理,独立按键两个引脚,一个引脚接单片机的引脚,一个引脚接GND。没有按下按键的时候,单片机的引脚能够读取到的就是高电平1.当按键按下的时候,单片机的引脚能够读取到的就是低电平0.从而单片机知道用户已经按下了按键。

在下图里面是矩阵键盘,矩阵键盘是基于一种扫描的原理:

首先我们假设单片机p1.0到p1.3四个引脚都是输出高电平,这个时候我们去检测p1.4~p1.7这4个引脚的电压,应该全是高电平。

那么我们接着看,假如单片机现在p1.0引脚输出的是低电平,单片机p1.1~p1.3输出的是高电平。此时如果我用手按住KF那个按键,那么KF按键的2端就连接起来了,由于这个变化,此时P1.4引脚肯定检测到的是低电平。

同理,假如单片机现在p1.0引脚输出的是低电平,单片机p1.1~p1.3输出的是高电平,那么我们可以通过P1.4到P1.7这4个引脚的电压是不是低电平,从而判断第一列按键是不是被按下了。

接下来,我们可以让p1.1引脚输出的是低电平,p1.0、p1.2、p1.3输出高电平,从而检测出第2列的按键有没有哪一个被按下了。

接下来就是依次检测第3列和第4列。

上面的文字要描述成代码的话就是很多代码,有没有一种简单巧妙的办法勒。有的。我们可以先让p1.0~p1.3都输出低电平,这个时候去检测p1.4到p1.7这4个引脚的电压,如果有哪一行的按键被按下,对应p1.4到p1.7这4个引脚某一个就是低电平!我们就能初步检测到按下的按键属于哪一行。

接着,反着来,让p1.4~p1.7都输出低电平,这个时候去检测p1.0到p1.3这4个引脚的电压,如果有哪一行的按键被按下,对应p1.0到p1.3这4个引脚某一个就是低电平!我们就能检测到按下的按键属于哪一列。

用户按下的这个按键的行和列我们都知道了,那对应哪一个按键也就知道了。

以上就是矩阵键盘按键检测原理。

在这里插入图片描述

每个矩阵键盘模块的电路都是不尽相同的,但同时也是大同小异的,我们只需要关注一点,就是有可能在仿真图上面是K0按键,在实物上却不是这样的排列。究其原因就是程序是如何检测的。

但很多时候修改硬件连接比修改程序来得快得多。下图中JP29有8个引脚,从上到下记住引脚0到引脚7.

在这里插入图片描述

为了能够匹配上程序,同时也是为了能够匹配上仿真图的连接,实物接法无非就下表的几种情况。一种一种试下来就知道是哪一种了,试的时候注意观察屏幕的显示就知道自己接得对不对。(观察下表,有规律)

接法序号 | 引脚0| 引脚1| 引脚2| 引脚3| 引脚4| 引脚5| 引脚6| 引脚7

-------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -----

1 | P1.0| P1.1| P1.2| P1.3| P1.4| P1.5| P1.6| P1.7

2 | P1.0| P1.1| P1.2| P1.3| P1.7| P1.6| P1.5| P1.4

3 | P1.3| P1.2| P1.1| P1.0| P1.4| P1.5| P1.6| P1.7

4 | P1.3| P1.2| P1.1| P1.0| P1.7| P1.6| P1.5| P1.4

15 红外遥控器

1 只需要关注仿真图里的信号线去接实物。

2 遥控器一定得有电才行,检查纽扣电池。

16 如何为某个节点添加上拉电阻

什么是上拉电阻?你应该已经发现了独立按键每一个按键去接单片机的引脚那个节点,都会接一个电阻然后再接到高电平。这样做的作用其实就是在案件没有被按下的时候,单片机引脚所检测到的电瓶就是高电平。在下图中可以看到上面的RP65器件,这是一个排阻,你可以把它想象成它里面有8个电阻并联并且有一个公共端,最后这个公共端被我们接到了vcc。这一个排阻相当于8个独立的电阻。

在这里插入图片描述

在仿真图里面往往我们只需要使用4个按键或者三个按键,所以就没有使用仿真软件里面的排阻器件,而是每个引脚都用了一个上拉电阻。

在下图里面左边的按键就是这样的接法。但有时候我们需要额外的上拉电阻,比如在下图中右边红圈里面的上拉电阻,比如RC0引脚出来应该接上一个上拉电阻,对于这种情况,在实物中,我们可以直接把RC0引脚去接一个没有使用的按键电路,接住试验箱的按键电路达到获取上拉电阻的作用。

在这里插入图片描述

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!