找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 6037|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

無(wú)源蜂鳴器阻塞程序,怎樣讓無(wú)源蜂鳴器正常發(fā)聲且不會(huì)影響主程序。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:735365 發(fā)表于 2020-5-18 10:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我想用無(wú)源蜂鳴器報(bào)警,但是無(wú)源蜂鳴器太占用時(shí)值,導(dǎo)致中斷異常。能否有一種方法,讓無(wú)源蜂鳴器正常發(fā)聲的同時(shí)程序也能正常工作?望大佬指點(diǎn),先行謝過(guò)!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:548551 發(fā)表于 2020-5-18 14:35 | 只看該作者
開(kāi)中斷定時(shí)器啊.比如,你用T0做主定時(shí), 那么T1做蜂鳴器定時(shí)中斷啊. 只要有需要蜂鳴器的的時(shí)候它自己會(huì)去處理.就是這么個(gè)道理.
回復(fù)

使用道具 舉報(bào)

板凳
ID:735365 發(fā)表于 2020-5-18 21:54 | 只看該作者
xqleft 發(fā)表于 2020-5-18 14:35
開(kāi)中斷定時(shí)器啊.比如,你用T0做主定時(shí), 那么T1做蜂鳴器定時(shí)中斷啊. 只要有需要蜂鳴器的的時(shí)候它自己會(huì)去處理 ...

你好,我已經(jīng)開(kāi)了外部中斷和定時(shí)器T0,T0是小延時(shí)且嵌套按鍵掃描,我把蜂鳴器寫(xiě)到T0里面,但是無(wú)源蜂鳴器太占用時(shí)值,影響主程序出錯(cuò)了。現(xiàn)在可以把T0延時(shí)拉長(zhǎng)一些再試試,但我主要想讓無(wú)源蜂鳴器一直響且不影響主程序。我再試試,謝謝你的想法。
回復(fù)

使用道具 舉報(bào)

地板
ID:440553 發(fā)表于 2020-5-18 22:37 | 只看該作者
定時(shí)器
回復(fù)

使用道具 舉報(bào)

5#
ID:712493 發(fā)表于 2020-5-18 22:47 來(lái)自手機(jī) | 只看該作者
xqleft 發(fā)表于 2020-5-18 14:35
開(kāi)中斷定時(shí)器啊.比如,你用T0做主定時(shí), 那么T1做蜂鳴器定時(shí)中斷啊. 只要有需要蜂鳴器的的時(shí)候它自己會(huì)去處理 ...

中斷會(huì)不會(huì)太頻繁,找有pwm的芯片
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2020-5-19 06:46 | 只看該作者
BMK達(dá)人 發(fā)表于 2020-5-18 21:54
你好,我已經(jīng)開(kāi)了外部中斷和定時(shí)器T0,T0是小延時(shí)且嵌套按鍵掃描,我把蜂鳴器寫(xiě)到T0里面,但是無(wú)源蜂鳴器 ...

