【单片机/普中A2】学习笔记2-LED

点亮一个 LED

电阻的表示形式

如电阻 103,表示 10x10^3,即 10000 欧姆

同理,473 表示 47000 欧姆


编写程序

在这里插入图片描述

点击上图所示按钮,进入 options for target1

在 output 选项卡勾选 create hex file
这样每次 build 后都会自动生成 hex 文件,方便我们直接调试


在这里插入图片描述

source group1 下新建 main.c 文件,作为我们的主入口;
每个工程都必须存在一个主入口


main.c 代码清单

#include <REGX52.H>

// 主入口
void main(){
	// 1表示高电平,0表示低电平,低电平亮灯
	// 由于有8个LED,故1111 1110表示7个关灯,一个亮灯
	P2=0xFE; // 对应二进制1111 1110
}

LED 闪烁

生成延迟函数

STC-ISP 自带了一个帮我们生成延迟函数的小工具

按下图所示找到该工具,下面是我们需要注意的几个关键点

  1. 系统频率:查看自己开发板中晶振频率,一般会写在上面
  2. 定时长度
  3. 8051 指令集:选择 STC-Y1 指令集,因为这个刚好对应 STC89C52

在这里插入图片描述


main.c

#include <REGX52.H>
#include <INTRINS.H> // 注意哦,这里导入了一个新的头文件

// 生成的延迟函数
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	// 在循环中调用延迟函数,实现灯泡闪烁
	while(1)
	{
		P2=0xFE;
		Delay500ms();
		P2=0xFF;
		Delay500ms();
	}
}

流水灯

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms(unsigned int xms);

void main()
{
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(1000);
		P2=0xFD;//1111 1101
		Delay1ms(1000);
		P2=0xFB;//1111 1011
		Delay1ms(100);
		P2=0xF7;//1111 0111
		Delay1ms(100);
		P2=0xEF;//1110 1111
		Delay1ms(100);
		P2=0xDF;//1101 1111
		Delay1ms(100);
		P2=0xBF;//1011 1111
		Delay1ms(100);
		P2=0x7F;//0111 1111
		Delay1ms(100);
	}
}

void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


按键控制 LED 亮灭

sbit 分析

在头文件 REGX52.H 中,已经预定义好了各个引脚所对应的十六位值

譬如下图所示开发板的四个按钮原理图,他们分别对应 P3_1 P3_2 P3_3 P3_4

在这里插入图片描述


简单控制

#include <REGX52.H>

void main()
{
	while(1)
	{
		// 通过预定义寄存器获取P32口对应电平
		// 0为低电平,即按钮按下时
		if(P3_1==0)
		{
			// 按钮按下时切换对应LED为低电平,此时灯亮
			P2_0=0;
		}
		else
		{
			// 否则切换为高电平,此时灯灭
			P2_0=1;
		}
	}
}

开关记忆

按键模块在使用的过程中存在三种状态:

  • 5-10ms 的按下态
  • 任意时长的持续按下态
  • 5-10ms 的松开态

我们需要做的是为按下态和松开态做防抖处理,以实现该效果:
按下按钮后松开才改变 LED 电平,而不是在使用按键的整个过程中改变电平!

#include <REGX52.H>

// 可修改时长的延迟函数
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}


void main()
{
	while(1)
	{
		// 检测到按下按键
		if(P3_1==0)
		{
			// 延迟20ms,按下防抖
			Delay(20);
			// 阻塞线程,此刻为持续按下状态
			while(P3_1==0);
			// 延迟20ms,松开防抖
			Delay(20);

			// 最后直接取反,避免else编写重复逻辑
			P2_0=~P2_0;
		}
	}
}

LED 逐个亮灭

二进制知识

众所周知,点亮第一盏灯需要设置二进制为:1111 1110
则不难得出结论,上述二进制可以由 0000 0001 取反而来

所以从 0000 0001 开始,每次都左移位一次,然后取反,就可以完美的实现按顺序点亮 LED 的效果啦~

