51单片机实验02- P0口流水灯实验

目录

一、实验的背景和意义

二、实验目的

三、实验步骤

四、实验仪器

五、实验任务及要求 

1,从led4开始右移

1)思路 

①起始灯 (led4)

②右移

2)效果

3)代码☀

 2,从其他小灯并向右依次点亮其他小灯 

1)从led3开始右移

2)从led5开始右移

3)从led6开始右移

4)从led7开始右移

5)从led8开始右移

6)从led9开始右移

3,完成一个左移到头接着右移,右移到头再接着左移的花样流水灯程序。

 1)效果

2)代码


一、实验的背景和意义


通过流水灯实验进一步增进对51单片机电路的感性认识,加深对理论方面的理解。了解软硬件的有关知识,并掌握软硬件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
本实验采用STC89C52RC单片机为中心器件来实现P0并行口控制8只LED小灯进行流水灯显示实验。

二、实验目的


1、进一步掌握编程软件Keil uVision4和下载软件STC-ISP-v4.80等的使用方法;
2、掌握51单片机并行口输出方式的编程;
3、掌握延时程序的编写和应用。

三、实验步骤


同51单片机实验01-点亮LED小灯-CSDN博客相应操作。

四、实验仪器


计算机1台、KST-51开发板1套。

五、实验任务及要求 

1,从led4开始右移


学号末位和小灯对应关系同51单片机实验01-点亮LED小灯-CSDN博客。具体操作见本实验的后续要求。按照上述学号末尾对应的小灯作为开始,依次向右点亮其他小灯并循环,进行流水灯显示实验,编写完整c语言代码。 

 相关资料请通过链接下载👇

链接:https://pan.baidu.com/s/1QEDpuNhcYVB6lmxFNW2z4Q?pwd=6666 
提取码:6666 
--来自百度网盘超级会员V1的分享

1)思路 

 因为我学号末尾时4,因此这里先以led4作为讨论的对象,其他的led灯皆可以此类推,进行点亮。

①起始灯 (led4)

在实验01中,因为我只需要点亮一个小灯,因此需要用到P0口的只有一位,但是如果我要实现流水灯的效果,就需要使用到P0口的其他七位,来依次点亮led灯,即用到P0.0~P0.7,分别对应led2~led9。

最右边的小灯led2的P0口需要输入0b1111 1110 ,就是将最后一个led灯输入为低电平。其它为高电平,就会亮指定的led灯。

同理,led3亮起的二进制为0b1111 1101,led4为0b1111 1011,led5为0b1111 0111.......

通过观察,不难发现,都是0的移动。如果想要实现小灯向右移动,就需要0向左移,其它位为1。这个时候就引入了位移(<<左移和>>右移)这个概念,顾名思义,位移需要在二进制中进行,因为只有二进制数的每一个位都是显示出来的。当一个数开始向左移动时,它的左边就会溢出舍弃,右边就会产生空位,且产生的空位会自动给零补全。

这个时候我将led4(0b1111 1011)向左平移<<一位

就会得到 0b1111 0110和led3的0b1111 1011不相等。显然,光通过位移是没法满足我的需求的,这个时候就可以再加上取反(~)这一运算,可以先将led4(0b1111 1011)取反→变成0b 0000 0100→之后再右移一位→得到0b 0000 0010。该二进制和led3 的0b1111 1011就差了取反。再次取反,就可得到led3。

【为什么会想到取反?主要是因为当用到位移,当一个二进制数中只有一个0,而其他位为1时,就可以对该二进制取反,进行位移,来得到我想要的效果。】

现在,我直接拿led4(0b1111 1011)取反后的结果0b 0000 0100来进行右移,最后再取反,来实现流水灯的效果。

一般来说,在代码中建议使用16进制来表示一个数,因此我将0b 0000 0100换算成十六进制,结果为0x04,之后再对0x04取反就可以表示led4这个灯,所以i编写语句:P0=~0x04。

就可以让led4灯作为起始灯亮起来。

②右移

实现右移就是让起始灯led4(因为我学号是4,就led4为例)的值0x04依次向右移>>1,并进行取反。并且需要在main方法里面定义一个变量r_move来控制向右移动的位数,当r_move为0时,表示没有移位,亮的是当前的起始灯led4,r_move=1时,向右移动1位,亮起led3,以此类推。

2)效果

从指定位置的led开始右移

3)代码☀