一個(gè)定時(shí)器可以做N項(xiàng)工作。操作蜂鳴器只占幾u(yù)s,根本不會(huì)影響其他程序運(yùn)行。
void InitTimer0(void)
{
    TMOD = 0x02;//8位自動(dòng)重裝
    TH0 = 0x06; //250us
    TL0 = 0x06;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0Interrupt(void) interrupt 1
{
        if(sign)//sign控制位
                buzzer=~buzzer;//取反
        else buzzer=0;//復(fù)位
        //其它中斷任務(wù)
}
回復(fù)

使用道具 舉報(bào)

7#
ID:401564 發(fā)表于 2020-5-19 09:10 | 只看該作者
中斷,是單片機(jī)的一個(gè)重要功能,目的就是要讓單片機(jī)“同時(shí)”去做幾個(gè)事情,T0或者T1都是一樣的,蜂鳴器一般是1KHZ的,如果用中斷的話,就是0.5mS進(jìn)入一次中斷,幾u(yù)S的中斷時(shí)間,這完全是沒(méi)有占用多少時(shí)間的
如果實(shí)在不行,那就用PWM,但打開(kāi)和關(guān)閉PWM也是一樣的要時(shí)間的呀,不知道你到底是什么程序,對(duì)時(shí)間要求那么嚴(yán)格
回復(fù)

使用道具 舉報(bào)

8#
ID:548551 發(fā)表于 2020-5-19 09:46 | 只看該作者
fj51hei 發(fā)表于 2020-5-18 22:47
中斷會(huì)不會(huì)太頻繁,找有pwm的芯片

不會(huì),中斷就是用來(lái)干這個(gè)的.
回復(fù)

使用道具 舉報(bào)

9#
ID:735365 發(fā)表于 2020-5-19 10:36 | 只看該作者
xqleft 發(fā)表于 2020-5-19 09:46
不會(huì),中斷就是用來(lái)干這個(gè)的.

各位辛苦了,我今天把T1定時(shí)器開(kāi)個(gè)小延時(shí),功能正常了。
回復(fù)

使用道具 舉報(bào)

10#
ID:548551 發(fā)表于 2020-5-19 10:49 | 只看該作者
BMK達(dá)人 發(fā)表于 2020-5-18 21:54
你好,我已經(jīng)開(kāi)了外部中斷和定時(shí)器T0,T0是小延時(shí)且嵌套按鍵掃描,我把蜂鳴器寫(xiě)到T0里面,但是無(wú)源蜂鳴器 ...

玩的51系列對(duì)吧? 你現(xiàn)在估計(jì)才剛開(kāi)始接觸單片機(jī).記住一個(gè)重點(diǎn),重中之重:不要用delay_延時(shí).不要用delay_延時(shí).不要用delay_延時(shí).
現(xiàn)在給你一個(gè)思路,你可以做下參考.
void main (void)
{
        POWER_INITIAL();                                //單片機(jī)初始化:IO口輸出輸入定義;上下拉設(shè)置;IO口初始電平;單片機(jī)晶振頻率選擇,晶振頻率根據(jù)需要選
                                                                //合適的頻率.選好之后后面需要用到的都是在選的頻率之上計(jì)算
        TIME0_INITIAL();                                //定時(shí)器初始化設(shè)置.這個(gè)開(kāi)中斷,設(shè)置4MS一次定時(shí)中斷.后面所有的計(jì)數(shù)都是在4MS以上進(jìn)行計(jì)算的
                                                                //比如你要延時(shí)1秒,直接用變量累加,累加到250次的時(shí)候執(zhí)行你延時(shí)1秒之后的程序,沒(méi)有累加到1S的時(shí)候
                                                                //可以執(zhí)行其它程序,因?yàn)閐elay延時(shí)程序是在哪里空跑,其它的程序跑不了,用變量延時(shí),可以跑其它的程序,
                                                                //比如我按鍵還沒(méi)有到的時(shí)候我可以執(zhí)行燈里面的程序.
        TIME1_INITIAL();                                //模擬蜂鳴器的定時(shí)4K的頻率,125US進(jìn)一次中斷,進(jìn)一次翻轉(zhuǎn)一直蜂鳴器電平,組成一個(gè)250US,4K頻率的蜂
                                                                //鳴器方波                       
        WTD_INITAL();                                        //看門(mén)狗初始化 ,這個(gè)我不知道C51系列用到?jīng)]有但是前面的肯定是用到了
        //開(kāi)T0 定時(shí)器中斷                                //這個(gè)我沒(méi)有玩過(guò)C51不知道那一段代碼
        //開(kāi)T1 定時(shí)器中斷                                //
        //開(kāi)總中斷.
        while(1)
        {
                if(F_4MS)
                {
                        F_4MS=0;
                        //清看門(mén)狗程序                    //這一段代碼是清看門(mén)狗的,防止看門(mén)狗復(fù)位
                        ////////////////////////                //下面是所有程序的子函數(shù),你把子函數(shù)模塊寫(xiě)好嵌套進(jìn)去就可以了
                        KEY_SCAN();                        //按鍵掃描
                        LED_DISPLAY();                        //指示燈
                        PWM_OUT();                        //馬達(dá)輸出
                }
        }
}
因?yàn)槲也皇菍?xiě)C51的.但是我寫(xiě)的都是51內(nèi)核的.和它差距不大.所以整體上是一個(gè)思路.這是出來(lái)工作后的思路, 你的那個(gè)思路學(xué)習(xí)可以.但是想要學(xué)習(xí)好,學(xué)習(xí)精,你那個(gè)思路要把不好的去掉.  因?yàn)槲覜](méi)有玩過(guò)51,我只看了它的教程,所以不知道定時(shí)器怎么配,下面是中斷函數(shù)處理:
void interrupt(void)
{
        //T0中斷處理  
        //這個(gè)T0主程序定時(shí)的到了之后把4_4MS這個(gè)標(biāo)志位置1;下面while(1)哪里就是靠這個(gè)標(biāo)志位來(lái)進(jìn)入主程序里面的子程序模塊
        F_4MS=1;



        //T2處理   模擬蜂鳴器的
        //51的我不知道到了之后有沒(méi)有標(biāo)志位什么的,你只需要把下面這個(gè)放到T2中斷里面去就可以了
        if(F_BELL_WORK)
        {
                P_BELL=!P_BELL;
        }
}
void TIME0_INITIAL(void)
{
        //操作T0定時(shí)器中斷的寄存器,讓它定時(shí)為4MS進(jìn)一次中斷
}
void TIME2_INITIAL(void);
{
        //操作T2定時(shí)器中斷的寄存器,讓它定時(shí)為125US進(jìn)一次中斷
}

