前言

通过前一篇文章的分享,我们已经成功搭建好了一个普适性的单片机框架,而这篇文章我们将开始编写第一个实验:LED闪烁实验。
代码的编写均在VSCode编辑器中进行;编写代码的文件为main.c文件和main.h文件!

步骤一

首先需要先在单片机上任意找一个IO口,如:P2_0
接着在main.h文件中写入代码:

#define P_led1 P2_0
#define F_led1On() P_led1 = 0
#define F_led1Off() P_led1 = 1

然后在main.c文件的主函数中写入:

#define __main_c
#include "includeAll.h"//============================================
void main() {F_turnOnWDT(); // 看门狗寄存器InitSys();while (1) {F_led1On();F_led1Off();}
}
//============================================
void InitSys() {// system clockCLKCON = 0x03;  // Clock div 1STPPCK = 0;STPFCK = 0;_nop_();_nop_();_nop_();_nop_();_nop_();SELFCK = 1;// I/O initP2MOD = 0xa;
}
//============================================
void DisplayProcess() {}
//============================================
void UserSettingProcess() {}
//============================================
void TaskProcess() {}
//============================================
void TimeProcess() {}
//============================================

然后,在Keil C51编译器中进行debug测试。看看该单片机是当给一个低电压(即“P_led1 = 0”)时,P2_0引脚上的LED灯亮还是当给一个高电压(即“P_led1 = 1”)时,P2_0引脚上的LED灯亮,即IO口是共阳极还是共阴极

测试结果是:当给一个低电压(即“P_led1 = 0”)时,P2_0引脚上的LED灯亮,当给一个高电压(即“P_led1 = 1”)时,P2_0引脚上的LED灯灭。

步骤二:编写逻辑代码

  1. main.h
#ifndef __main_h
#define __main_h#define P_led1 P2_0
#define P_led2 P2_1
#define F_led1On() P_led1 = 0
#define F_led1Off() P_led1 = 1
#define F_led2On() P_led2 = 0
#define F_led2Off() P_led2 = 1void InitSys();
void DisplayProcess();
void UserSettingProcess();
void TimeProcess(int time);
void TaskProcess();#endif
  1. main.c
