![]() |
連衡_ 發表于 2018-12-2 10:52 思路參考我在14樓說的就可以了 |
zzzy 發表于 2018-12-1 21:34 改變里面的延時長度只是改變蜂鳴的聲音,還是一直響,不斷的那種 ![]() |
本帖最后由 wulin 于 2018-12-2 10:47 編輯 給你一個利用定時器作驅動信號的無源蜂鳴器示例,詳細注釋。按一次鍵,響3下。 #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit key1 = P1^4; sbit beep = P1^5; uchar num=0; //響鈴計數變量 uint count=0; //中斷計數變量 void Timer0Init() //250微秒@12.000MHz { TMOD |= 0x02; //自動重載模式 TL0 = 0x06; //設置定時初值 TH0 = 0x06; //設置定時重載值 TR0 = 1; //定時器0開始計時 EA=1; //開總中斷 ET0=1; //開T0中斷 } void delay(uint z)//延時ms { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } void keyscan()//按鍵掃描 { if(!key1) { delay(10); if(!key1) num=3;//響鈴3次 while(!key1); } } void main() { Timer0Init();//初始化定時器 while(1) { keyscan();//按鍵掃描 } } void timer0() interrupt 1 //T0中斷 { if(num>0) { count++; if(count<=1000) beep=~beep; //蜂鳴器端口取反 if(count>1000) //0.25秒時間到 beep=1; if(count>=2000)//0.5秒時間到 { count=0; //計數清0 num--; } } } |
循環結構就行 |
無源的 做個符合頻率的定時器,在中斷處理中 if(stop==0) beep =!beep; main函數中 stop =1; for(i=0;i<3;i++) { stop = 0; delay(500); stop = 1; delay(500); } |
while(1)死循環不要了 delay(5)太短了,500試試不明顯再加倍 |
用for循環加個變量來計數 |
這個方法很多,給一個脈沖響一次,時間長度看脈沖長度,給三次就是響三下 |
將a定義為全程變量 |
用這個程序就可以,雖然程序很幼稚,但你要求的功能達到了,嘿嘿嘿。 #include <reg51.h> sbit FMQ=P1^5; void Delay25us() //@12.000MHz { unsigned char i; i = 10; while (--i); } void main (void) { unsigned char i; unsigned int j; for (j=0;j<5000;j++) { FMQ=1; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } for (j=0;j<5000;j++) { FMQ=0; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } for (j=0;j<5000;j++) { FMQ=1; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } for (j=0;j<5000;j++) { FMQ=0; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } for (j=0;j<5000;j++) { FMQ=1; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } for (j=0;j<5000;j++) { FMQ=0; for (i=0;i<5;i++) { Delay25us(); } FMQ=0; for (i=0;i<5;i++) { Delay25us(); } } while (1); } |
將a定義為全程變量 |
在for循環里面加個while(1) while(1) { for(a=0;a<3;a++) { } while(1) } |
永遠的檉柳 發表于 2018-12-1 19:29 圖片的就是for循環呀,沒用,請問還有其他方法嗎 |
for循環3次跳出 |
用for循環 |
無源的 |
是無源的 |