找回密码
 立即注册
查看: 226|回复: 0

stc8h8k64u|GPIO理解

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2025-12-10 00:23:34
已绑定手机

5

主题

15

回帖

117

积分

注册会员

积分
117
发表于 2025-11-13 13:32:03 | 显示全部楼层 |阅读模式

学习目标

  1. 了解C51的GPIO的模式
  2. 熟悉芯片手册的阅读
  3. 了解如何将手册中的要求变为代码实现

学习内容

理解电灯案例的代码

#include "STC8H.H"

int main() {
    P5M0 = 0x00;
    P5M1 = 0x00;

    P53 = 1;
    while(1) {}
}
  • #include "STC8H.H" 引入头文件
  • P5M0 = 0x00;P5M1 = 0x00;配置引脚模式
  • P53=1;配置IO引脚的电平

头文件STC8H.H

针对 STC8H 系列芯片的头文件,如果Keil软件没有配置STC8环境,此处是无法导入的。

STC8H.H文件的存储目录,在Keil安装目录下的 C51\INC\STC文件夹下。内部有其他STC芯片的头文件,如果你用的是其他芯片,则 include对应的头文件。

引脚工作模式

  1. STC8H文档下载。通过 STC-ISP软件进行资料下载

  2. 打开STC8H用户手册。跳转到`I/O`口

其中我们可以通过手册获得一些信息:

  • 1个端口对应8个引脚
  • 每个端口都由一个寄存器控制
  • 系列不同,端口数量不同
  • 每个引脚可配置4种不同的工作模式

IO口的工作模式:

工作模式 PnM1 PnM0 说明
准双向口 0 0 弱上拉,即可输入也可输出
灌电流可达20mA,拉电流为270~150uA
推挽输出 0 1 强上拉输出。可达20mA,要加限流电阻
高阻输入 1 0 电流既不能流入也不能流出,但可用于测电平
开漏输出 1 1 内部上拉电阻断开。开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻**,否则读不到外部状态,也对外输不出高电平。**

代码中:

P5M0 = 0x00;
P5M1 = 0x00;

指的是P5端口所有的引脚为准双向口输出,如果想设置为其他模式,可以根据实际需求进行配置。

当前我们电灯是要控制P5端口的3号引脚,也就是P53这个引脚。理论上只需要设置这个引脚的工作模式即可。

P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出
  • P5表示的是5号端口
  • **0x08表示的是3号引脚,对应二进制 0000 1000

引脚编号和值的对应关系

编号
0 0x01
1 0x02
2 0x04
3 0x08
4 0x10
5 0x20
6 0x40
7 0x80

如果想配置任意端口的任意引脚的工作模式,可以通过上面的方式类比出来。

软延时操作

软延时操作

软延时指的是通过代码来进行延时睡眠操作。我们可以借助工具来提供软延时的代码。

打开 STC-ISP工具,进行如下操作:
image.png

如图所示我们关注几个点:

  • 系统频率
  • 睡眠时长
  • 指令集

指令集主要针对的是芯片型号,选择不同型号,旁边会提示是否包含你所开发的芯片,我们在此使用STC-Y6,因为我吗使用的是STC8H的系列。

睡眠时长,是你希望提供的睡眠时间长度,根据实际情况而定。

系统频率,需要注意的是需要和烧录频率一致,否则会出现时间不匹配问题。

根据以上操作我们可以实现,LED每隔一秒钟闪烁的逻辑。

#include "STC8H.H"

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 57;
	j = 27;
	k = 112;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main() {
	P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
	//P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
	//P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
	//P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出

	while(1) {
		P53 = 1;//开
		Delay1000ms();
		P53 = 0;//关
		Delay1000ms();
	}
}

如果感兴趣,可以为P53引脚设置不同工作模式,来观察效果。

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-6 22:41 , Processed in 0.119037 second(s), 47 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表