引导代码的执行时间在好几个毫秒级
发布时间:2018-01-19 05:36

  百度知道电脑/网络操作系统/系统故障Windows

  为什么无源蜂鸣器,在相同的频率和不同的发声时间条件下,一个声音很低,一个声音比较高,而且音质也差很多!解释得详细,可以追加!...

  为什么无源蜂鸣器,在相同的频率和不同的发声时间条件下,一个声音很低,一个声音比较高,而且音质也差很多!

  展开全部你把蜂鸣器上的纸撕了再听听看。追问纸是撕掉的。蜂鸣器是能正常响的,问的是为什么第一个程序执行2次声音就很低,第二个执行100次声音才是正常发声的!追答如果你的delay1ms(1)表示延迟1毫秒的话你第一个循环是产生一个500HZ的声音,第二个是产生10HZ的声音你查一下你蜂鸣器型号对应的蜂鸣器谐振频率,产生的声音频率与蜂鸣器本身谐振频率靠近的时候声音会变强

  追问我这两个循环的周期不都是(高电平1ms+低电平1ms)=2ms,f=1T=500HZ吗?那个循环不是延长它响的时间吗?

  追答哎呀,我想错了,你是把循环写在一个while(1)里了是吗for语句变成汇编指令后也是要执行时间的,你第一个for内时间太短,可能造成for语句的汇编语句执行和for语句内循环语句的执行时间比相差很小,产生的真实频率就低了

  追问我题目里的for循环是没有放在while(1)里的,如果放进去的话for循环就没意义了。如果把for循环语句换成while(1)的话是能正常发声的!那个说真实频率变低这句话能再解释得清楚点吗?有点理解不是很清楚!

  追答哦,我懂了,单片机程序是从引导代码开始执行的,你没有写while(1)的话呢,他每次执行完for不是马上跳转到main函数的for来执行,而是exit 0(也就是结束程序),然后重启机器从引导代码开始执行,引导代码的执行时间在好几个毫秒级,而且在执行引导代码期间蜂鸣器是不工作的,你for的次数设为2的时候,你的for循环执行完一次的时间和引导代码的执行时间差不多,当你设为100或者比较大的数的时候呢, 程序陷入for循环的时间较长,引导代码执行的时间相对就短,体现不出来。所以单片机程序要一直执行的代码,一般都写在一个while(1)里,把一次性不需要循环配置的寄存器和全局变量,静态量的设置和定义写在while(1)前面。

  追问那意思是引导代码在执行结束的同时,for循环一次也结束了,也就相当于这个蜂鸣器就接收到半个周期的电平!追答不是,当你给单片机上电后先执行引导程序,然后执行你的for语句,你for()里面是2也就产生了一个周期的脉冲,电平反转了两次。然后机器又去执行引导程序了,执行完了引导程序之后,再来一周期脉冲,等于你的蜂鸣器在间歇性工作,工作一周期就暂停几毫秒,这样频率和总功率都要变低的。类似电平是这样变化的 0000 101 000 101 000 101后来你提高到for里是100 电平类似这样 0000 101 010 101 010 ……101 0000 1010101……

  追问之前说的扩充了我一方面不知道的知识,在此我追加下财富值!我整个程序是这样的

  这是我按下键后,响的声音特别小的程序,然后for循环里2换成100就变响了,这应该和引导代码没关系的吧!

  有啊,你这个程序是烧到单片机的程序,你这个C程序先要编程汇编指令,然后才能变成二进制码烧到单片机里

  由于你没有while(1),你按键或者不按键,进入分支结构结束之后main函数还是结束了,还是进入了引导程序,只是这个过程都很快你感觉不到,误认为一直在执行你写的main函数内部程序,但是蜂鸣器感觉的到啊。

  那么你思考一个问题,void mian()函数何时结束,结束后单片机为何还在工作

  答案就是,单片机执行完了void mian函数后,程序计数器指针指向的引导代码,相当于重启单片机,这样单片机就要从引导程序开始,清除内存,配置寄存器默认状态,配置时钟,这段程序的执行是需要时间的。在这期间无法驱动你的蜂鸣器工作。

  追问我加了while(1)之后还是一样的,for循环两次的那个程序,蜂鸣器声音还是很低!追答那就是因为执行键盘扫描程序的时间比较长,达到了毫秒级,和你for循环执行两次的时间在一个数量级上,你可以试验一下加上while(1)后去掉键盘扫描程序和加上键盘扫描程序下的for两次的声音效果追问这个键盘扫描是没有毫秒级的了。