#define __main_c
#include "includeAll.h"//============================================
void main() {F_turnOnWDT(); // 看门狗寄存器InitSys();while (1) {F_led1On();TimeProcess(2000);F_led1Off();TimeProcess(2000);}
}
//============================================
void InitSys() {// system clockCLKCON = 0x03;  // Clock div 1STPPCK = 0;STPFCK = 0;_nop_();_nop_();_nop_();_nop_();_nop_();SELFCK = 1;// I/O initP2MOD = 0xa;}
//============================================
void DisplayProcess() {}
//============================================
void UserSettingProcess() {}
//============================================
void TaskProcess() {}
//============================================
void TimeProcess(int time) {int i, j;for (i = 0; i < time; i++)for (j = 0; j < 1000; j++)CLRWDT = 1;
}

细节解说

  1. main.h文件中属于框架的部分:
#ifndef __main_h
#define __main_h#endif
  1. main.h文件中六个#define的声明时为了更明确的表示IO口“P2_0”及其 0 和 1 的状态,关于名称的命名规则可以参考我的上一篇文章中第8点:取名字规则,这里不再赘述:
#define P_led1 P2_0
#define P_led2 P2_1
#define F_led1On() P_led1 = 0
#define F_led1Off() P_led1 = 1
#define F_led2On() P_led2 = 0
#define F_led2Off() P_led2 = 1
  1. main.c文件中属于框架的部分:
#define __main_c
#include "includeAll.h"//============================================
void main() {// do somethingwhile (1) {}
}
//============================================
void InitSys() {}
//============================================
void DisplayProcess() {}
//============================================
void UserSettingProcess() {}
//============================================
void TaskProcess() {}
//============================================
void TimeProcess() {}
  1. main.c文件中:F_turnOnWDT();会被编译为:CFGWL = (CFGWL & 0x3f) | 0xC0
    “CFGWL”是“CFGW”寄存器的低八位。当其被赋值(CFGWL & 0x3f) | 0xC0,即“11?? ???”(?表示可能为1也可能为0)时,表示“看门狗定时器复位始终启用”,而这就有可能会发生看门狗定时器溢出的情况,因此需要在“TimeProcess()”当中加上CLRWDT = 1;,即设置以清除看门狗定时器
  2. main.c文件中,InitSys();是初始化函数,其中CLKCON = 0x03;用于设置系统时钟的初始化状态及系统时钟是快/慢时钟除以1;STPPCK = 0;当将其设置为1时将停止UART/Timer0/Timer1/Timer2/ADC在空闲模式的时钟;STPFCK = 0;当将其设置为1时将停止快时钟以节省慢钟/空闲;SELFCK = 1;将系统时钟源选择设置为快时钟;_nop_();是指包括在库函数INTRINS.H中的表示空循环一个机器指令的时间。关于系统时钟的更多信息如下图所示:
  3. main.c文件中,InitSys()函数中的P2MOD = 0xa;将单片机上P2MOD寄存器中的特殊功能位P2MOD1和P2MOD0置为“10”,即模式2:CMOS推挽输出:
  4. main.c文件中的void TimeProcess() {}同时编写一个嵌套的for循环来实现延时。

实验结果

十速单片机学习归纳总结(四):LED闪烁实验相关推荐

  1. 51单片机学习:LED闪烁实验

    实验名称:LED闪烁实验 接线说明:     实验现象:下载程序后"LED模块"的D1指示灯闪烁 注意事项:                                     ...

  2. 基于STC15W4K32S4单片机仿真《多个LED闪烁》

    1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12.据说8.9版本也可以. 3.单片机选型:STC15W4K32S4 4.学 习 目 标:1.学习延时函数 2.学习子函 ...

  3. 51单片机 | 点亮第一个LED | LED 闪烁实验 | LED流水灯实验

    文章目录 一.51单片机GPIO介绍 1.GPIO概念 2.GPIO 结构框图与工作原理 2.1 P0端口 2.2 P1端口 2.3 P2端口 2.4 P3端口 2.5 要点 二.LED简介 三.硬件 ...

  4. 【ZYNQ】从入门到秃头05 LED闪烁实验 按键控制LED实验Verilog(PL)

    文章目录 LED闪烁实验Verilog(PL) 硬件设计 程序设计 创建Verilog HDL文件 编写Verilog 添加管脚约束 添加时序约束 生成BIT文件 Vivado仿真 下载 按键控制LE ...

  5. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

    一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...

  6. keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)

    [朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...

  7. 单片机学习笔记(四)——串行口

    51单片机内部有一个全双工的异步通信串行口,有四种工作方式波特率可由软件设置片内的定时器/计数器来控制.特殊功能寄存器SCON和PCON用来对串行口进行控制.下面先介绍这两个寄存器: 1.SCON 字 ...

  8. 51单片机学习笔记_7 绘制LED动画:Merry Christmas 滚动字幕

    封装头文件:绘制LED动画 类似C语言的语法,部分函数等内容可以封装到头文件里,需要的时候引入到source file 中,再在 include 中指明即可正常使用. 编写.h文件:如: 引入.h文件 ...

  9. 普中51单片机学习日记-点亮LED

    普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...

最新文章

  1. python 函数参数传递 格式_Python学习6.1_函数参数及参数传递
  2. 今天直播 | 融合媒体智能升级秘钥!
  3. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
  4. 前端开发者必备的20个文档和在线工具
  5. 【leetcode 简单】 第三十五题 环形链表
  6. 删除选修c语言课程的女生成绩记录,pta10-1 查询没有选修‘C语言‘课程的学生 (10分)...
  7. java queue的实例化_如何在java中实例化Queue对象?
  8. java 随机数性能优化
  9. usb_modeswitch下载与安装
  10. 可靠性测试审查checklist
  11. Unable to initialize EGL
  12. DAC0832数模转换芯片介绍及使用教程
  13. at命令不生效 linux_Linux命令之at
  14. C++实现单链表的基本操作
  15. Linux学习-17-rpm查询软件包命令(-q、-qa、-i、-p、-l、-f、-R)
  16. 面向对象的五大原则是什么
  17. HTML04-form表单
  18. Windows 2008 R2、2012 R2 磁盘扩容、新加磁盘
  19. 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)
  20. 珂朵莉与妖精仓库的妖精们

热门文章

  1. 大蟒蛇python编译器_python蟒蛇绘制
  2. 2020年985大学计算机分数线,2020年985大学名单分数线
  3. IE浏览器提示无法安全地连接到此页面,这可能是因为该站点使用过期的或不安全的 TLS 安全设置.该如何解决?
  4. ABP框架—项目文件介绍(2)
  5. oracle中 ''dual'' 的含义
  6. 秋夜长,怎奈碎念悠怅
  7. 简体遇繁体 饭菜先生餐饮软件悄入台湾
  8. 经典游戏 红白游戏 NES/FC游戏模拟器
  9. Newman基本使用
  10. 关于毕业必须知道的知识之就业、派遣(1)