譬如如下过程

  1. 当前点亮第一盏灯,此时为 0000 0001
  2. 左移位一次,此时为 0000 0010
  3. 对其取反,得到 1111 1101,此时点亮第二盏灯

源码

这里定义了一个全局变量 LEDNumber,用来记录当前移位的长度(以此来决定需要点亮那一盏灯)

依然使用十六进制表示,0x01 表示 0000 0001

#include <REGX52.H>

// 全局变量存储移位长度
unsigned char LEDNumber=0;

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms--)
	{
		i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}

void main()
{

	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);

			// 首先序号+1
			LEDNumber++;
			// 假如序号大于等于8,表示已经移位到最后一个灯,此时需要执行复位操作
			if(LEDNumber>=8)
			{
				// 复位,回归零点
				LEDNumber=0;
			}

			// 按照上述原理,得出根据0x01进行移位后直接取反,点亮LED
			P2=~(0x01<<LEDNumber);
		}

		// 如法炮制一个递减点亮LED的判断语句
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);

			LEDNumber--;
			if(LEDNumber==0)
			{
				LEDNumber=7;
			}
			P2=~(0x01<<LEDNumber);
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python json详解

一、抓取文本数据 结构化数据&#xff1a;json&#xff0c;xml(极其的稀少) 。直接转化为python类型 非结构化数据&#xff1a;HTML&#xff0c;字符串。正则表达式、xpath 二、JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c; 它使得人们…

Python 进阶指南(编程轻松进阶):五、发现代码异味

原文&#xff1a;http://inventwithpython.com/beyond/chapter5.html 导致程序崩溃的代码显然是错误的&#xff0c;但是崩溃并不是发现程序问题的唯一手段。其他迹象可能表明程序存在更微妙的错误或不可读的代码。就像气体的味道可以指示气体泄漏或者烟雾的味道可以指示火灾一样…

接口自动化测试如何做?测试老鸟总结,接口测试数据构造大全......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 接口参数的数据获取…

DJ3-4 传输层(第四节课)

目录 一、TCP 概述 二、TCP 报文段的首部字段格式 三、TCP 往返时延的估计和超时 1. 估计往返时间 2. RTT 估计例子 3. 估计往返时间的偏差 4. 设置重传超时间隔 一、TCP 概述 全双工服务&#xff1a;允许在同一时间同一连接上&#xff0c;数据能够双向传输。注意&#…

高效办公——Excel表格-02篇(if函数常见用法 + 条件格式的使用)

高效办公——Excel表格-02篇&#xff08;if函数常见用法 条件格式的使用&#xff09;1. if单条件简单用法1.1 简单需求1.2 实现方法2. if多条件使用(if-else的情况)3. if多条件使用(if(A && B)的情况)3.1 简单需求3.2 实现需求4. if多条件使用(if(A || B)的情况)5. 条…

解决macOS IntelliJ IDEA 卡顿问题

写在前面的话1&#xff1a;我在撰写这篇博客时候&#xff0c;所用的IntelliJ IDEA版本是IntelliJ IDEA 2022.3.3 (Ultimate Edition)&#xff0c;你需要知道可能对于不同的IntelliJ IDEA版本会有一定的差异 写在前面的话2&#xff1a;如果我这篇博客可以帮助到你&#xff0c;请…

突发!ChatGPT疯了!

‍数据智能产业创新服务媒体——聚焦数智 改变商业今天&#xff0c;笔者正常登录ChatGPT&#xff0c;试图调戏一下他。但是&#xff0c;突然震惊的发现&#xff0c;ChatGPT居然疯了。之所以说他是疯了&#xff0c;而不是崩溃了&#xff0c;是因为他还能回复我&#xff0c;但回…

Jvm学习笔记(一)内存模型

