89c51单片机流水灯操作

89c51单片机流水灯操作要用51单片机实现流水灯操作我想是每个初学者学习单片机,了解嵌入式的第一个动手的小实验吧,今天在重新学习的时候遇到了一点小问题,在这里和大家分享一下。要想控制流水灯操作其实是用单片机给每个二极管高低电平来控制灯的亮与不亮。我用的51单片机学习板的二极管的硬件原理图如下图所示板子上电之后,J2是跳线帽,一般是连接上的,再过来是LED1~LED8共8个发光二极管,然后经过电阻连接到51…

大家好,又见面了,我是你们的朋友全栈君。

要用51单片机实现流水灯操作我想是每个初学者学习单片机,了解嵌入式的第一个动手的小实验吧,今天在重新学习的时候遇到了一点小问题,在这里和大家分享一下。

要想控制流水灯操作其实是用单片机给每个二极管高低电平来控制灯的亮与不亮。

我用的51单片机学习板的二极管的硬件原理图如下图所示

89c51单片机流水灯操作

板子上电之后,J2是跳线帽,一般是连接上的,再过来是LED1~LED8共8个发光二极管,然后经过电阻连接到51单片机的8个P1端口上。

89c51单片机流水灯操作

电阻的作用是为了限流,是为了达到二极管规定的电压与电流,避免烧坏二极管。

51单片机上电引脚默认是高电平,所以我们通过给P1各个引脚低电平(即逻辑0),电路即导通则指定的二极管变亮(因为二极管的单向导电性,阳极电压高于阴极电压则二极管导通,则灯亮)。

刚开始我写的程序如下

89c51单片机流水灯操作

因为编译器会一直执行主函数里的程序,所以单片机的第一个灯则一直亮

89c51单片机流水灯操作

sbit 是位操作,P1^0即对P1的第0位进行操作,所以要想控制哪个灯亮则对哪个位进行置0操作即可。

接下来我又进行了一个操作,我想使8个灯依次点亮,我用了左移运算符 <<,因为单片机的初始引脚都是高电平,所以P1端口8个位的初始值是0xff(即8个位是 1111 1111)依次点亮即每次左移一位即可。所以我进行了如下操作。

89c51单片机流水灯操作

我的理解是8个灯依次亮直到全亮,结果实验现象为只有第一个灯亮,当时我就很郁闷,与我设想的实验现象不一致,然后我又回头从新按照网上的一些资料从新编程,结果如下

89c51单片机流水灯操作

这次的实验现象为依次点亮直到全亮(由于懒得放视频,就口头描述现象)

这时我就比较纳闷了因为新的程序只比我的多了一个while(1)死循环,但是我当时的理解是程序是一直会执行主函数里的程序,所以我就又做了一个实验来验证我的想法结果如下

89c51单片机流水灯操作

假如灯只亮灭一次,那么主函数只执行一次,结果一直在那亮灭,就说明我理解的没有错误,主函数一直在重复执行

这时我就纳闷了,我预想的第一个实验加while 与不加while的实验现象应该都是一样的啊,执行一次主函数P1左移一位,灯依次点亮直到全亮,也是一个无限循环与wile(1)的操作应该是一样的啊,这时我就去请教了一下我的大哥,哈哈哈,终于在一顿激烈的讨论下,得出了一个结论,我的理解如下,加了while(1)的主函数在进行第一次的时候,在执行第一次的主函数时进行了无限循环,即一直是在执行第一次的主函数,P1的值一直是一个局部变量,一直在接着上次的值在改变,而没有加while(1)的则进行了无限次循环,每次循环则重新调用库函数里的P1值每次都是0xFF,左移一位每次都是0xFE,那么每次循环则是第一个灯亮这样就能解释为什么两个实验现象不一致(比较绕,要对c语言变量的作用域与生存空间有一定理解,c语言有一定基础)

所以我就行进行了如下实验来验证这个猜想

89c51单片机流水灯操作

如果猜想正确,那么实验现象就应该是第一个灯亮然后8个全亮,接着又是第一个灯亮,怀着激动地心情我烧录了程序之后,果然和我想的一样!!!

最后实现简单流水灯的终极操作如下

89c51单片机流水灯操作

所以我们在以后的编程里要注意这个坑!!!

变量的作用域和作用的作用范围,要不然会出现很多难以理解的现象。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134369.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Pytest(6)重复运行用例pytest-repeat[通俗易懂]

    Pytest(6)重复运行用例pytest-repeat[通俗易懂]前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年7月30日
    3
  • ThreadPoolTaskExecutor线程池参数配置

    ThreadPoolTaskExecutor线程池参数配置一、线程池配置1、ThreadPoolConfigimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.Threa

    2022年5月4日
    303
  • C#网络编程(Socket编程)「建议收藏」

    C#网络编程(Socket编程)「建议收藏」一、Socket网络编程1.Socket是什么?在计算机通信领域,Socket被译为“套接字”。它是计算机之间进行通信的一种约定或一种方式。通过Socket这种约定可以接收到其他计算机的数据,也可以向其他计算机发送数据。2.本质是编程接口(API),对于TCP/IP的封装,TCP/IP也提供了可供程序员做网络开发所用的接口3.作用Socket的英文原意是“插座”,的意思,通常在计算机编…

    2022年7月13日
    12
  • rabbit mq使用_rabbitmq部署

    rabbit mq使用_rabbitmq部署原文转载:http://blog.csdn.net/whycold/article/details/41119807推荐文章:SpringBoot+RabbitMq的使用一、简介MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息…

    2022年10月3日
    0
  • 贪吃蛇程序代码python_python 贪吃蛇

    贪吃蛇程序代码python_python 贪吃蛇Python贪吃蛇源代码Python代码狂人Python代码大全程序运行截图如下:importpygameaspgfromrandomimportrandintimportsysfrompygame.localsimport*FPS=6#画面帧数,代表蛇的移动速率window_width=600window_height=500cellsize=20c…

    2022年8月10日
    7
  • websocket设置header(HttpCanary)

    OkHttpClient的性能要优于HttpClient,因此本例来教大家如何配置使用它.在要使用的地方直接@Autowired即可:测试:

    2022年4月16日
    847

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号