当前位置: 首页 > news >正文

51单片机的hello world之点灯

文章目录

  • 前言
  • 一、基础定义和点灯
  • 二、延时函数
  • 三、独立按键
  • 三、中断的配置和使用
    • 外部中断法
    • 捕获中断
  • 总结


前言

hello 大家好这里是夏目学长的51单片机课堂,本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机点灯以及 独立按键 中断电灯关灯 以及比较难的 捕获中断 ,我自己在学习这节课程的时候觉得这节课非常适合学完B站up主江科大视频的同学,适合去进阶自己的知识,掌握的更加牢固。

本节的单片机主要是STC8G2K64S4单片机


一、基础定义和点灯

首先大家打开原理图去看51单片机的原理图 然后下面夏目学长就给大家注释好了LED灯的注释
在这里插入图片描述
下面就是讲解一下sbit的意思:sbit其实就是重新定义的意思,相当于C语言的typedef 这是我自己的理解,大家可以试着理解,但是不要信任我哈哈哈

这里举出一个电灯的例子:
我们在让红色灯亮的时候一般是用P0_5 去点灯,但是这里我用sbit就可以用我定义好的名字去点灯
当我们不使用sbit的时候:

#include "stc8g.h"
#include "intrins.h"
void main()
{P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用P0M1 = 0x00;while(1){P0_5 = 0; //点亮红色LED}
}

当我们使用sbit的时候:

#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5; 
void main()
{P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用P0M1 = 0x00;while(1){LED_R = 0; //点亮红色LED}
}

二、延时函数

延时函数其实很简单只需要会使用STC-ISP即可,他会帮助你生成你想要的延时时间,当然你也要注意我画圈圈的地方的选择,一定要看看自己的单片机是否和我一样,不然就要自己选择类型哦

为了通用性我们一般会封装一个可以延时任意时间的一个延时函数

在这里插入图片描述
紧接着我们就需要利用C语言函数封装 一个可以延时任意时间的函数

//粘贴STC-ISP帮助我们自动生成的代码
void Delay1ms(void)	//@35MHz
{unsigned char data i, j;//_nop_();//_nop_(); //无意义可以删了 除非追求极致的时间 --- > 也可以包一个头文件#include "intrins.h"i = 46;j = 113;do{while (--j);} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{	while(n -- ){Delay1ms();}
}

是不是很简单?然后继续学习新的知识吧

这里学会了延时函数,我想继续给大家讲一个小知识就是消抖,原因很简单,就是你按下按键的时候,单片机它并不稳定,会有上下起伏最后达到目的,所以给一个延时函数,就可以把这一段不稳定的阶段给延时过去,增加稳定性

方法也很简单这里给一段代码:

#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5; 
void Delay1ms(void)	//@35MHz
{unsigned char data i, j;_nop_();_nop_();i = 46;j = 113;do{while (--j);} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{	while(n -- ){Delay1ms();}
}void main()
{P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用P0M1 = 0x00;while(1){delay_ms(25);//消抖作用LED_R = 0; //点亮红色LEDdelay_ms(300);LED_R = 1;delay_ms(300);}
}

三、独立按键

这里学习方法和上面点亮LED灯一样就是先去看原理图然后确定按键位置,这里同样使用sbit去重新定义
在这里插入图片描述
下面跟据这个原理图来使用一下独立按键来控制LED灯的亮灭情况。

代码如下:

#include "stc8g.h"
#include "intrins.h"sbit LED_R = P0^5; 
sbit LED_Y = P0^6; 
sbit LED_G = P0^7; sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;void Delay1ms(void)	//@35MHz
{unsigned char data i, j;_nop_();_nop_();i = 46;j = 113;do{while (--j);} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{	while(n -- ){Delay1ms();}
}void main()
{P0M0 = 0x00; //配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用P0M1 = 0x00;P3M0 = 0x00; //配置P3引脚为准双向口 --- > 这样才可以使得独立按键可以使用P3M1 = 0x00;while(1){if(K1 == 0){delay_ms(25);while(K1 == 0);LED_R = !LED_R;}if(K2 == 0){delay_ms(25);while(K2 == 0);LED_Y = !LED_Y;}if(K3 == 0){delay_ms(25);while(K3 == 0);LED_G = !LED_G;}}
}

演示视频:

51单片机独立按键

三、中断的配置和使用

外部中断法

中断的基础知识这里给大家贴一篇博客【51单片机】十分钟学会定时器&中断¹
此博客转载于博主:謓泽

在这里插入图片描述

所以这里只能让独立按键的K1 和 K2实现中断 K3咩办法实现

代码如下:

#include "stc8g.h"
#include "intrins.h"sbit LED_R = P0^5; 
sbit LED_Y = P0^6; 
sbit LED_G = P0^7; sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;void Delay1ms(void)	//@35MHz
{unsigned char data i, j;_nop_();_nop_();i = 46;j = 113;do{while (--j);} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{	while(n -- ){Delay1ms();}
}void INT2_Isr(void) interrupt 10
{LED_R = 1;
}
void INT3_Isr(void) interrupt 11
{LED_R = 0;
}void main()
{P0M0 = 0x00; //配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用P0M1 = 0x00;P3M0 = 0x00; //配置P3引脚为准双向口 --- > 这样才可以使得独立按键可以使用P3M1 = 0x00;INTCLKO = 0x30; //打开INT2 INT3 外部中断EA = 1; //打开总中断while(1){}
}

中断函数关键字:interrupt + 数字
数字选择哪一个需要去跟据手册的中断章节去选择。
在这里插入图片描述
在这里插入图片描述
这里烧入单片机后就可以按下K2灯亮按下K1灯灭

捕获中断

当我们有了外部中断的基础之后,就可以学习捕获中断了,这里先去看单片机的原理图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
所以引脚P_SW1 第5位需要设置成为1,第六位设置成为0,但是这里要讲解一些C语言的知识,就是如果我只想第5位需要设置成为1,第六位设置成为0,那么就可以:
P_SW1 &= ~(1<<5);
P_SW1 |= (1<<4);
这种写法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
所以这里跟据STC8G手册去配置这些寄存器,就可以了

#include "stc8g.h"
#include "intrins.h"sbit LED_R = P0^5; 
sbit LED_Y = P0^6; 
sbit LED_G = P0^7; sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;void PCA_Isr() interrupt 7
{if(CCF0 == 1){CCF0 = 0;LED_G = !LED_G;}if(CCF1 == 1){CCF1 = 0;LED_Y = !LED_Y;}if(CCF2 == 1){CCF2 = 0;LED_R = !LED_R;}
}void main()
{P0M0 = 0x00; //配置P0引脚为准双向口P0M1 = 0x00;P3M0 = 0x00; //配置P0引脚为准双向口P3M1 = 0x00;//	INTCLKO = 0x30; //打开INT2 INT3 外部中断
//	EA = 1; //打开总中断P_SW1 &= ~(1<<5);P_SW1 |= (1<<4);CCON = 0x00;CMOD = 0x08;CCAPM0 = 0x11;CCAPM1 = 0x11;CCAPM2 = 0x11;EA = 1;while(1){}
}

总结

本节我们主要学习了STC8G单片机的点灯 延时函数 独立按键 中断配置 以及 捕获中断和外部中断的方法,其实这些都不是很难,主要还是要学会读懂使用手册,会使用手册才能配置好寄存器,才能把这些知识给学会理解。
我现在就是有些感触就是,多看几遍,多写一篇博客,多一遍理解就多一些收获。

相关文章:

51单片机的hello world之点灯

文章目录 前言一、基础定义和点灯二、延时函数三、独立按键三、中断的配置和使用外部中断法捕获中断 总结 前言 hello 大家好这里是夏目学长的51单片机课堂&#xff0c;本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机点灯以及 独立按键 中…...

Django 实战开发(一)项目搭建

1.项目搭建 用pycharm 编辑器可以直接 New 一个 Django 项目 2.新建应用 python manage.py startapp demo项目结构如下: 3.编写第一个Django 视图函数 /demo/views: from django.http import HttpResponse def welcome(request):return HttpResponse("welcome to dja…...

Unity把余弦值转成弧度和角度

Vector3 RoleForwardV MainRole.transform.forward; Vector3 RoleToMonsterV Monster.transform.position - MainRole.transform.position; float DotResult Vector3.Dot(RoleForwardV, RoleToMonsterV.normalized);//点乘两个单位向量 Mathf.Acos(DotResult); //--它计…...

debian、ubuntu打包deb包工具,图形界面deb打包工具mkdeb

debian、ubuntu打包deb包工具&#xff0c;图形界面deb打包工具mkdeb&#xff0c;目前版本1.0 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QX6jXNMYRybI9Cx-1N_1xw?pwd8888 md5&#xff1a; b6c6658408226a8d1a92a7cf93834e66 mkdeb_1.0-1_all.deb...

微信小程序如何使用地球半径计算两组经纬度点之间的距离(自身位置与接口返回位置)【上】

目录 1.配置位置权限 2.获取当前自身经纬度 3. 请求接口拿到返回经纬 4. 循环取每一项的经纬 5.如何判断是否打开了定位权限 6.进行距离计算操作 7.运行效果 8.完整代码 首先在使用小程序时&#xff0c;请求的接口一定要去配置合法域名&#xff0c;才能够进行接下来…...

postgis ST_ClipByBox2D用法

官方文档 概述 geometry ST_ClipByBox2D(geometry geom, box2d box); 描述 以快速且宽松但可能无效的方式通过 2D 框剪切几何体。 拓扑上无效的输入几何图形不会导致抛出异常。 不保证输出几何图形有效&#xff08;特别是&#xff0c;可能会引入多边形的自相交&#xff09;…...

【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现

文章目录 前言一、条件构造器1.1 什么是条件构造器1.2 QueryWrapper1.3 UpdateWrapper1.4 LambdaWrapper 二、自定义 SQL 语句2.1 自定义 SQL 的基本用法2.2 自定义 SQL 实现多表查询 三、Service 接口3.1 对 Service 接口的认识3.2 实现 Service 接口3.3 实现增删改查功能3.4 …...

基于AI与物联网技术的智能视频监控系统架构剖析

智能视频监控系统正逐渐成为我们日常生活和工作中不可或缺的一部分。基于物联网的智能监控系统架构为我们在各个领域提供了更高效、智能化和安全的监控解决方案。本文将以旭帆科技EasyCVR视频监控云平台为例&#xff0c;介绍基于AI、物联网的智能监控系统的架构&#xff0c;并探…...

mysql 基础知识

MySQL 是一种关系型数据库&#xff0c;在Java企业级开发中非常常用&#xff0c;因为 MySQL 是开源免费的&#xff0c;并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL&#xff0c;因此它的稳定性是有保障的。MySQL是开放源代码的&#xff0c;因此任何人都可以在 GPL(Gener…...

Flink CDC 2.0 主要是借鉴 DBLog 算法

DBLog 算法原理 DBLog 这个算法的原理分成两个部分&#xff0c;第一部分是分 chunk&#xff0c;第二部分是读 chunk。分 chunk 就是把一张表分为多个 chunk&#xff08;桶/片&#xff09;。我可以把这些 chunk 分发给不同的并发的 task 去做。例如&#xff1a;有 reader1 和 re…...

win10 + VS2017 编译libjpeg(jpeg-9b)--更新

刚刚写了一篇“win10 VS2017 编译libjpeg&#xff08;jpeg-9b&#xff09;”&#xff0c; 然后就发现&#xff0c;还有一个更好的方法。因此&#xff0c;重新更新了一篇&#xff0c;作为对比与参考。 需要用到的文件&#xff1a; jpeg-9b.zip win32.mak 下载链接链接…...

使用pycharm远程调试

使用pycharm 专业版&#xff0c; 在设置解释器中&#xff0c;具备ssh 解释器功能&#xff1b; 一般在本地无法调试远程端代码&#xff0c;机械性的scp传输文件十分影响工作效率&#xff0c;PyCharm的Pro支持远程Run&#xff0c;Debug&#xff0c;等可视化的功能。 操作系统&…...

rust学习

rust学习 String类型clone和copy结构体的内存分布for循环&#xff08;<font color red>important&#xff01;&#xff09;堆和栈数据结构vector panic失败就 panic: unwrap 和 expect传播错误 模式匹配忽略模式的值绑定 泛型特征Trait定义特征为类型实现特征孤儿规则使…...

GCC、g++、gcc的关系

GCC、g、gcc的关系 引言 VsCode中对编译环境进行配置的时选择编译器时发现有多种不同的编译器 GNU计划和GCC GNU的全称 GNU’s Not UNIX GNU是一个计划 Q:为什么会有这个计划 因为当时的Unix开始收费和商业闭源,有人觉得不爽→ 想要自己开发和Unix类似的→GNU计划 GUN计划目…...

IP应用场景API的反欺诈潜力:保护在线市场不受欺诈行为侵害

前言 在数字化时代&#xff0c;网络上的商业活动迅速增长&#xff0c;但与之同时&#xff0c;欺诈行为也在不断演化。欺诈者不断寻找新方法来窃取个人信息、进行金融欺诈以及实施其他不法行为。为了应对这一威胁&#xff0c;企业和组织需要强大的工具&#xff0c;以识别和防止…...

常用的主流音乐编曲软件有哪些?

FL Studio是一款备受音乐人喜爱的超强编曲软件。最新的FL Studio版本将所有音频形式都视为采样&#xff0c;使得它在各个领域都有出色的表现。该软件操作简单&#xff0c;界面友好&#xff0c;非常适合新手全面学习和使用。此外&#xff0c;FL Studio完美支持Windows和Mac操作系…...

面试题:为什么HashMap 使用的时候指定容量?

文章目录 前言正文为什么要指定容量&#xff1f; 前言 其实可以看到我写了这么久的博客&#xff0c;很少去写hashMap的东西。 为什么&#xff1f;因为这个东西感觉是java面试必备的&#xff0c;我感觉大家都看到腻了&#xff0c;所以一直没怎么去写hashMap相关的。 本篇内容&…...

基于C/C++的UG二次开发流程

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…...

“第五十二天”

算术逻辑单元&#xff1a; 之前提过的运算器包括MQ,ACC,ALU,X,PSW&#xff1b;运算器可以实现运算以及一些辅助功能&#xff08;移位&#xff0c;求补等&#xff09;。 其中ALU负责运算&#xff0c;运算包括算术运算&#xff08;加减乘除等&#xff09;和逻辑运算&#xff08…...

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...