JVM内存模型 java不需要用户手动去管理内存的释放&#xff0c;这大大解放了程序员的心智负担&#xff0c;jvm运行的核心绕不开他的内存模型&#xff0c;本章着重于jvm的内存模型分析。 程序计数器 程序计数器是一块较小的内存区域&#xff0c;主要作用是确定下一条需要执行的…

强大到让人无法想象的ChatGPT-5即将发布,上千名人士却紧急叫停

目录 【ChatGPT 5简介】 【ChatGPT 5的潜在应用】 【ChatGPT 5的潜在危险】 ChatGPT4还没有好好体验&#xff0c;比GPT4强大1000倍的ChatGPT5又即将发布&#xff01;届时将彻底改变人工智能领域&#xff0c;并改变我们现有的世界 【ChatGPT 5简介】 OpenAI计划在2023年12月发…

mybatis plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中&#xff0c;我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时&#xff0c;如果同时使用逻辑删除和唯一索引&#xff0c;会报数据重复Duplicate entry的问题。 举例来说&#xff0c;有表user&#xff0c;建立唯一索引&#xff08;us…

亚马逊云科技赋能数据分析,完成最后一块拼图

Serverless时代已经到来&#xff01;企业的技术架构&#xff0c;总是伴随着不断增长的数据与日趋复杂的业务持续演进。如何通过构建更易用的技术架构来聚焦在业务本身&#xff0c;而不必在底层基础设施的管理上投入过多的精力&#xff0c;是数据驱动型企业需要思考的重要议题。…

【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录nc命令简介nc命令的安装nc命令语法格式…

腾讯38K测试良心分享,熬夜整理10万字详细软件测试面试笔记

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。 所以&#xff0c;八股文面…

git查看历史提交记录

本文来说下git如何查看历史的提交记录 文章目录git查看历史提交记录git查看历史提交记录 本文来说下在idea编辑器中如何查看git的历史提交记录 右键选择 查看历史的git提交记录

基于深度学习的火焰检测系统(YOLOv5清新界面版,Python代码)

摘要&#xff1a;火焰检测系统用于检测日常是否出现火情&#xff0c;支持图片、视频、摄像头等多方式检测火焰、实现火灾警报功能&#xff0c;提供了登录注册界面。在介绍系统实现原理的同时&#xff0c;给出部分Python的实现代码以及PyQt的UI界面。火焰检测系统主要用于日常生…

【go-zero Drone】通过Drone完成go-zero的CI第一篇 初探:go-zero api接入drone pipeline

一、Drone 安装部分就不在这里赘述了,大家可以自行百度去找找 Drone的官网网址:https://www.drone.io/ 为什么选择了Drone没有选择Jenkins 对比dronejenkins内存很小几十兆内存上G的内存占用pipeline通过yamlgrovvy 增加学习成本配置十分简单上手十分复杂版本控制pipeline的y…

【Python实战】Python采集二手车数据——超详细讲解

前言 今天&#xff0c;我们将采集某二手车数据&#xff0c;通过这个案例&#xff0c;加深我们对xpath的理解。通过爬取数据后数据分析能够直观的看到二手车市场中某一品牌的相对数据&#xff0c;能够了解到现在的二手车市场情况&#xff0c;通过分析数据看到二手车的走势&#…

4. 【动手学深度学习v2】数据操作 + 数据预处理

4. 数据操作 + 数据预处理【动手学深度学习v2】 李沐 B站:https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 课件:https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_4.pdf Gi…

Mybatis-plus学习2

一、Mybatis-plus分页操作 1.配置拦截器即可 //分页插件Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();} 2.直接使用Page对象 //测试分页查询Testpublic void testPage(){//参数一&#xff1a;当前页//参数二&#xff1a;页面…

k8s v1.26.2 安装部署步骤

准备 开通端口 master需要开通的端口: TCP: 6443 2379 2380 10250 10259 10257 ,10250 30000~30010(应用) node需要开通的端口: TCP: 10250 30000~30010(应用) master加端口 firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port2379/tcp fir…
最新文章