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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 上海电信光猫SA1456C桥接后4K IPTV继续使用[通俗易懂]

    上海电信光猫SA1456C桥接后4K IPTV继续使用[通俗易懂]上海电信光猫SA1456C路由器TL-R488GPM-AC背景:打电话给上海电信客服被告知,改桥接不能看4KIPTV,电信安装师傅也是同一口径。网上也是很多类似观点,解决方案是用软路由方式去改造。这种方案需要软路由,万一不稳定,会影响家庭安定团结的局面。需求:1、光猫直接接IPTV看,有两条IPTV接路由器即可,不需要更改任何东西。2、光猫桥接路由器,路由器宽带拨号,保证贤妻上网和IPTV的基本需求,再接旁路由满足自己小玩法。当然如有移动或联通送的宽带更好。核心:稳定简单,不折腾。如何光

    2022年10月8日
  • 微商代理分销系统

    微商代理分销系统微云基石微商代理分销系统TM(简称:微商代理分销系统TM),是所有微商分销系统中第一个采用二级无限分销模式的系统,两级分销比例由商家设定,系统自动记录追踪用户IP并管理成为分销商的前后层级。移动互联网的泛传播性很强,记录追踪用户的分销可以帮助商家梳理信息、制定市场营销策略及着重发展哪些分销商。《2014年中国商铺用户微信运营调研报告》中显示,45.7%的中小商家表示看好微商运营,39.1%

    2022年5月13日
  • 激光slam认知_激光slam的优缺点

    激光slam认知_激光slam的优缺点slam介绍什么是slam?SLAM(simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图所谓完全的地图(aconsistent…

    2022年8月23日
  • [日常办公][Ubuntu]proxy settings

    [日常办公][Ubuntu]proxy settingsbashproxyexporthttp_proxy=XXXexporthttps_proxy=XXXaptproxysudovim/etc/apt/apt.confAcquire::http::proxy”http://XXX”;Acquire::https::proxy”https://XXX”;Acquire::ftp::proxy”ftp://XXX”;Acquire::socks::proxy”socks://XXX”;dockerproxymkdir

    2022年7月21日
  • C语言字符串输入及输出的几种方式

    C语言字符串输入及输出的几种方式1.字符串数组+初始化chars1[]=”array”;//字符数组chars2[6]=”array”;//数组长度=字符串长度+1,因为字符串末尾会自动添‘\0‘printf(“%s,%c\n”,s1,s2[2]);//array,r2.字符串指针+初始化char*sp=”pointer”;//字符指针printf(“%s,%c,%c\n”,sp,

    2022年7月24日
  • 判断数组中是否包含某个元素,判断对象中是否包含某个属性,判断字符串中是否包含某个字符串片段[通俗易懂]

    判断数组中是否包含某个元素,判断对象中是否包含某个属性,判断字符串中是否包含某个字符串片段[通俗易懂]1-判断对象中是否包含某个元素方法一:使用invarstr={name:”mayouchen”,name:”js”,age:100}alert(‘name’instr);//tr

    2022年8月31日

发表回复

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

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