51单片机的hello world之点灯

news2025/1/11 21:48:36

文章目录

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


前言

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; //点亮红色LED
		delay_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单片机的点灯 延时函数 独立按键 中断配置 以及 捕获中断和外部中断的方法,其实这些都不是很难,主要还是要学会读懂使用手册,会使用手册才能配置好寄存器,才能把这些知识给学会理解。
我现在就是有些感触就是,多看几遍,多写一篇博客,多一遍理解就多一些收获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler 的使用(详细教程)

文章目录 前言一、简介二、下载安装三、界面简介1. 菜单栏2. 工具栏3. 会话面板4. 辅助标签工具5. 命令行6. 状态栏 四、常用功能1. 抓取指定 IP 地址的包2. 抓取 HTTPS 协议的包3. 手机 APP 抓包4. 发送序列化请求5. 发送上传文件请求 五、常见问题 前言 Fiddler 是最常用的 …

成都优优聚美团代运营:助力商家腾飞的隐形翅膀

在当前数字化时代&#xff0c;电子商务的飞速发展使得线上运营成为越来越多商家的必然选择。在这个过程中&#xff0c;美团代运营作为一种专业的外包服务模式&#xff0c;正逐渐发挥出其巨大的作用。 一、美团代运营的定义与作用 美团代运营&#xff0c;顾名思义&#xff0c;是…

TikTok网红营销:挖掘潜在客户的高效策略

在当今数字时代&#xff0c;社交媒体已经成为了企业吸引潜在客户的重要渠道之一。TikTok作为全球范围内最热门的短视频分享平台之一&#xff0c;为企业提供了一个独特的机会&#xff0c;可以通过网红营销来挖掘潜在客户。本文Nox聚星将和大家探讨如何在TikTok上运用网红营销策略…

大数据时代,网络安全人员的钱途在哪里?

未来10年20年以后&#xff0c;这世界最珍贵的资源、最稀缺的资源&#xff0c;不会是石油&#xff0c;一定是数据。企业要有最快获取数据的能力、处理数据的能力、分享数据的能力、产生数据的能力。在刚过去不久的2020中国国际智能产业博览会上&#xff0c;马云在8分钟演讲里30次…

提取机器人专注视频号视频下载!视频号视频下载使用教程

知道吗&#xff1f;原来我们可以轻松地将视频下载到手机上&#xff0c;无需再繁琐操作了&#xff01;那么&#xff0c;让我教你一招吧&#xff01; 首先&#xff0c;你需要一个神器——名字叫做「提取机器人」。这个小众冷门的应用真的是保姆级存在&#xff0c;让你的下载经验变…

CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集

CI/CD&#xff1a;GitLab-CI 自动化集成/部署 JAVA微服务的应用合集 CI/CD&#xff1a;GitLab-CI 自动化集成/部署 JAVA微服务的应用合集安装DockerGitLabGitLab-Runner阿里云容器仓库 GitLab-CIJava微服务的GitLab-CI应用 CI/CD&#xff1a;GitLab-CI 自动化集成/部署 JAVA微服…

Zabbix自定义监控项监控进程状态

agent服务端配置 自定义监控项脚本 # 文件路径: C:\zabbix_agent2-6.0.4-windows-amd64-static\conf\a.bat echo off setlocalset "processNameo2Popper.exe"tasklist /FI "IMAGENAME eq %processName%" 2>NUL | find /I /N "%processName%"…

微信小程序抓包及测试

目录 环境准备 小程序反编译 一不小心getshell 本来只想写个抓包反编译过程&#xff0c;没想到大肠包小肠有意外收获 网上大多数的小程序测试抓包都是用的安卓模拟器&#xff0c;这里使用的是BurpSuiteProxifer微信客户端的抓包方式 环境准备 Burp2023.9.2 Proxifier4.5…

darknet框架 训练分类模型及测试图片

darknet 框架的Yolo模型大概已经没什么公司使用了&#xff0c;对于老项目的维护可能新手需要了解下&#xff0c;然而 darknet架构并不十分友好&#xff0c;新手入手门槛比较高&#xff0c;特别是做分类任务时&#xff0c;简直了&#xff01;&#xff01;&#xff01; 博主也是走…

交传翻译在不同场合的差异,你了解多少?

