学习目标
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`软件进行资料下载。
![14.png](https://cdn.nlark.com/yuque/0/2023/png/21441195/1678948347496-24a5dcf2-cf57-4c88-a178-422efb58968c.png#averageHue=%23e6e5e4&clientId=ud90e2b7a-5ed3-4&from=ui&id=udafd99c0&originHeight=880&originWidth=1333&originalType=binary&ratio=1&rotation=0&showTitle=false&size=447164&status=done&style=none&taskId=ua986640c-2af3-4f59-be4e-f556f57facb&title=)
2. 打开STC8H用户手册。跳转到`I/O`口
![15.png](https://cdn.nlark.com/yuque/0/2023/png/21441195/1678948606932-e4f8979a-5384-4354-bee7-fc4917a83b10.png#averageHue=%233c4043&clientId=ud90e2b7a-5ed3-4&from=ui&id=u943b3099&originHeight=994&originWidth=573&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54091&status=done&style=none&taskId=u80497783-1613-4465-90ba-aa26ccb2e44&title=)<br />其中我们可以通过手册获得一些信息:
- 1个端口对应8个引脚
- 每个端口都由一个寄存器控制
- 系列不同,端口数量不同
- 每个引脚可配置4种不同的工作模式
IO口的工作模式:
| 工作模式 | PnM1 | PnM0 | 说明 |
| --- | --- | --- | --- |
| 准双向口 | 0 | 0 | 弱上拉。灌电流可达20mA,拉电流为270~150uA |
| 推挽输出 | 0 | 1 | 强上拉输出。可达20mA,要加限流电阻 |
| 高阻输入 | 1 | 0 | 电流既不能流入也不能流出 |
| 开漏输出 | 1 | 1 | 内部上拉电阻断开。开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平。 |
代码中:
```c
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
工具,进行如下操作:
如图所示我们关注几个点:
- 系统频率
- 睡眠时长
- 指令集
指令集主要针对的是芯片型号,选择不同型号,旁边会提示是否包含你所开发的芯片,我们在此使用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();
}
}
练习题
- 实现点灯
- 实现闪烁
- 尝试不同模式下点灯,得出结论。