STC16F初探——点亮LED灯

编程入门 行业动态 更新时间:2024-10-09 08:33:36

STC16F初探——点亮<a href=https://www.elefans.com/category/jswz/34/1769323.html style=LED灯"/>

STC16F初探——点亮LED灯

写在前面:这篇文章是想记录笔者的一些学习心得,笔者尚且是一名学生,对于专业知识只是略微入门,文章中可能会有许多错误之处,还望各位多多指正。

文章目录

  • 前言
  • 0 前置知识
  • 1 硬件设计
    • 1.1 连接方式选择
    • 1.2 具体连接
  • 2 代码实现
    • 2.1 I/O口初始化
      • 2.1.1 I/O口的工作模式
      • 2.1.1 配置I/O工作模式
    • 2.2 点亮LED灯
    • 2.3 改进代码
  • 总结


前言

 STC16F40k单片机是STC新一代的16位单片机,同时不需要外部晶振和外部复位。相同的工作频率下,STC16F工作速度远远快于传统8051单片机。同时提供了低功耗模式,以及丰富的数字外设。STC16F算是STC公司的新发展,只是STC16F的库函数不完善,网上资料也较少,在学习过程中,基本要自己摸索。
 本文是对于STC16F的初步使用,关于管脚的基本配置以及点灯操作,本文思路是通过如何实现点亮LED灯,来进行学习。
 使用的单片机为STC16F40K,编译环境为keilC251。


0 前置知识

 LED灯即发光二极管,对于点亮发光二极管,只需要在使元件电压降 > 导通压降即可。对于普通的发光二极管而言,导通压降通常为2V,而单片机的工作电压通常为3.3V > 2V,所以我们只要给二极管的阳极通高电平,阴极通低电平即可实现点亮,如图1所示。

图1 LED灯的点亮
  所以我们如果想要通过控制单片机管脚的电平来点亮LED灯,就有三种连接方式,如图2所示。

1 硬件设计

1.1 连接方式选择

 根据前置知识,我们已经知道如何通过控制LED两极的电压电平,实现点亮LED灯了,那么我们只需要将LED灯连接到单片机的管脚上,再通过控制单片机管脚的电平,就可以实现控制LED灯的亮灭了。而LED灯的连接方式,有且仅有三种连接方式,如图2所示。

图2 LED灯的连接方式
 接下来的问题便是具体选择何种连接方式了。对于图2.c而言,我们知道普通发光二极管只有两种正常状态,即导通与截止,而图2.a与图2.b,一个管脚通过控制管脚的高低电平,已经可以实现控制二极管的两种状态了,就不需要连接两个管脚。
 通常情况下,我们选择图2.b的连接方式,因为单片机的灌电流通常大于拉电流,粗略计算一下,LED灯点亮时电流为5mA左右,而STC16单片机的拉电流为270uA,灌电流为20mA,所以只能选择图2.b的连接方式,才能保证多个LED灯的稳定运行。

灌电流:指电流方向为流入单片机I/O口方向的电流
拉电流:指电流方向为流出单片机I/O口方向的电流

1.2 具体连接

  根据上述的连接方式选择,笔者的STC16F开发板的具体连接如图3所示

图3 LED灯的连接方式
 其中,LED网络端口连接了STC16F单片机的P2.0管脚,而D3V的红灯作为单片机的上电指示灯。

2 代码实现

2.1 I/O口初始化

 在实现具体的硬件设计后,我们只需要利用程序控制单片机管脚的高低电平,就可以实现LED灯的点亮了,那么如何控制STC16F的管脚。根据SCT16F的数据手册的管脚图,如图4所示

图4 STC16F管脚图
 从图4管脚图中可以看出,STC16F40K总共有64根管脚,其中P0~P7,共60个标准I/O口。根据数据手册中,我们知道所有的I/O的上电后的初始状态为高阻输入状态(即输出电平即不是高电平也不是低电平),所以我们必须设置I/O口模式。