可能寫(xiě)的有點(diǎn)亂. 但是我想這個(gè)你應(yīng)該能看懂
回復(fù)

使用道具 舉報(bào)

11#
ID:695961 發(fā)表于 2020-5-19 11:31 | 只看該作者
最好找PWM的芯片。

當(dāng)然,把定時(shí)器分開(kāi)使用也是沒(méi)有問(wèn)題的,關(guān)鍵是程序要組織好。
回復(fù)

使用道具 舉報(bào)

12#
ID:695961 發(fā)表于 2020-5-19 11:32 | 只看該作者
另外,中斷優(yōu)先級(jí)要提高一些,這樣音樂(lè)就不會(huì)跑調(diào)了。
回復(fù)

使用道具 舉報(bào)

13#
ID:735365 發(fā)表于 2020-5-19 12:24 | 只看該作者
xqleft 發(fā)表于 2020-5-19 10:49
玩的51系列對(duì)吧? 你現(xiàn)在估計(jì)才剛開(kāi)始接觸單片機(jī).記住一個(gè)重點(diǎn),重中之重:不要用delay_延時(shí).不要用delay_延 ...

是的,注釋這么詳細(xì),要是看不懂也太不給面子了(接觸過(guò)32,那些配置有了解)。一個(gè)定時(shí)器服務(wù)其他函數(shù),另一個(gè)短延時(shí)控制無(wú)源蜂鳴器IO反轉(zhuǎn)。收獲重點(diǎn):盡量不用delay這種延時(shí)。大哥講的很好!
回復(fù)

使用道具 舉報(bào)

14#
ID:235954 發(fā)表于 2020-5-19 21:57 | 只看該作者
定時(shí)中斷,設(shè)置下時(shí)間,服務(wù)函數(shù)里面置下標(biāo)志位,這樣也不占太多程序的時(shí)間
回復(fù)

使用道具 舉報(bào)

15#
ID:420836 發(fā)表于 2020-5-20 08:08 | 只看該作者
如果使用了過(guò)多的延遲,則最終會(huì)占太多控制時(shí)間,應(yīng)對(duì)某些功能使用中斷。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表