学习目标

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

    学习内容

    理解电灯案例的代码

    ```c

    include “STC8H.H”

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

  1. P53 = 1;
  2. while(1) {}

}

  1. - `#include "STC8H.H"` 引入头文件
  2. - `P5M0 = 0x00;P5M1 = 0x00;`配置引脚模式
  3. - `P53=1;`配置IO引脚的电平
  4. <a name="K78UB"></a>
  5. ### 头文件STC8H.H
  6. 针对 STC8H 系列芯片的头文件,如果Keil软件没有配置STC8环境,此处是无法导入的。<br />`STC8H.H`文件的存储目录,在Keil安装目录下的 `C51\INC\STC`文件夹下。内部有其他STC芯片的头文件,如果你用的是其他芯片,则`include`对应的头文件。
  7. <a name="tI9VZ"></a>
  8. ### 引脚工作模式
  9. 1. STC8H文档下载。通过`STC-ISP`软件进行资料下载。
  10. ![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=)
  11. 2. 打开STC8H用户手册。跳转到`I/O`
  12. ![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 />其中我们可以通过手册获得一些信息:
  13. - 1个端口对应8个引脚
  14. - 每个端口都由一个寄存器控制
  15. - 系列不同,端口数量不同
  16. - 每个引脚可配置4种不同的工作模式
  17. IO口的工作模式:
  18. | 工作模式 | PnM1 | PnM0 | 说明 |
  19. | --- | --- | --- | --- |
  20. | 准双向口 | 0 | 0 | 弱上拉。灌电流可达20mA,拉电流为270~150uA |
  21. | 推挽输出 | 0 | 1 | 强上拉输出。可达20mA,要加限流电阻 |
  22. | 高阻输入 | 1 | 0 | 电流既不能流入也不能流出 |
  23. | 开漏输出 | 1 | 1 | 内部上拉电阻断开。开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平。 |
  24. 代码中:
  25. ```c
  26. P5M0 = 0x00;
  27. P5M1 = 0x00;

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

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

  1. P5M1 &= ~0x08, P5M0 &= ~0x08; //准双向口
  2. P5M1 &= ~0x08, P5M0 |= 0x08; //推挽输出
  3. P5M1 |= 0x08, P5M0 &= ~0x08; //高阻输入
  4. 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工具,进行如下操作:
16.png
如图所示我们关注几个点:

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

指令集主要针对的是芯片型号,选择不同型号,旁边会提示是否包含你所开发的芯片,我们在此使用STC-Y6,因为我吗使用的是STC8H的系列。
睡眠时长,是你希望提供的睡眠时间长度,根据实际情况而定。
系统频率,需要注意的是需要和烧录频率一致,否则会出现时间不匹配问题。
根据以上操作我们可以实现,LED每隔一秒钟闪烁的逻辑。

  1. #include "STC8H.H"
  2. void Delay1000ms() //@11.0592MHz
  3. {
  4. unsigned char i, j, k;
  5. i = 57;
  6. j = 27;
  7. k = 112;
  8. do
  9. {
  10. do
  11. {
  12. while (--k);
  13. } while (--j);
  14. } while (--i);
  15. }
  16. int main() {
  17. P5M1 &= ~0x08, P5M0 &= ~0x08; //准双向口
  18. //P5M1 &= ~0x08, P5M0 |= 0x08; //推挽输出
  19. //P5M1 |= 0x08, P5M0 &= ~0x08; //高阻输入
  20. //P5M1 |= 0x08, P5M0 |= 0x08; //开漏输出
  21. while(1) {
  22. P53 = 1;//开
  23. Delay1000ms();
  24. P53 = 0;//关
  25. Delay1000ms();
  26. }
  27. }

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

练习题

  1. 实现点灯
  2. 实现闪烁
  3. 尝试不同模式下点灯,得出结论。