#include<reg52.h> 
sbit addr0=P1^0;  // 138译码器低位输入
sbit addr1=P1^1; // 138译码器中位输入
sbit addr2=P1^2;// 138译码器高位输入
sbit addr3=P1^3; // 使能端es
sbit enled=P1^4; // 使能端 e1和e2
void main(){
    unsigned int r_move=0;  // 右移变量
	unsigned int i=0;  // for循环的形参
	addr2=1;   // 高电平
	addr1=1;
	addr0=0;   // 低电平
	enled=0;
	addr3=1; 	 
	while(1){
	  P0=~(0x04>>r_move);  // 从led4开始右移
	  for(i=0;i<40000;i++);	  //软件延时
	  r_move++;			 //右移的位数自增
	  if(r_move==3){   // 如果移到最右边了,就右移位数重置位0
	     r_move=0;
	  }
	}
	}

 2,从其他小灯并向右依次点亮其他小灯 

以下是我的草稿:

 

呈现效果都测试过,都OK。如果不OK就评论区留言或者是私信我,最近放假,都在线。 

1)从led3开始右移

P0= ~(0x02>>r_move);

 因为led3加上右边的led2,只需要进行两个位移,所以需要修改下面代码👇

 if(r_move==2){   // 如果移到最右边了,就右移位数重置位0
	     r_move=0;
	  }

2)从led5开始右移

只需要修改下面两处👇 

3)从led6开始右移

 只需要修改下面两处👇

4)从led7开始右移

只需要修改下面两处👇

5)从led8开始右移

只需要修改下面两处👇

6)从led9开始右移

只需要修改下面两处👇

3,完成一个左移到头接着右移,右移到头再接着左移的花样流水灯程序。

 1)效果

从左到右再从右到左的流水灯1

2)代码

#include<reg52.h> 
sbit addr0=P1^0;  // 138译码器低位输入
sbit addr1=P1^1; // 138译码器中位输入
sbit addr2=P1^2;// 138译码器高位输入
sbit addr3=P1^3; // 使能端es
sbit enled=P1^4; // 使能端 e1和e2
void main(){
    unsigned int r_move=0;  // 右移变量
	unsigned int i=0;  // for循环的形参
	addr2=1;   // 高电平
	addr1=1;
	addr0=0;   // 低电平
	enled=0;
	addr3=1; 	 
	while(1){   // 一直循环下面的操作
      if(r_move>16){   
	  r_move=0;	  //第一次从左到右再从右到左完成后,让位移重置为0
	  }
	  else if(r_move<8){
	  P0=~(0x80>>r_move);  // 从led9开始右移
	  for(i=0;i<30000;i++);	  //软件延时
	   }
	  else if(r_move>=8 && r_move<=16){  
	     P0=~(0x01<<(r_move-8));  // 如果移到最右边,就将P0重新赋值,变成左移
	     for(i=0;i<30000;i++);	  //软件延时
	  }
	  r_move++;			 //移动的位数自增
	}
	}

 有问题请在评论区留言或者是私信我,一天8h在线。

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

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

相关文章

服务器设置了端口映射之后外网还是访问不了服务器

目录 排查思路参考&#xff1a; 1、确认服务是否在运行 2、确认端口映射设置是否正确 3、使用防火墙测试到服务器的连通性 4、检查服务内部的配置 5、解决办法 6、学习小分享 我们在一个完整的网络数据存储服务系统设备中都会存有业务服务器、防火墙、交换机、路由器&a…

【Laravel】09 用模型批量赋值简化代码 数据库关系

【Laravel】09 用模型批量赋值简化代码 & 数据库关系 1. 用模型批量赋值简化代码2. 数据库关系 1. 用模型批量赋值简化代码 原来存储一个值 2. 数据库关系 这里可以看到两个SQL是一样的

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意&#xff1a;F7系列以及H7系列支持Quad-SPI模式&#xff0c;可以连接单&#xff0c;双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…

Spring 详细总结

文章目录 第一章 IOC容器第一节 Spring简介1、一家公司2、Spring旗下的众多项目3、Spring Framework①Spring Framework优良特性②Spring Framework五大功能模块 第二节 IOC容器概念1、普通容器①生活中的普通容器②程序中的普通容器 2、复杂容器①生活中的复杂容器②程序中的复…

MySQL、Oracle查看字节和字符长度个数的函数

