学习笔记|LED点亮原理|三极管在数字电路中的应用|Keil中的Tab设置|C51中对准双向口|STC32G单片机视频开发教程(冲哥)|第四集-上:点亮LED

文章目录

  • 1.LED点亮原理
    • STC32G12K128LQFP64QFN64管脚图:
    • Tips:USB-ISP下载程
    • GPIO (general purpose intput output)
    • Tips:三极管在数字电路中的应用
  • 2 新建工程
    • Tips:Tab设置
    • TIPS: sbit c语言中特殊功能寄存器的位变量
      • 11.2 配置IO口
      • 注意:
    • Tips:C51中对准双向口的解释
      • 学习内容提要:
  • 3.点亮第一个LED(代码)
  • 4.实现自动下载工程
    • Tips:EA = 1的解释
  • 5.总结
  • 课后练习:点亮全部LED灯。

1.LED点亮原理

在这里插入图片描述
为什么LED能点亮?
概念引入:输出电压=VCC就是高电平,输出电压
=GND(一般是OV)就是低电平,分别用1和0来表示,这个是理想值。
在这里插入图片描述

STC32G12K128LQFP64QFN64管脚图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tips:USB-ISP下载程

现在STC 的带硬件USB的MCU支持用硬件USB下载,因为用的是USB-HID通信协议,不需要安装任何驱动。STC打狗棒、降龙棍、开天斧、屠龙刀核心板以及STC开源示波器、STC实验箱在D-/P3.0.D+/P3.1与 PC-USB端口连接好的状况下,
USB-ISP下载程序步骤;
1、按下板子上的P3.2/INTO按键,就是P3.2接地
2、给目标芯片重新上电,不管之前是否已通电。
—==电子开关是按下停电后再松开就是上电
等待STC-ISP下载软件中自动识别出"STC USB Writer (HID1)”,识别出来后,就与P3.2状态无关了,这时可以松开P3.2按键
===传统的机械自锁紧开关是按上来停电,按下去是上电
3、点击下载软件中的“下载/编程”按钮(注意:USB下载与串口下载的操作顺序不同)
下载成功!
—==另外从用户区软复位到系统区也是等待USB下载。

GPIO (general purpose intput output)

通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制他输出高低电平。
P5.0就是一个GPIO口
PO是一组GPIO口
PO.0是一组的其中一个GPIO口,从PO.0到P0.7总共有8个。
我们一次可以操作一个IO口
也可以此同时操作一组
如何点亮LED4?它接在了P6.0的这个端口上。
根据原理图,需要:P40输出低电平,P60输出低电平完成点灯。
在这里插入图片描述

Tips:三极管在数字电路中的应用

参考:三极管的工作原理及使用用法

  • 1、三极管的原理三极管有截止、放大、饱和三种工作状态。放大状态主要应用于模拟电路中,且用法和计算方法也比较复杂,我们暂时用不到。而数字电路主要使用的是三极管的开关特性,只用到了截止与饱和两种状态。
    NPN和PNP主要是电流方向和电压正负不同。
    这里以NPN型三极管为例来说说它的工作原理。 
    在这里插入图片描述
    它就是一个以b(基极)电流Ib来驱动流过ce的电流Ic的器件,它的工作原理很像一个可控制的阀门。
    左边细管子里蓝色的小水流冲动杠杆使大水管的阀门开大,就可允许较大红色的水流通过这个阀门。当蓝色水流越大,也就使大管中红色的水流更大。如果放大倍数是100,那么当蓝色小水流为1千克/小时,那么就允许大管子流过100千克/小时的水。同理,当三极管的放大倍数为100时,当Ib(基极电流)为1mA时,就允许100mA的电流通过Ice。
    在这里插入图片描述
    在这里插入图片描述

