如题,我是一个单片机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取反。