2.1.1 I/O口的工作模式

 根据数据手册,我们可以了解到STC16F中的每个I/O口均有四种工作方式:准双向口、推挽输出、高阻输入、开漏输出,如图5所示。

图5 I/O口工作模式
 对于我们点亮LED灯,我们只需要给管脚P2.0一个低电平,不用输出电流,只需要接收较大的灌电流即可,所以,我们选择让管脚作为准双向口的工作模式。

2.1.1 配置I/O工作模式

 根据前面我们已经知道了,我们只需要配置好管脚模式,然后再令管脚电平为低,即可实现我们的点亮LED灯了,那么,如何配置I/O口的工作模式呢?
 根据数据手册8.2配置I/O口,可以得知,我们需要控制两个寄存器PnM0和PnM1,来实现对管脚工作模式的控制,如图6所示。

图6 配置I/O口模式
 根据图5与图6,我们要配置P2.0口具体的代码如下:

	P2M0 = 0x00;//配置P2口模式P2M1 = 0x00;

初始化:即在我们实现代码控制之前,将元件设置为相应的工作状态,配置好相应的时钟信号,从点灯过程中,配置I/O口的工作模式就可以认为对I/O进行初始化

2.2 点亮LED灯

 当我们配置好I/O口的工作模式后,点亮LED就一个非常简单的事情了,找到LED灯连接的管脚,再令管脚变为所需的电平即可了,具体代码如下:

#include "STC16F.h"sbit LED = P2^0;int main()
{P2M1 = 0x00;//配置P2口模式为准双向口P2M0 = 0x00;while(1){LED = 0;//点亮LED灯}return 0;
}

2.3 改进代码

 根据前面的2.2点亮LED灯,我们已经可以实现点亮LED灯的基本任务了,只是对于我们的代码可以进行模块化的处理,将初始化的过程与工作过程模块化,或许对于点亮LED灯这样简单的工作,有点多余,但是对于未来较为复杂的过程,先思考模块的组合关系,再考虑各模块的具体实现,是有助于我们将复杂的问题简单化的。改进代码如下:

#include "STC16F.h"#define uint 		unsigned int
#define uchar		unsigned char
#define LED_Light	LED = 0;	//实现LED亮
#define LED_Dark	LED = 1;	//实现LED灭sbit LED = P2^0;void Pin_Init(void);
void Delayms(uint ms);void main(void)
{Pin_Init();while(1){LED_Light;Delayms(1000);LED_Dark;Delayms(1000);}
}void Pin_Init(void)	//配置管脚初始化函数
{P2M0 = 0x00;	//令P2口为准双向口P2M1 = 0x00;
}void Delayms(uint ms)	//毫秒级延时函数 参数ms,即为延时的毫秒
{uchar i;while(ms--)for(i=0;i<123;i++);
}

 这样我们就大致完成了我们的目标,实现初步控制LED灯,同时实现了LED灯一秒的闪烁。

自顶而下的编程思想:将复杂的问题拆分成多个子问题,在每次编程过程中,只是解决一个个的小问题,减少思考的难度。
对于硬件开发,将硬件接口的控制,与应用层分开,有利于未来对应用层算法函数的调用,而不需要考虑不同硬件带来的不同。

总结

 本文只是对于STC16F的初步学习,甚至确切地说,只是学习熟悉STC16F单片机的管脚以及数据手册,点灯是非常简单的一个控制,STC16F有着非常强大的功能,以及丰富的外设,点灯只是漫漫长路的起点,或许我们只是刚刚站在了山脚之下。
 这篇文章,一方面只是为了记录个人的学习,对于学习内容有所总结与归纳;另一方面是,希望尝试写自己的博客,对于自己的成长有所记录。所以,无论在技术上,还是在博客的内容上,笔者都尚且只是一个懵懂无知的少年,如果这其中,有任何错误之处,还希望大家能及时指出,多多指点。

更多推荐

STC16F初探——点亮LED灯

本文发布于:2024-03-14 04:55:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735675.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:STC16F   LED

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!