十速单片机学习归纳总结(四):LED闪烁实验
前言
通过前一篇文章的分享,我们已经成功搭建好了一个普适性的单片机框架,而这篇文章我们将开始编写第一个实验: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灯灭。
步骤二:编写逻辑代码
- 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
- 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;
}
细节解说
- main.h文件中属于框架的部分:
#ifndef __main_h
#define __main_h#endif
- 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
- main.c文件中属于框架的部分:
#define __main_c
#include "includeAll.h"//============================================
void main() {// do somethingwhile (1) {}
}
//============================================
void InitSys() {}
//============================================
void DisplayProcess() {}
//============================================
void UserSettingProcess() {}
//============================================
void TaskProcess() {}
//============================================
void TimeProcess() {}
- main.c文件中:
F_turnOnWDT();
会被编译为:CFGWL = (CFGWL & 0x3f) | 0xC0
“CFGWL”是“CFGW”寄存器的低八位。当其被赋值(CFGWL & 0x3f) | 0xC0
,即“11?? ???”(?表示可能为1也可能为0)时,表示“看门狗定时器复位始终启用”,而这就有可能会发生看门狗定时器溢出的情况,因此需要在“TimeProcess()”当中加上CLRWDT = 1;
,即设置以清除看门狗定时器。 - main.c文件中,
InitSys();
是初始化函数,其中CLKCON = 0x03;
用于设置系统时钟的初始化状态及系统时钟是快/慢时钟除以1;STPPCK = 0;
当将其设置为1时将停止UART/Timer0/Timer1/Timer2/ADC在空闲模式的时钟;STPFCK = 0;
当将其设置为1时将停止快时钟以节省慢钟/空闲;SELFCK = 1;
将系统时钟源选择设置为快时钟;_nop_();
是指包括在库函数INTRINS.H
中的表示空循环一个机器指令的时间。关于系统时钟的更多信息如下图所示:
- main.c文件中,InitSys()函数中的
P2MOD = 0xa;
将单片机上P2MOD寄存器中的特殊功能位P2MOD1和P2MOD0置为“10”,即模式2:CMOS推挽输出:
- main.c文件中的
void TimeProcess() {}
同时编写一个嵌套的for循环来实现延时。
实验结果
十速单片机学习归纳总结(四):LED闪烁实验相关推荐
- 51单片机学习:LED闪烁实验
实验名称:LED闪烁实验 接线说明: 实验现象:下载程序后"LED模块"的D1指示灯闪烁 注意事项: ...
- 基于STC15W4K32S4单片机仿真《多个LED闪烁》
1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12.据说8.9版本也可以. 3.单片机选型:STC15W4K32S4 4.学 习 目 标:1.学习延时函数 2.学习子函 ...
- 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简介 三.硬件 ...
- 【ZYNQ】从入门到秃头05 LED闪烁实验 按键控制LED实验Verilog(PL)
文章目录 LED闪烁实验Verilog(PL) 硬件设计 程序设计 创建Verilog HDL文件 编写Verilog 添加管脚约束 添加时序约束 生成BIT文件 Vivado仿真 下载 按键控制LE ...
- 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示
一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...
- keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)
[朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...
- 单片机学习笔记(四)——串行口
51单片机内部有一个全双工的异步通信串行口,有四种工作方式波特率可由软件设置片内的定时器/计数器来控制.特殊功能寄存器SCON和PCON用来对串行口进行控制.下面先介绍这两个寄存器: 1.SCON 字 ...
- 51单片机学习笔记_7 绘制LED动画:Merry Christmas 滚动字幕
封装头文件:绘制LED动画 类似C语言的语法,部分函数等内容可以封装到头文件里,需要的时候引入到source file 中,再在 include 中指明即可正常使用. 编写.h文件:如: 引入.h文件 ...
- 普中51单片机学习日记-点亮LED
普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...
最新文章
- python 函数参数传递 格式_Python学习6.1_函数参数及参数传递
- 今天直播 | 融合媒体智能升级秘钥!
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
- 前端开发者必备的20个文档和在线工具
- 【leetcode 简单】 第三十五题 环形链表
- 删除选修c语言课程的女生成绩记录,pta10-1 查询没有选修‘C语言‘课程的学生 (10分)...
- java queue的实例化_如何在java中实例化Queue对象?
- java 随机数性能优化
- usb_modeswitch下载与安装
- 可靠性测试审查checklist
- Unable to initialize EGL
- DAC0832数模转换芯片介绍及使用教程
- at命令不生效 linux_Linux命令之at
- C++实现单链表的基本操作
- Linux学习-17-rpm查询软件包命令(-q、-qa、-i、-p、-l、-f、-R)
- 面向对象的五大原则是什么
- HTML04-form表单
- Windows 2008 R2、2012 R2 磁盘扩容、新加磁盘
- 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)
- 珂朵莉与妖精仓库的妖精们