两种三极管的工作原理总结如下:
NPN的发射极(e)接地,集电极©接高电平,基极(b)接控制信号,用b-e的电流(Ib)控制c-e的电流(Ic),e极电位最低,且正常放大时通常c极电位最高,即Vc> Vb > Ve。三极管导通,电流从c极流向e极。
PNP的发射极(e)接高电平,集电极©接低电平,基极(b)接控制信号,用e-b的电流(Ib)控制e-c的电流(Ic),e极电位最高,且正常放大时通常c极电位最低,即Vc < Vb < Ve。三极管导通,即电流从e极流向c极。
在这里插入图片描述

  • 2 三极管的使用用法
    三极管的用法特点,关键点在于 b 极(基极)和 e 级(发射极)之间的电压情况,对于PNP 而言,e 极电压只要高于 b 级 0.7V 以上,这个三极管 e 级和 c 级之间就可以顺利导通。也就是说,控制端在 b 和 e 之间,被控制端是 e 和 c 之间。同理,NPN 型三极管的导通电压是 b 极比 e 极高 0.7V,总之是箭头的始端比末端高 0.7V 就可以导通三极管的 e 极和 c 极。这就是关于“导通电压顺箭头过,电压导通”的解释。
    下面以一个常见的控制LED的电路为例来说明截止与饱和的工作状态。如下图所示,三极管基极通过一个 10K 的电阻接到了单片机的一个 IO口上,假定是 P1,发射极直接接到 5V 的电源上,集电极接了一个 LED ,并且串联了一个 1K 的限流电阻最终接到了电源负极 GND 上。如果 P1由我们的程序给一个高电平 1,那么基极 b 和发射极 e 都是 5V,也就是说 e到 b 不会产生一个 0.7V 的压降,这个时候,发射极和集电极也就不会导通,那么竖着看这个电路在三极管处是断开的,没有电流通过,LED也就不会亮。如果程序给 P1一个低电平 0,这时 e 极还是 5V,于是 e 和 b 之间产生了压差,三极管 e 和 b 之间也就导通了,三极管 e 和 b 之间大概有 0.7V 的压降,那还有(5-0.7)V 的电压会在电阻 R47 上。
    【注】这里的P1口输出高电平是5V,不同的单片机的IO口高电平输出电压是不同的,有的单片机的IO输出是1.2V,这就需要三极管放大,以此驱动LED等工作。
    这个时候,e 和 c 之间也会导通了,那么 LED 本身有 2V 的压降,三极管本身 e 和 c 之间大概有 0.2V的压降,我们忽略不计。那么在 R41 上就会有大概 3V 的压降,可以计算出来,这条支路的电流大概是 3mA,可以成功点亮 LED。
    前边讲过,三极管有截止,放大,饱和三个状态,截止就不用说了,只要 e 和 b 之间不导通即可。我们要让这个三极管处于饱和状态,就是我们所谓的开关特性,必须要满足一个条件。三极管都有一个放大倍数β,要想处于饱和状态,b 极电流就必须大于 e 和 c 之间电流值除以β。这个β,对于常用的三极管大概可以认为是 100。
    那么上边的 R47 的阻值我们必须要来计算一下了。刚才我们算过e 和 c 之间的电流是 3mA,那么 b 极电流最小就是 3mA 除以 100 等于30uA,大概有 4.3V 电压会落在基极电阻上,那么基极电阻最大值就是 4.3V/30uA = 143K。电阻值只要比这个值小就可以,当然也不能太小,太小会导致单片机的 IO 口电流过大烧坏三极管或者单片机,IO 口输入电流最大理论值是 25mA,我推荐不要超过 6mA,我们用电压和电流算一下,就可以算出来最小电阻值。
    +3 总结:箭头朝内 PNP,导通电压顺箭头过,电压导通,电流控制。

2 新建工程