交替传译就是指译员在讲话人发言后&#xff0c;将目标语言准确翻译出来的口译方式。两会期间的新闻发布会就是采用交传。与同传相比&#xff0c;交传更具挑战性&#xff0c;因为译员需要承受与听众直接交流的压力&#xff0c;同时也需要充分理解源语言的内容并进行适当的结构调…

日志报错 fork:Cannot allocate memory

现象描述 日志中出现报错信息 “fork&#xff1a;Cannot allocate memory”。如下图所示&#xff1a; 可能原因 可能是进程数超限导致。系统内部的总进程数达到了 pid_max 时&#xff0c;再创建新进程时会报 “fork&#xff1a;Cannot allocate memory” 错。 解决思路 1. …

有效防止重要需求遗漏的几点建议

防止重要需求的遗漏&#xff0c;保障需求的完整性&#xff0c;这直接关系着项目的成功和客户的满意度。如果关键需求被遗漏或忽视&#xff0c;项目可能无法达到预期的目标和交付成果&#xff0c;无法满足用户的需求和期望&#xff0c;直接影响产品的市场竞争力。 因此确保需求的…

哪吒X选车指南:推荐哪吒X 500lite 版

当下,紧凑型纯电动SUV市场新车不断,可选项越来越多。最近哪吒汽车又上市一款“大气舒适新标杆”——哪吒X,限时权益价10.88万元-12.88万元,以大空间,超舒适,更安全等优势,强势对标AION Y Plus和元Plus等车型。 很多有购车打算的消费者看过价格和配置,直呼哪吒X是“性价比显眼包…

【linux】SourceForge 开源软件开发平台和仓库

在linux上面安装服务和工具。我们经常会下载安装包。今天推荐一个网站。 SourceForge 开源软件开发平台和仓库 ​ 全球最大开源软件开发平台和仓库 SourceForge.net&#xff0c;又称SF.net&#xff0c;是开源软件开发者进行开发管理的集中式场所。 SourceForge.net由VA Softwa…

JavaScript_Pig Game摇骰子

对于一个大的项目&#xff0c;画流程图是一种特别好的方式&#xff01; ● 我们首先把页面上的重置游戏、掷色子、切换用户存入变量中 const btnNew document.querySelector(.btn--new); const btnRoll document.querySelector(.btn--roll); const btnHold document.quer…

GoLong的学习之路(八)语法之Map

文章目录 Map初始化方式判断某个键是否存在map的遍历对value值遍历。对key值遍历 使用delete()函数删除键值对按照指定顺序遍历map元素为map的切片值为切片类型的map 做个题吧 Map 哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合&#xff0c;其中所有的…

Day 10 python学习笔记

高阶函数 map( ) map()函数接收两个参数&#xff0c;一个是函数&#xff0c;一个是Iterable&#xff0c;map将传入的函数依次作用到序列的每个元素&#xff0c;并把结果作为新的Iterator返回。&#xff08;Iterator是一个可迭代对象&#xff09; 再简单点说&#xff1a;从可迭代…

跨境电商的发展趋势及语言翻译的重要性

随着全球化的不断深入和互联网技术的普及&#xff0c;跨境电商在过去几年内得到了快速发展。跨境电商指的是企业通过电子商务平台销售商品或服务给其他国家或地区的消费者。这种模式不仅打破了传统国际贸易的限制&#xff0c;也为企业提供了更广阔的市场空间。 跨境电商的快速发…

音视频技术开发周刊 | 316

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 日程揭晓&#xff01;速览深圳站大会专题议程详解 LiveVideoStackCon 2023 音视频技术大会深圳站&#xff0c;保持着往届强大的讲师阵容以及高水准的演讲质量。两天的参会…

河南工业大学人工智能与大数据学院学子在第三届“火焰杯”软件测试开发选拔赛中 取得佳绩

近日&#xff0c;第三届“火焰杯”软件测试开发选拔赛落下帷幕&#xff0c;我校人工智能与大数据学院选派的多名参赛选手在王雪涛老师的指导下&#xff0c;经过激烈的角逐&#xff0c;取得优异成绩。其中&#xff0c;何鸿彬&#xff0c;贾文聪获得决赛二等奖&#xff0c;王静宇…