普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1486|回复: 2

[已解决] 记录并分享通过直流电机实验学到的知识点-单片机是如何执行main函数的?

[复制链接]

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-5-8 13:54:40 | 显示全部楼层 |阅读模式
    首先提醒大家注意安全:套件里的直流小电机上配有硬塑料做成的扇叶,实验期间当心不要被打伤,电机虽小但是转速很高,不注意可能伤到人或打坏实验板。一开始可以先拿掉扇叶实验代码,熟悉后再装上扇叶,可以通过调换电机两条引线在VCC和ULN2003D输出引脚的位置,来体验电机正转和反转的效果。

    回到主题:在P113视频讲解代码的过程中,讲师提到控制P1^0引脚输出高低电平控制电机转动5秒后停止,一定要将代码放到while循环外等等。引出一个问题-就是C51单片机执行main函数的机制是什么样的?只顺序的从头至尾执行一次吗?视频中的讲解很容易给人一个这样的概念理解。

    通过代码的实验可以看到视频示例的代码确实是让电机运转了几秒钟之后就停下来了,但其实此时C51并不是停下来了,此时CPU一直在空的while循环中在执行“死循环”,main函数并未结束、退出。如果大家将while空循环注释掉,会发现电机会呈现一直运行的状态,为什么会这样呢?虽然代码中最后是给引脚赋值0(ULN2003D输出高电平)来关闭电机,此时电机只是在极短的时间里停顿了一下,main函数就结束并再次重新执行了,所以给人的感觉就是电机就一直处于运转状态。

    可以在“DC_Motor=0;//关闭电机”后面同样加上“delay_ms(DC_MOTOR_RUN_TIME);”,此时可以观察到执行的结果就是电机处于间歇的运转中,启动-停止-启动...反复执行,所以通过实验结果我们可以发现单片机在执行main函数时并不是只从头到尾执行一次,而是执行到main函数最后退出后再次重新执行的(进一步的信息可以参考- https://www.elecfans.com/emb/danpianji/201912201140532.html)。那么大家一直以来都使用一个while循环控制程序难道都是多余的吗?也不是,使用while循环的好处是让代码处于“一个明确受控的死循环中”,有了这个while循环我们就可以明确知道代码一直在里面执行,而不必将代码是否会反复循环的不确定性交给单片机来处理。

    同时对于只希望运行一遍代码的场景,使用一个空while循环作为“封闭main函数的阀门”的功能,可以作为一个典型的方法。

    最后在实验中发现的一个现象:只要当电机引线插到J47的VCC上,此时无论电机是否运转,下载程序都会发生超时,只有将VCC断开,HEX才能被刷进去,不知大家是否也是这样的?感觉好像是接通VCC后,整体的负载变大,CH340无法完成刷新程序,毕竟所有的驱动实验板、电机的功耗都是通过电脑USB经CH340提供的,欢迎大家讨论。

回复

使用道具 举报

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
 楼主| 发表于 2023-5-25 10:16:52 | 显示全部楼层
本帖最后由 zhong_zhiqi 于 2023-5-25 10:35 编辑

关于“电机引线插到J47的VCC上,此时无论电机是否运转,下载程序都会发生超时”的问题的后续- 咨询普中客服的答复- “加了电机驱动电流被拉低,就可能程序下载不了”,但是具体原理就没说。


今天做了一种尝试- 找了一个带外接电源的USB hub连接电脑的USB和开发板,这样就相当于通过USB hub的外接直流电源(5V 2A)支撑开发板的负载,不过结果依旧是只要连上直流电机的VCC,烧写程序就超时,看来还有没有考虑到的因素。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 06:26 , Processed in 0.081475 second(s), 34 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表