写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始51单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习51单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。不再另外购买视频中的普中开发板了。
原理图如下
视频中的都用这个开发板来实现,如果有资源就利用起来。
仔细看了看:开发板的晶振为:11.0592Mhz;12Mhz晶振是用来给CH340G芯片外置晶振;
下图是实物图
引用
51单片机入门教程-2020版 程序全程纯手打 从零开始入门
还参考了下图中的书籍:
手把手教你学51单片机(C语言版)
解答和科普
1、三极管的应用。
三极管在数字电路里的开关特性,最常见应用有 三极管在数字电路里的开关特性,最常见的应用有 2个: 一个是控制应用,一个是驱动应用。所谓的控制就是如图:
三极管的用法:可以知道这是一个PNP三极管,因为箭头是从P指向N,所以这个就是PNP三极管,左边是B极(基极),上面是发射极下面是集电极,导通电压顺箭头过,电压导通,电流控制对于PNP型三极管,导通电压顺箭头过的意思是:发射极(E极)的电压大于基极(B极)0.7v以上,电压导通,也就是控制端在b和e,被控制端是e和c;如果P1.0输出低电平,e和b之间电压导通,进而控制e和c路上的LED。
还有一个控制就是进行不同电压之间的转换控制
比如我们的单片机是 5V 系统,它现在要跟一个 12V 的系统对接,如果 IO 直接 直接 12V 电压就会烧坏单片机,所以我们加一个三极管,三极管的工作电 压高于单片机的 IO 口电压, 用 5V 的 IO 口来控制 12V 的电路,如图
看基级(b)和发射极(e)的情况来控制发射极(e)和集电极( c )
当IO口输出为5V高电平的时候,三极管导通,此时可以看做e和c直接接地了,所以OUT的电压为0V,,当 IO 口输出低电平时,三极管截止, OUT 则由于上拉电阻 R2 的作用而输出 12V 的高电平,这样就实现了低电压控制高电压的工作原理。
所谓的驱动,主要是指电流输出能力。
中上边的 LED 灯,和我们第二课讲过的 LED 灯是一样的,当 IO 口是高电平时 , 小灯熄灭,当 IO 口是低电平时,小灯点亮。那么下边的电路呢,按照这种推理, 按照这种推理,IO 口是高 电平的时候,应该有电流流过并且点亮小灯,但实际上却并非这么简单。
单片机主要是个控制器件,具备四两拨千斤的特点。就如同杠杆必须有一个支点一样,就如同杠杆必须有一个支点一样,想要撑起整个地球必须有力量承受的支点。单片机的 IO 口可以输出一个高电平,但是他的输出电流却很有限输出电流却很有限,普通 IO 口输出高电平的时候,大概只有几十到几百 uA 的电流,达不到1mA ,也就点不亮这个 LED 小灯或者是亮度很低,这个时候如果我们想用高电平点亮 LED, 就可以用上三极管来处理了就可以用上三极管来处理了,我们板上的这 种三极管型号,可以通过500mA 的电流,有的三极管通过的电流还更大一些,如图 还更大一些,
中,当 IO 口是高电平,三极管导通,因为三极管的电流放大作用, c极电流就可以达到 mA 以上了,就可以成功点亮 LED 小灯。
虽然我们用了IO 口的低电平可以直接点亮 LED ,但是单片机的 IO 口作为低电平,输入电流就可以很大吗?对电气特性的介绍,整个单 整个单片机的工作电流,不要超过 50mA ,单个 IO 口总电流不要超过 6mA 。即使一些增强型 51 的 IO 口承受电流大一点,可以到 25mA ,但是还要受到总电流 50mA 的限制。
这里我们要学会看电路图的一个知识点,电路图右侧所有的
LED 下侧的线最终都连到一根黑色的粗线上去了,大家注意,这个地方不是实际的完全连到一起,而是一种总线的画法, 总线的画法,画了这种线以后,表示这是个总线结构。而所有的名字一样的节点是一一对应的连接到一起画了这种线以后, 表示是个总结构。而所有的名字一样节点对应连接到起其他名字不一样的,是不连在一起的。比如左侧的 DB0 和右侧的最右边的 LED2 小灯下边的 DB0 是连在一起的,而和 DB1 等其他线不是连在一起的。
5V 的电压减去 LED 本身的压降,减掉三极管e和 c之间的压降,限流电阻用的是 330 欧,那么每条支路的电流大概是 8mA ,那么 8路 LED如果全部同时点亮的话电流总和就是 64mA。这样如果直接接到单片机的 IO 口,那单片机肯 那单片机肯定是承受不了的,即使短时间可以承受,长时间工作就会不稳定,甚至导致单片机烧毁定是承受不了的,即使短时间可以长工作就会稳甚至导致单片机烧毁。
除了三极管之外,其实还有一些==驱动IC ,这些驱动 IC 可以作为单片机的缓冲器,仅仅是电流驱动缓冲,不起到任何逻辑控制的效果,==比如我们板子上用的 74HC245这个芯片,这个芯片在逻辑上起不到什么别的作用,就是当做电流缓冲器的,我们通过查看其数据手册, 电流缓冲器的,我们通过查看其数据手册,74HC245 稳定工作在 70mA 电流是没有问题的,比单片机的 8个 IO 口大多了,所以我们可以把他接在小灯和 IO 口之间做缓冲,如图
我们来分析,其中 VCC 和 GND 就不用多说了,细心的同学会发现这里有个0.1uF 的去耦电容哦。
74HC245
是个双向缓冲器, ,1引脚 DIR 是方向引脚,当这个引脚接高电平的时 候,右侧所有的 B编号的电压都等于左侧 A编号对应的电压。比如 A1 是高电平,那么 B1 就是高电 平, A2 是低电平, B2 就是低电平等等。如果 DIR 引脚接低电平,得到的效果是左侧 A编号 的电压都会等于右侧 B编号对应的电压。因为我们这个地方控制端是左侧接的是P0 口,我 们要求 B等于 A的状态,所以 1脚我们直接接的 5V 电源,即高电平。图 中还有一排电阻 R10 到 R17 是上拉电阻,这个电阻的用法我们在后边介绍。
还有最后一个使能引脚19 脚 OE ,叫做输出使能,这个引脚上边有一横,表明是低电平 表明是低电平有效,当接了低电平后, 74HC245 就会按照刚才上边说的起到双向缓冲器的作用,如果 OE 接了高电平,那么无论 DIR 怎么接, A和 B的引脚是没有关系的,也就是 74HC245 功能不能实现出来。
可以看出来,单片机的 P0 口和 74HC245 的 A端是直接接起来的。这
个地方,有个别同学有个疑问,就是我们明明在电源 VCC 那地方加了一个三极管驱动了,为何还要再加 245 驱动芯片呢。这里大家要理解一个道理,电路上从正极经过器件到地,首先必须有电流才能正常工作,电路中任何一个位置断开,都不会有电流,器件也就不会参与工作了。其次,和水流一个道理,从电源正极到负极的电流水管的粗细都要满足要求,任何一个位置的管子过细,都会出现瓶颈效应,电流在整个通路中细管处会受到限制而降低,所以在电路通路的每个位置上,都要保证通道足够畅通, 这个 74HC245 的作用就是消除单片机 消除单片机IO 这一环节的瓶颈。
最后完整的看LED小灯整体电路图:
要想点亮LED灯,我们就必须必须使三极管的LEDS6为低电平,此时PNP型三极管的发射极和基极电压差大于导通电压,于是发射极和集电极在LED这条通路接通.看到74HC138译码器,要想让LEDS6为低电平,也就是A2、A1、A0为110的时候,LEDS6为低电平,且译码使能ENLED=0;ADDR3=1;ADDR2=1,ADDR1=1,ADDR0=0,的时候完成上述功能。
74HC245左侧是通过P0口控制,口控制,我们让 P0.0 引脚等于 0,就是 DB_0 等于 0,而右 侧 DB0 等于 DB_0 的状态,也是 0,那么这样在这一排共 8个 LED 小灯当中,只有最右侧 只有最右侧的小灯和 5V 之间有压差,有压差就 会有电流通过,有电流通过我们的 LED2 就会发光了。
2、跳线
跳线是大家以后经常会接触到的一个器件,它就是2 根或者 3 根靠在一起的排针,然后可以用一个叫作跳线帽的东西连接其相邻的 2 根针。它的作用就是起到导线的作用,我们可以通过跳线帽来实现连接线的切换。
从图中可以看出,跳线帽本身可以占2 个针的位置,现 在是把右侧和中间的针连到了一起,这样实现的就是图 3 18 中的 P1.0 和 ADDR0 连接到一起、 P1.1 和 ADDR1 接一起、 P1.2和 ADDR2 接一起、 P1.3 和 ADDR3 接一起。
一、独立按键
独立式按键原理图
4条输入线接到单片机的IO 口上,当按键K1 按下时,+5V 通过电阻R1 然后再通过按键K1 最终进入GND 形成一条通路,那么这条线路的全部电压都加到了R1 这个电阻上,KeyIn1 这个引脚就是个低电平。==当松开按键后,线路断开,就不会有电流通过,那么KeyIn1和+5V 就应该是等电位,是一个高电平。==我们就可以通过KeyIn1 这个IO 口的高低电平来判断是否有按键按下。
但是实际上在我们的单片机IO 口内部,也有一个上拉电阻的存在。我们的按键是接到了P2 口上,P2 口上电默认是准双向IO 口,我们来简单了解一下这个准双向IO 口的电路。
方框内的电路都是指单片机内部部分,方框外的就是我们外接的上拉电阻和按键。这个地方大家要注意一下,就是当我们要读取外部按键信号的时候,单片机必须先给该引脚写“1”,也就是高电平,这样我们才能正确读取到外部按键信号,我们来分析一下缘由。当内部输出是高电平,经过一个反向器变成低电平,NPN 三极管不会导通,那么单片机IO 口从内部来看,由于上拉电阻R 的存在,所以是一个高电平。当外部没有按键按下将电平拉低的话,VCC 也是+5V,它们之间虽然有2 个电阻,但是没有压差,就不会有电流,线上所有的位置都是高电平,这个时候我们就可以正常读取到按键的状态了。
当内部输出是个低电平,经过一个反相器变成高电平,NPN 三极管导通,那么单片机的内部IO 口就是个低电平,这个时候,外部虽然也有上拉电阻的存在,但是两个电阻是并联关系,不管按键是否按下,单片机的IO 口上输入到单片机内部的状态都是低电平,我们就无法正常读取到按键的状态了。
这个和水流其实很类似的,内部和外部,只要有一边是低电位,那么电流就会顺流而下,
由于只有上拉电阻,下边没有电阻分压,直接到GND 上了,所以不管另外一边是高还是低,
那电平肯定就是低电平了。
从上面的分析就可以得出一个结论,这种具有上拉的准双向IO 口,如果要正常读取外部信号的状态,必须首先得保证自己内部输出的是1,如果内部输出0,则无论外部信号是1还是0,这个引脚读进来的都是0。
开发板的独立按键模块:
寄存器通过读取I检测 IO口,进而判断按键是否按下。
二、按键控制LED灯的实现
从上可以知道单片机可以通过判断IO口的高低电平,来判断按键是否按下,我们就接着让单片机在按下的时候让单片机亮。
2.1按键控制LED亮灭
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_0==0)
{
P1_0=0;//按键按下LED1亮起
}
else
{
P1_0=1;
}
}
}
实验现象:
独立按键控制LED
2.2 &&和|| 运算加入控制
2.2.1&&运算
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_0==0&&P3_1==0)
{
P1_0=0;
}
else
{
P1_0=1;
}
}
}
实验现象:
按键控制LED灯与运算
2.2.2 ||运算
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_0==0||P3_1==0)
{
P1_0=0;
}
else
{
P1_0=1;
}
}
}
实验现象:
按键控制LED灯或运算
问题
1、C语言的基础知识
总结
本节课主要学了了按键控制LED,首先明白独立按键的原理,单片机通过读寄存器,检测IO的电平状况,判断按键是否按下,如果按下,则执行相应的操作。并掌握了C语言中的逻辑运算符&&、||和!的应用。