前言
给自己找点事干,总使用 Arduino 感觉自己思维被局限了(Arduino 就像 Python,用多了就下不去了),以前没时间,现在推掉点不喜欢事,终于是能空出来一点时间了。
STC8G1K08A-8PIN(DIP8)
感觉是比 STC89C52RC 更加适合新手入门的芯片,内置 IRC,能直接上面包板使。
价格也非常美丽,非包邮状态下一个芯片只需要 1~2 元。
并且后续 STC8 系列中还有很多不同的封装,性能 MAX。
不得不说,DIP 封装完美戳中我 XP😍,就是有点废手
配置 I/O
了解 STC 前先了解一下 Arduino 的 I/0 状态。
Arduino
Arduino 中设置 I/O 的方法是 pinMode()1,三种状态分别是 OUTPUT、INTPUT 和 INPUT_PULLUP2。
名称 | 效果 |
---|---|
OUTPUT | 低阻抗状态,能够向其他电路提供或吸收 40mA 的电流(具体看 Atmega 芯片型号) |
INPUT | 高阻抗状态,该状态下相当于在引脚前串联一个 100M 的电阻,使引脚状态变化只需要少量电流即可 |
INPUT_PULLUP | 上拉电阻状态,芯片内置有 20K 的上拉电阻,反转了 INPUT 下的工作状态,该状态下允许访问内部的上拉电阻,默认状态下读取为高电平 |
STC
以 STC8G 系列为例3,每个 I/0 的配置都需要使用两个寄存器进行设置。
以 P0 口为例,配置 P0 口需要使用 P0M0 和 P0M1 两个寄存器进行配置,如下表所示:
PnM1 | PnM0 | I/O 口工作模式 |
---|---|---|
0 | 0 | 准双向口(传统8051端口模式,弱上拉) 灌电流可达 20mA,拉电流为 270~150uA (存在制造误差) |
0 | 1 | 推挽输出(强上拉输出,可达 20mA,要加限流电阻) |
1 | 0 | 高阻输入(电流即不能流入也不能流出) |
1 | 1 | 开漏输出(Open-Drain),内部上拉电阻断开 开漏输出模式即可读外部状态也可对外输出(高电平或低电平)。 如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平 |
注意:PnM0 = 0x00 (Pn^7 Pn^6 Pn^5 Pn^4 Pn^3 Pn^2 Pn^1 Pn^0)
在 STC8 系列中,所有 I/O 口均可使能一个约 4.7K 的上拉电阻,实现 Arduino 中的 INPUT_PULLUP 状态。
方法和配置 I/O 相同,需要对 PnPU 寄存器进行修改:
- 0:禁止端口内部的 4.7K 上拉电阻
- 1:使能端口内部的 4.7K 上拉电阻
注意
虽然每个 I/O 口在弱上拉/强推挽输出/开漏模式时都承受 20mA 的灌电流(还是要加限流电阻),在强推挽输出时能输出 20mA 的拉电流(也要加限流电阻),但整个芯片的工作电流推荐不要超过 70mA,STC8G1K08A 系列和 STC8G1K08-8Pin 系列整个芯片的工作电流不建议超过 35mA🤨。
点亮LED
推挽输出点亮
电路图
代码
#include <STC8G.h>
void Delay1000ms() { //@11.0592MHz unsigned char i, j, k;
i = 57; j = 27; k = 112; do { do { while (--k); } while (--j); } while (--i);}
void main() { // P5^7 P5^6 P5^5 P5^4 P5^3 P5^2 P5^1 P5^0 P5M0 = 0x10; // B00010000 P5M1 = 0x00; // B00000000
P54 = 0; Delay1000ms(); P54 = 1; Delay1000ms();
while (1) { P54 = 0; Delay1000ms(); P54 = 1; Delay1000ms(); Delay1000ms(); }}
最终的效果是:亮 2s,暗 1秒,相互交替
开漏输出点亮
电路图
代码
void main() { // P5^7 P5^6 P5^5 P5^4 P5^3 P5^2 P5^1 P5^0 P5M0 = 0x10; // B00010000 P5M1 = 0x10; // B00000000
...}
最终的效果是:暗 2s,亮 1秒,相互交替
准双向口点亮
准双向口在理论上两种电路都适用,但受限与 270~150uA 的拉电流,不推荐使用直接电流(即推挽输出电量)的方式。
void main() { // P5^7 P5^6 P5^5 P5^4 P5^3 P5^2 P5^1 P5^0 P5M0 = 0x00; // B00010000 P5M1 = 0x00; // B00000000
...}