跟着手册:《STC32G12K128实验箱-V9.4使用说明书》新建工程,一步一步实现点亮。

  • 1、新建Keil项目
    (由于Keil 的版本比较多,本说明书将只使用Keil的uVersion5为例进行介绍,Keil 的其他版本与之类似>
    首先打开Keil软件,并打开“Project”菜单中的“New uVersion Project …”项目。

上一节已经添加过STC芯片库,这里在下拉菜单中选择:STC MCU Database
在这里插入图片描述
新建文件Demo.c(扩展名建议小写):

写入代码:

sfr P0 = 0x80; //关键字sfr以红色显示
sfr P0M1  = 0x93;
sfr P0M0  = 0x94;void main()
{P0M0 = 0x00;P0M1 = 0x00;while(1){P0++;}
}

编译通过。“.\Objects\Demo” - 0 Error(s), 0 Warning(s).
但未提示生成任何文件。

Tips:Tab设置

GB2312+4空格:
在这里插入图片描述

  • 2 option设置output,选择HEX386:

重新编译:
在这里插入图片描述
提示:creating hex file from “.\Objects\Demo”…

  • 3 下载
    按照教程方法,手动下载。提示成功,但灯未点亮。
    原因分析:引脚不对。
    这里需要引入一个sbit一个功能。
sbit P00 = P0^0;    //选择P0.0引脚

TIPS: sbit c语言中特殊功能寄存器的位变量

sbit是定义特殊功能寄存器的位变量。bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。
手册9.2.12 STC32G系列单片机中可位寻址的数据存储器:
STC32G系列单片机内部可位寻址的数据存储器包括两部分:第一部分的地址范围为DATA 区域的20H7FH,第二部分的地址范围是特殊功能寄存器SFR:8OHFFH。
特殊功能寄存器(SFR)区域
在这里插入图片描述
在这里插入图片描述

全部 SFR区域的80H~-FFH。共128个字节。每个字节均可位寻址。指定名字,对应一个路径。单片机根据地址里的数值去实现去我们要的一个功能。

11.2 配置IO口

每个IO的配置都需要使用两个寄存器进行设置。
以P0口为例,配置P0口需要使用P0M0和P0M1两个寄存器进行配置,如下图所示:
即P0M0的第0位和P0M1的第0位组合起来配置P0.0口的模式
即P0M0的第1位和P0M1的第1位组合起来配置P0.1口的模式,其他所有IO的配置都与此类似。
在这里插入图片描述

在这里插入图片描述

注意:

虽然每个IO口在弱上拉(准双向口)/强推挽输出/开漏模式时都能承受20mA的灌电流(还是要加限流电阻,如 1K、560Q2、472Q2等),在强推挽输出时能输出20mA的拉电流(也要加限流电阻),但整个芯片的工作电流推荐不要超过90mA,即从VCC流入的电流建议不要超过90mA,从GND流出电流建议不要超过90mA,整体流入/流出电流建议都不要超过90mA。
在这里插入图片描述
在这里插入图片描述

这里配置为准双向口,既可以向外输出高低电平,又可以读取外部的一个高低电平。

Tips:C51中对准双向口的解释

来源:百度百科
准双向口:有固定的内部上拉电阻。
准双向口是指P1、2、3有固定的内部上拉电阻,当用做输入时被拉高,当外部拉低时(低电平)会拉电流(source current, 这里拉电流是电流从单片机往外走),而P0则是真双向口,因为作为输入时它是悬浮的。
中文名准双向口特 点内部有上拉,故高电平为内部给出不是真正的外部信号
释义
C51的说明书上说:”Because Ports 1, 2, and 3 have fixed internal pullups, they are sometimes called quasi-bidirectional ports. When configured as inputs, they pull high and source current (IIL) when externally pulled low. Port 0, on the other hand, is considered truly bidirectional, because it floats when configured as an input. "
“准”就是“基本上的意思”,也就是“准双向口”不是真正的双向口。
其实重点在P0口.
P0口是双向指的是它被用作地址/数据端口时,只有在这个时候,P0口才处于两个开关管推挽状态,当两个开关管都关闭时,才会出现高阻状态.当P0口用于一般I/O口时,内部接Vcc的那个开关管是与引脚(端口)脱离联系的,这个时候,只有拉地的那个开关管起作用,P0口作为输出,是必须外接上拉电阻的,不然就无法输出高电平;
如果P0口作为输入,则必须先对端口写1,使拉地的开关管断开,这个时候,如果不接上拉电阻,则是高阻状态,就是一个双向口,如果接上拉电阻,则本身输出高电平,对输入信号的逻辑无影响(注意是对逻辑无影响,对实际参数有无影响我不确定,但是我认为是有的).
双向与准双向,根本原则是双向包含了高阻这个状态,而不在于是否需要先写1或者不写,P1P3口因为有内部上拉电阻,因此无论如何不是双向;P0口内部无上拉电阻,在处于数据/地址功能时,自动完成3态的转换,是双向,处于一般I/O口时,如果不接外部上拉,而且先向端口写了1,那么就处于高阻状态,此时,它也是一个人为的双向口,这与它处于地址/数据功能时的自动双向有区别,以及与P1P3处于输入时输出锁存器为1是有区别的跟I2C总线上那种漏极开路或者集电极开路结构差不多. 通过上拉电阻(或者下拉电阻)来提供一种电平的驱动.
当作为输入使用时,就将开关断开,这样就只剩下上拉(或者下拉)电阻,因而阻抗比较高,
可以由其它设备驱动该IO口。准双向口在做为输入使用时,实际上还是一种输出状态.
只是该输出状态的内阻比较大而已. 而真正的双向IO口,有方向控制寄存器,作为输入
使用时输出部分被断开.
双向口与准双向口的区别为双向口有高阻态,输入为真正的外部信号,准双向口内部有上拉,故高电平为内部给出不是真正的外部信号!软件做处理时都要先向口写“1”!
P0口为真正的双向口,其余为准双向口!P0内部无上拉(开漏输出),外加NMOS电路需接上拉!输入为高阻悬浮态!P0的驱动能力是单个其余口的两倍!

学习内容提要:

  • 1.思考LED为什么不会亮?
    引脚不对。
  • 2.怎么控制单独的一个引脚?
    sbit P00 = P0^0; //选择P0.0引脚
  • 3.怎么控制这个引脚输出电平?
    P00 = 1; //输出低电平
  • 4.书写规范
    一行一句,每个大括号缩进(需要设置),缩进四格,注释完整
  • 5.注释符号
    // 单行注释
    /* */ 多行注释
  • 6.学会搜索
    CTRL+F

3.点亮第一个LED(代码)

//sfr P0    = 0x80; 	//原始例程,关键字sfr以红色显示,第一次下载不亮,需修改
//sfr P0M1  = 0x93;
//sfr P0M0  = 0x94;sfr P2    = 0xA0;	//P2端口操作完成(屠龙刀三板载led)
sfr P2M1  = 0x95;
sfr P2M0  = 0x96;//sfr P4    = 0xC0;	//P4端口操作完成(STC32G12K128实验箱-V9.6)
//sfr P4M1  = 0xB3;
//sfr P4M0  = 0xB4;//sfr P6    = 0xE8;	//P6端口操作完成(STC32G12K128实验箱-V9.6)
//sfr P6M1  = 0xCB;
//sfr P6M0  = 0xCC;//sbit P40 = P4^0;    //选择P4.0引脚(三极管控制)
//sbit P60 = P6^0;    //选择P6.0引脚(LED控制)sbit P21 = P2^1;    //选择P2.1引脚(LED控制)(屠龙刀三板载led)void main()
{
//    P0M0 = 0x00; //原始例程,
//    P0M1 = 0x00; //原始例程,//    P4M0 = 0x00; //配置P4为准双向口
//    P4M1 = 0x00;
//    P6M0 = 0x00; //配置P6为准双向口
//    P6M1 = 0x00;P2M0 = 0x00; //配置P2为准双向口(屠龙刀三板载led)P2M1 = 0x00;
//while(1) //死循环{//P0++; //原始例程,
//		 P40 = 0; //三极管引脚输出低电平(STC32G12K128实验箱-V9.6)
//		 P60 = 0; //LED引脚输出低电平(STC32G12K128实验箱-V9.6)P21 = 0; //设置低电平	(屠龙刀三板载led)}
}

4.实现自动下载工程

可参考:学习笔记|LED点亮原理|自动下载最小工程的实现及bug排查思路|USB-HID|USB-CDC实现|STC32G单片机视频开发教程(冲哥)|第四集-下:点亮LED

Tips:EA = 1的解释

EA明显为寄存器,重新编译,跳转打开头文件定义处去看一下"stc.h" -->“stc32g.h”:
在这里插入图片描述
搜索查找EA,定义为:“sbit EA = IE^7;”(IE寄存器里的一个位),打开手册,也有对应的定义:

在这里插入图片描述
手册中IE^7仅出现这一处,信息太少,需要继续搜索IE,特殊寄存器里有IE:

在这里插入图片描述
在这里插入图片描述
离我们需要的详细介绍还有一定差距。接着顺序查找,找到中断使能寄存器(中断允许位):在这里插入图片描述
EA:总中断允许控制位。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受
各中断源自己的中断允许控制位控制。
0: CPU屏蔽所有的中断申请
1:CPU开放中断

5.总结

1.了解新工程的一个基本流程
2.了解IO口的高低电平的含义
3.务必牢记端口的几个寄存器 PxM0,PxM1,Px
4.务必牢记 sbit 的 作用,牢记#include的作用
5.了解USB_cDc不停电下载的用法USB_HID不停电下载

课后练习:点亮全部LED灯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63121.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于kubeasz部署高可用k8s集群

在部署高可用k8s之前&#xff0c;我们先来说一说单master架构和多master架构&#xff0c;以及多master架构中各组件工作逻辑 k8s单master架构 提示&#xff1a;这种单master节点的架构&#xff0c;通常只用于测试环境&#xff0c;生产环境绝对不允许&#xff1b;这是因为k8s集群…

5.0SMDJ24CA 瞬态抑制TVS二极管 可过4kV 2Ω测试

瞬态概述 浪涌描述的是存在于电源或信号线上uS级以上的脉冲。通常浪涌产生于雷击或开关瞬变能量。雷击能量可能是由于直击雷或感应雷作用于系统所产生的瞬变能量&#xff0c;开关瞬变能量通常由于配电系统的电源切换&#xff0c;或是负载的变化导致。 雷击浪涌测试目的 GB/T …

医疗保健中的 NLP:实体链接

一、说明 HEalthcare和生命科学行业产生大量数据&#xff0c;这些数据是由合规性和监管要求&#xff0c;记录保存&#xff0c;研究论文等驱动的。但随着数据量的增加&#xff0c;搜索用于研究目的的必要文件和文章以及数据结构成为一个更加复杂和耗时的过程。例如&#xff0c;如…

【学习FreeRTOS】第6章——FreeRTOS中断管理

【本篇文章的也可参考STM32中断文章http://t.csdn.cn/foF9I&#xff0c;结合着学习效果更好】 1.什么是中断 中断&#xff1a;让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断中断执行机制&#xff0c;可简单概括…

1、Java简介+DOS命令+编译运行+一个简单的Java程序

Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE JavaEE 企业版&#xff1a;包括技术有&#xff1a;Servlet、Jsp&#xff0c;以前称为J2EE JavaME 微型版&#xff1a;以前称为J2ME Java应用&#xff1a; Android平台应用。 大数据平台开发&#xff1a;Hadoo…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

采用pycharm在虚拟环境使用pyinstaller打包python程序

一年多以前&#xff0c;我写过一篇博客描述了如何虚拟环境打包&#xff0c;这一次有所不同&#xff0c;直接用IDE pycharm构成虚拟环境并运行pyinstaller打包 之前的博文&#xff1a; 虚拟环境venu使用pyinstaller打包python程序_伊玛目的门徒的博客-CSDN博客 第一步&#xf…

Chrome浏览器导出插件并安装到其他电脑浏览器上的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

绽放趋势:Python折线图数据可视化艺术

文章目录 一 json数据格式1.1 json数据格式认识1.2 Python数据和Json数据的相互转换 二 pyecharts模块2.1 pyecharts概述2.2 pyecharts模块安装 三 pyecharts快速入门3.1 基础折线图3.2 pyecharts配置选项3.2.1 全局配置选项 3.4 折线图相关配置3.4.1 .add_yaxis相关配置选项3.…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。…

【maven】通过profiles实现:怎样激活某个仓库、同时加载多个profile、不同环境加载不同依赖jar

文章目录 一. 基本用法二. 仓库激活方式1. 使用activeProfile激活2. 使用-P参数激活3. 使用-P参数不激活 三. 查看激活的仓库四. 不同环境依赖不同版本的jar Maven中的profile是一组可选的配置&#xff0c;可以用来设置或者覆盖配置默认值。有了profile&#xff0c;你就可以为不…

Do not access Object.prototype method ‘hasOwnProperty‘ from target object

调用 hasOwnProperty 报错&#xff1a;不要使用对象原型上的方法&#xff0c;因为原型的方法可能会被重写 if (this.formData.selectFields.hasOwnProperty(selectField)) {delete this.formData.selectFields[selectField];} else {this.formData.selectFields[selectField] …