目录 0. 总结1. MySQL1.1. 造数据1.2. 查看字符/字节个数 2. Oracle2.1. 造数据2.2. 查看字符/字节个数 0. 总结 databasecharbyteMySQLchar_length()length()Oraclelength()lengthB() 1. MySQL 1.1. 造数据 sql drop table if exists demo; create table demo (id …

Cesium 批量种树

1、准备树种建模 分各种级别建模LOD1-LODN 其中meta.json长这样&#xff1a; Gltf再3Dmax中导出Obj,再通过ObjToGltf的工具转换&#xff0c;参考 https://editor.csdn.net/md/?articleId96484597 2、准备shp点数据。&#xff08;shp中的点位就是种树的位置&#xff09; 3、准…

【并发编程】线程安全

线程安全 1. 讲一下 synchronized 关键字的底层原理 1.1 基本使用 如下抢票的代码&#xff0c;如果不加锁&#xff0c;就会出现超卖或者一张票卖给多个人 synchronized&#xff0c;同步【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】 其它线程再想获…

多模态AI全解析:概念、应用与风险

大家好&#xff0c;在人工智能的快速发展浪潮中&#xff0c;多模态学习作为一项革命性技术&#xff0c;正逐渐改变着我们与机器交互的方式。 自OpenAI推出ChatGPT以来&#xff0c;人工智能已经从处理单一文本输入的单模态工具&#xff0c;迈向了能够理解和生成包括文本、图像、…

【算法】【floodfill】洪水灌溉

文章目录 1. 岛屿数量2. 岛屿最大面积3. 被围绕的区域4. 太平洋大西洋水流问题5. 扫雷游戏6. 机器人的运动范围 1. 岛屿数量 &#x1f449;&#x1f517;题目链接 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0…

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd &#xff0c;输入命令行&#xff1a; mysql --version 2、还是打开cmd&#xff0c;输入命令行&#xff1a;mysql -V (注意了&#xff0c;此时的V是个大写的V) 二、…

unity之 “Allow ‘unsafe‘ code“ 在哪里。

导入unity中的代码&#xff0c;出现如下错误&#xff0c;该如何解决&#xff1f; Unsafe code may only appear if compiling with /unsafe. Enable "Allow unsafe code" in Player Settings to fix this error 解决这个问题&#xff0c;只需要设置就可以。 设置的地…

深入理解计算机系统 家庭作业 2.80

/* 网上很多都没说清楚到底出题人是什么用意,用意就是既要又要,既要不溢出,又要不丢失精度.所以就分开处理,在丢失之前把丢失的部分保存下来,然后两部分算好再相加. 可以先看一下我的2.79题 用的是先乘后除 会溢出 符合题意 2.80要求的是先除后成 不会溢出 但会丢失精度 核…

C++中二叉搜索树的模拟实现(二叉搜索树是map,set的底层原理)

搜索二叉树 定义 搜索二叉树:左子树小于根,右子树大于根.搜索二叉树的中序序列是升序的.所以对于二叉树而言,它的左子树和右子数都是二叉搜索树 下图就是二叉搜索树 二叉搜索树的性质: 二叉搜索树的中序遍历出的数据是有序的,并且二叉树搜索树在查找某个数的时候,一般情况下…

9proxy—数据采集工具全面测评

9Proxy数据采集工具Unlock the web with 9Proxy, the top residential proxy provider. Get unlimited bandwidth, affordable prices, and secure HTTPS and Socks5 configurations.https://9proxy.com/?utm_sourceblog&utm_mediumcsdn&utm_campaignyan 前言 在当今数…

如何实现仿微信界面[我的+首页聊天列表+长按菜单功能+添加菜单功能]

如何实现仿微信界面[我的首页聊天列表长按菜单功能添加菜单功能] 一、简介 如何实现仿微信界面[我的首页聊天列表长按菜单功能添加菜单功能] 采用 uni-app 实现&#xff0c;可以适用微信小程序、其他各种小程序以及 APP、Web等多个平台 具体实现步骤如下&#xff1a; 下载…

Windows 2008虚拟机安装、安装VM Tools、快照和链接克隆、添加硬盘修改格式为GPT

一、安装vmware workstation软件 VMware workstation的安装介质&#xff0c;获取路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1AUAw_--yjZAUPbsR7StOJQ 提取码&#xff1a;umz1 所在目录&#xff1a;\vmware\VMware workstation 15.1.0 1.找到百度网盘中vmwa…

【Android】App通信基础架构相关类源码解析

应用通信基础架构相关类源码解析 这里主要对Android App开发时&#xff0c;常用到的一些通信基础类进行一下源码的简单分析&#xff0c;包括&#xff1a; Handler&#xff1a;处理器&#xff0c;与某个Looper&#xff08;一个线程对应一个Looper&#xff09;进行关联。用于接…

【React】React hooks 清除定时器并验证效果

React hooks 清除定时器并验证效果 目录结构如下useTime hookClock.tsx使用useTime hookApp.tsx显示Clock组件显示时间&#xff08;开启定时器&#xff09;隐藏时间&#xff08;清除定时器&#xff09; 总结参考 目录结构如下 useTime hook // src/hooks/common.ts import { u…

亚马逊AWS永久免费数据库

Amazon DynamoDB 是一项无服务器的 NoSQL 数据库服务&#xff0c;您可以通过它来开发任何规模的现代应用程序。作为无服务器数据库&#xff0c;您只需按使用量为其付费&#xff0c;DynamoDB 可以扩展到零&#xff0c;没有冷启动&#xff0c;没有版本升级&#xff0c;没有维护窗…

05-延迟任务精准发布文章

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…