学习目标
int main() { P5M0 = 0x00; P5M1 = 0x00;
P53 = 1;while(1) {}
}
- `#include "STC8H.H"` 引入头文件- `P5M0 = 0x00;P5M1 = 0x00;`配置引脚模式- `P53=1;`配置IO引脚的电平<a name="K78UB"></a>### 头文件STC8H.H针对 STC8H 系列芯片的头文件,如果Keil软件没有配置STC8环境,此处是无法导入的。<br />`STC8H.H`文件的存储目录,在Keil安装目录下的 `C51\INC\STC`文件夹下。内部有其他STC芯片的头文件,如果你用的是其他芯片,则`include`对应的头文件。<a name="tI9VZ"></a>### 引脚工作模式1. STC8H文档下载。通过`STC-ISP`软件进行资料下载。2. 打开STC8H用户手册。跳转到`I/O`口<br />其中我们可以通过手册获得一些信息:- 1个端口对应8个引脚- 每个端口都由一个寄存器控制- 系列不同,端口数量不同- 每个引脚可配置4种不同的工作模式IO口的工作模式:| 工作模式 | PnM1 | PnM0 | 说明 || --- | --- | --- | --- || 准双向口 | 0 | 0 | 弱上拉。灌电流可达20mA,拉电流为270~150uA || 推挽输出 | 0 | 1 | 强上拉输出。可达20mA,要加限流电阻 || 高阻输入 | 1 | 0 | 电流既不能流入也不能流出 || 开漏输出 | 1 | 1 | 内部上拉电阻断开。开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平。 |代码中:```cP5M0 = 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工具,进行如下操作:
如图所示我们关注几个点:
- 系统频率
- 睡眠时长
- 指令集
指令集主要针对的是芯片型号,选择不同型号,旁边会提示是否包含你所开发的芯片,我们在此使用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();}}
练习题
- 实现点灯
- 实现闪烁
- 尝试不同模式下点灯,得出结论。
