好的,根据从 STC8G 数据手册和 AI8 手册中获得的信息,特别是关于引脚配置和 SOP8 封装特性的说明,我为你编写了以下两个演示程序。
重要说明
-
关于封装与引脚 P3.4:
根据手册, STC8G1K08A-SOP (SOP8) 封装只有 6 个可用 I/O 口,分别为 P3.0, P3.1, P3.2, P3.3, P5.4, P5.5。
该封装没有 P3.4 引脚。
你要求的 P3.4 仅在 TSSOP20 或 SOP16 封装(如 STC8G1K08A-38I-TSSOP20)上存在。因此,以下流水灯程序会基于 SOP8 封装的 6 个引脚实现。如果你需要使用 P3.4,请改用 TSSOP20 封装的芯片。
-
关于 I/O 口初始化(关键!):
根据手册第4.5.5节:
- P3.0 和 P3.1:上电后默认是准双向口,可以直接输出。
- 其他 I/O 口 (P3.2, P3.3, P5.4, P5.5):上电后均为高阻输入状态,必须在程序初始化时先设置模式,否则无法正常输出高低电平!
手册建议:驱动 LED 时,推荐使用推挽输出模式,并采用高电平点亮,这样可以获得更好的驱动能力和稳定性,避免地线干扰。
-
关于点亮方式:
你要求“低电平点亮”。在推挽模式下,无论高电平还是低电平,驱动能力都很强。以下代码在推挽模式下实现你要求的低电平点亮逻辑。
程序1:P3.0 单独低电平点亮 LED
这个程序专门用于测试 P3.0 引脚是否能正常驱动 LED。
#include "STC8G.h"
#include "intrins.h"
#define MAIN_Fosc 24000000L // 定义主时钟为 24MHz
// 如果使用的是 Ai8G1K08A 系列,请包含 Ai8G.h 头文件
// #include "Ai8G.h"
sbit LED_P30 = P3^0;
void delay_ms(unsigned int ms)
{
unsigned int i;
do {
i = MAIN_Fosc / 10000;
while(--i);
} while(--ms);
}
void main(void)
{
// --- 初始化 I/O 口模式 ---
// 设置 P3.0 为推挽输出模式 (P3M0=1, P3M1=0)
// 推挽模式下,低电平驱动能力很强,适合点亮 LED
P3M0 |= 0x01; // 设置 P3.0 对应位为 1
P3M1 &= ~0x01; // 设置 P3.0 对应位为 0
// 也可以设置为准双向口(默认模式),但驱动电流较小
// P3M0 &= ~0x01;
// P3M1 &= ~0x01;
// 关闭所有无关外设以节省功耗(可选)
P_SW2 = 0x80; // 使能访问 XFR
// 根据具体型号关闭不需要的外设时钟...
delay_ms(100); // 等待系统稳定
// --- 主循环 ---
while(1)
{
// 低电平点亮 LED(假设 LED 正极接 VCC,负极通过限流电阻接 P3.0)
LED_P30 = 0;
// 如果想闪烁,可以取消下面的注释
// delay_ms(500);
// LED_P30 = 1;
// delay_ms(500);
}
}
程序2:6 路流水灯(SOP8 封装可用引脚)
这个程序实现了 P3.0, P3.1, P3.2, P3.3, P5.4, P5.5 的流水灯效果。请根据你的实际硬件封装修改引脚数组。
#include "STC8G.h"
#include "intrins.h"
#define MAIN_Fosc 24000000L
// 定义需要操作的引脚
// 注意:SOP8 封装下无 P3.4,以下是 SOP8 的 6 个引脚
// 如果你使用的是 TSSOP20 封装,可以取消 P3.4 的注释,并启用对应的引脚
sbit LED0 = P3^0;
sbit LED1 = P3^1;
sbit LED2 = P3^2;
sbit LED3 = P3^3;
// sbit LED4 = P3^4; // SOP8 封装无此引脚!请改用 TSSOP20
sbit LED5 = P5^4;
sbit LED6 = P5^5;
// 定义引脚组:数组方式便于流水灯操作
// 按照流水灯顺序排列:P3.0, P3.1, P3.2, P3.3, P5.4, P5.5
#define LED_PORT_COUNT 6
// 毫秒级延时函数 (24MHz 下粗略延时)
void delay_ms(unsigned int ms)
{
unsigned int i;
do {
i = MAIN_Fosc / 10000;
while(--i);
} while(--ms);
}
void main(void)
{
unsigned char i;
// --- 初始化所有用到的 I/O 口为推挽输出 ---
// 推挽输出模式下,高低电平都有很强的驱动能力
// P3.0 - P3.3: 设置为推挽输出
P3M0 |= 0x0F; // 位0-3 置1
P3M1 &= ~0x0F; // 位0-3 置0
// P5.4, P5.5: 设置为推挽输出
P5M0 |= 0x30; // 位4,5 置1
P5M1 &= ~0x30; // 位4,5 置0
// 如果需要使用 P3.4 (仅 TSSOP20 封装),取消下面的注释
// P3M0 |= 0x10;
// P3M1 &= ~0x10;
// --- 初始化所有 LED 为熄灭状态(高电平熄灭,低电平点亮)---
// 先全部置高(熄灭)
P3 |= 0x0F; // P3.0 - P3.3 置1
// P3 |= 0x10; // P3.4 (仅 TSSOP20)
P5 |= 0x30; // P5.4, P5.5 置1
delay_ms(200); // 等待系统稳定
// --- 主循环:流水灯 ---
while(1)
{
// 循环点亮每一个 LED(低电平点亮)
for(i = 0; i < LED_PORT_COUNT; i++)
{
// 根据 i 的值点亮对应的 LED
switch(i)
{
case 0: LED0 = 0; break;
case 1: LED1 = 0; break;
case 2: LED2 = 0; break;
case 3: LED3 = 0; break;
// case 4: LED4 = 0; break; // P3.4 (仅 TSSOP20)
case 4: LED5 = 0; break; // P5.4
case 5: LED6 = 0; break; // P5.5
default: break;
}
delay_ms(150); // 每个 LED 亮 150ms
// 熄灭当前 LED(置高)
switch(i)
{
case 0: LED0 = 1; break;
case 1: LED1 = 1; break;
case 2: LED2 = 1; break;
case 3: LED3 = 1; break;
// case 4: LED4 = 1; break; // P3.4 (仅 TSSOP20)
case 4: LED5 = 1; break; // P5.4
case 5: LED6 = 1; break; // P5.5
default: break;
}
}
}
}
硬件连接与注意事项
-
LED 连接方式:
- LED 正极 → VCC (3.3V 或 5V)
- LED 负极 → 限流电阻 (约 330Ω ~ 1kΩ) → 单片机引脚
- 这样当引脚输出低电平时,电流从 VCC 流过 LED 和电阻到引脚,LED 点亮。
-
关于 P3.0 和 P3.1:
- 这两个引脚同时也是串口下载引脚 (RxD/TxD)。
- 如果在下载程序时,这两个引脚上的 LED 电路可能会影响下载,请在下载前拔掉下载线,或者确保 LED 电路不会将引脚电平拉死。
- 下载完成后,再插上 LED 电路观察效果。
-
关于封装:
- 如果你确实需要 7 个 I/O 口 (P3.0 ~ P3.4, P5.4, P5.5),请务必更换为 TSSOP20 或 SOP16 封装的
STC8G1K08A-38I 系列。
- SOP8 封装最多只能有 6 个 I/O 口。
-
如果 LED 不亮:
- 检查 I/O 口是否已初始化为 推挽输出 (PxM0/PxM1 寄存器设置正确)。
- 检查 LED 的极性和限流电阻是否接对。
- 如果是 SOP8 封装,请确认你没有使用 P3.4。
🔍 搜索 "STC8G1K08A-SOP 工作在24MHz 需要 :
1"
📌 相关论坛讨论
- 求助 STC8G1K08A的P3.0引脚如何点亮led
- 冲哥视频学习笔记
- 学习感悟分享