当前位置: 代码迷 >> 单片机 >> 关于nop延时的菜有关问题
  详细解决方案

关于nop延时的菜有关问题

热度:94   发布时间:2016-04-28 16:13:50.0
关于nop延时的菜问题。
如题,我是一个单片机c语言的菜鸟。最近搞懂了蜂鸣器原理后,打算用nop延时
C/C++ code
void delay500us()                        //定义500微秒的延时函数{    unsigned char i;    for(i=500;i>0;i--)                                                    {    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    }}

最后发现蜂鸣器会蝉鸣了-_-" ....

各位高手,这是什么情况呢?用NOP延时使蜂鸣器响有可能吗?那我需要怎样写?
虽然现在也在学定时器。。


C/C++ code
#include<reg52.h>                       //52系列单片机头文件sbit fmq=P3^6;                           //声明单片机P3口的第6位void main(){    void delay500us();                   //声明500微秒的延时函数    void delayms(unsigned int xms);       //声明延时x毫秒函数    void beep();                       //声明产生1KHZ频率声音的函数    unsigned int i;    while(1)    {        for(i=0;i<1000;i++)        {            beep();        }            fmq=0;        delayms(1000);    }    }void delay500us()                        //定义500微秒的延时函数{    unsigned char i;    for(i=500;i>0;i--)                                                    {    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    }}void delayms(unsigned int xms){    unsigned int i,j;    for(i=xms;i>0;i--)    {        for(j=110;j>0;j--)        {            ;        }    }}void beep()                              //定义产生1KHZ频率声音的函数{    fmq=0;    delay500us();    fmq=1;    delay500us();}


------解决方案--------------------
蜂鸣器和喇叭是不同的。
(1)蜂鸣器只要通电就会响,他的声音的频率是固定的。
(2)也可以用开关开关的方式再叠加一个频率上去,就像你的1K频率一样。

在C语言,如果要得到比较精确的延时,最好用定时器。C语言中,NOP来延时时,虽然NOP本身时间是固定的,但是你前面的for(i=500;i>0;i--) 的时间也要算上,用不同的优化级别的时候,这个时间可能不同,另外还要算上函数调用和返回时的出栈和入栈时间。
你可以这样来做:
(1)定义一个全局的允许蜂鸣器叫得标志unsigned char bBeepEnable = 0,在主程序中,如果标志位1,则蜂鸣器按照1K频率叫,否则,不叫。
(2)开一个500us的定时器。在超时中断中,判断,如果bBeepEnable = 1, 则将fmq取反。
  相关解决方案