项目场景:在某次keil开发中,使用蜂鸣器时,蜂鸣器一直鸣叫。


问题描述

当在主函数的while(1)中运行时,蜂鸣器一直鸣叫。

void main()
{//只有开机时候有效while(Beep_N_Times--){P0 = 0x40;//将蜂鸣器打开P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=200);P0 = 0x00;//将蜂鸣器关闭P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=500);}
}

原因分析:

在我思考无果后,又去菜鸟教程看了一遍while()用法之后,我才豁然开朗,原来当while(i–)减到1时,会直接运行while中的程序,导致i最后的值为-1,但是在keil5的开发中,我把它放在主函数中,相当于一直运行。
当while(i–)减为1时,程序变为while(1)嵌套无限循环,这时
Beep_N_Times无法起到任何作用

void main()
{while(1) //本来应该是Beep_N_Times{Beep_N_Times--;P0 = 0x40;//将蜂鸣器打开P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=200);P0 = 0x00;//将蜂鸣器关闭P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=500);}
}

解决方案:

  1. 将Beep_N_Times在程序中减值,而不是while(Beep_N_Times)
  2. 不使用while,因为次数一定,可以使用for函数

修改

void main()
{//只有开机时候有效while(Beep_N_Times){Beep_N_Times--P0 = 0x40;//将蜂鸣器打开P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=200);P0 = 0x00;//将蜂鸣器关闭P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=500);}
}
void main()
{//只有开机时候有效for(Beep_N_Times = Beep_N_Times_Last; Beep_N_Times > 0; Beep_N_Times --_){Beep_N_Times--P0 = 0x40;//将蜂鸣器打开P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=200);P0 = 0x00;//将蜂鸣器关闭P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开ms_Tick_Point=ms_Tick;while((ms_Tick-ms_Tick_Point)<=500);}
}

开发过程中的一点小事,记录下来,以示提醒。

keil5中while(1)中while(i--)无限循环相关推荐

  1. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  2. 【笔记】python的while循环简介:使用while循环、让用户选择何时退出、使用标志、使用break退出循环、在循环中使用continue、避免无限循环

    文章目录 一.while循环简介 二.使用while循环 三.让用户选择何时退出 四.使用标志 五.使用break退出循环 六.在循环中使用continue 七.避免无限循环 一.while循环简介 ...

  3. 删除无限循环的文件夹-删除递归文件夹

    最近本人的电脑(Win 7)中某个文件夹出现了无限循环,如下:D:\software\app\note\bin\app\note\bin\app\note\bin\app\note\bin\-- 直接 ...

  4. 如何解决 React.useEffect() 的无限循环

    作者:Shadeed 译者:前端小智 来源:dmitripavlutin 点赞再看,微信搜索**[大迁世界],B站关注[前端小智]**这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub h ...

  5. vue本地没事放到服务器上无限循环,解决vue中的无限循环问题

    项目中遇到了这样一个问题:每一种产品有对应的服务费,每一个商家有多种商品要单独计算每一家的服务费,最后汇总总的服务费用.我直接写了一个方法来计算出每个商家和总的服务费用并return出来.如果不看控制 ...

  6. python无限循环语句的代码_如何在Python中实现非阻塞无限循环

    我有一个无限循环,从网络摄像头读取视频帧,每个帧将通过一个复杂的功能,需要高计算能力.因此,当显示帧时,由于阻塞代码,程序会感觉有点迟钝. 我现在打算做的是, >仅在目标对象出现时收集前几帧 & ...

  7. vue 一直登录错误_vue中路由拦截无限循环的情况

    如下图,浏览器报出这个错误 这是因为路由守卫在拦截路由的时候,找不到跳转的地址,引起了无限循环. 在设置路由拦截的时候当指向另一个地址的时候还会触发一次路由拦截,既每次地址栏的变化都会触发一次路由拦截 ...

  8. web项目中实现登陆成功后才能访问某些页面,否则自动跳转到登陆界面,以及对无限循环重定向的解决

    1.不使用过滤器实现,在需要拦截的页面通过session判断是否登陆,若没登陆则跳转到login.jsp页面: <% Admin admin = (Admin)session.getAttrib ...

  9. java中无限循环的方法_Java中的无限循环

    Java中的无限循环 在Java中查看下面的无限while循环. 它会导致它下面的语句编译时错误. while(true) { System.out.println("inside whil ...

最新文章

  1. 利用python 实现微信公众号群发图片与文本消息功能
  2. 拒绝无脑试错:写给萌新的“科学炼丹”入门手册
  3. QT配置OpenCV(二):成功
  4. 如何才能打造一个良好的Java功底,提高自己的核心竞争力?
  5. java进程内的缓存框架Ehcach
  6. php检查是否支持openssl,swoole环境是否支持openssl
  7. Excel如何删除表格中的空白列
  8. 骑士CMS01 74cms v4.2.111 后台getshell漏洞复现
  9. Android平板的磁盘分区,平板电脑硬盘分区 Original Pad到PC:教您将Win10安装到Android平台...
  10. 跑跑卡丁车道具攻与防
  11. 远程计算机显卡,微软远程桌面连接(RDP)优化方案-显卡加速-提升帧率-挂载U盘...
  12. nest 模拟器_如何将Nest Thermostat用作运动探测器
  13. RTX3080和RTX2080TI 哪个好
  14. 有趣的程序代码c语言,一个有趣的小程序
  15. Llinux装逼命令大全
  16. mac(5) : 使用终端解压rar文件
  17. 「DaoCloud 道客」荣升Istio指导委员会席位
  18. Http 协议建立连接的方式
  19. 以太坊Python智能合约开发指南
  20. Web安全之中间件安全

热门文章

  1. QT浏览器插件开发入门
  2. 计算机网络什么是互联网什么是网速,网速慢是什么原因,怎么解决?
  3. Vue 结合 echarts 原生 html5 实现拖拽排版报表系统
  4. 【Budibase】搭建低代码开发平台
  5. 开源简史基础:CNCF项目简介
  6. Arduino基础入门篇09—会呼吸的灯
  7. java js id的点击事件_JavaScript中点击事件的写法
  8. Vue3 项目中使用 AntV X6 绘制流程图
  9. Linux xshell通过ssh连接Linux系统
  10. 关于微信小程序你所需要掌握的技能