文章目录
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(扩展名建议小写):
写入代码:
![](/qrcode.jpg)
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不停电下载