標(biāo)題: 51簡(jiǎn)單的蜂鳴器驅(qū)動(dòng) [打印本頁]

作者: 落夢(mèng)傷痕    時(shí)間: 2017-2-14 16:46
標(biāo)題: 51簡(jiǎn)單的蜂鳴器驅(qū)動(dòng)
/*
*******************************************************************************
*                     《手把手教你學(xué)51單片機(jī)(C語言版)》
*                    配套 KST-51 單片機(jī)開發(fā)板 示例源代碼
*
*         (c) 版權(quán)所有 2014 金沙灘工作室/清華大學(xué)出版社 保留所有權(quán)利
*
* 文件名:main.c
* 描  述:第9章 蜂鳴器驅(qū)動(dòng)的基礎(chǔ)示例
* 版本號(hào):v1.0.0
* 備  注:詳情見第9章9.4節(jié)
*******************************************************************************
*/

#include <reg52.h>

sbit BUZZ = P1^6;  //蜂鳴器控制引腳
unsigned char T0RH = 0;  //T0重載值的高字節(jié)
unsigned char T0RL = 0;  //T0重載值的低字節(jié)

void OpenBuzz(unsigned int frequ);
void StopBuzz();

void main()
{
    unsigned int i;

    TMOD = 0x01;  //配置T0工作在模式1,但先不啟動(dòng)
    EA = 1;       //使能全局中斷

    while (1)
    {
        OpenBuzz(4000);          //以4KHz的頻率啟動(dòng)蜂鳴器
        for (i=0; i<40000; i++);
        StopBuzz();              //停止蜂鳴器
        for (i=0; i<40000; i++);
        OpenBuzz(1000);          //以1KHz的頻率啟動(dòng)蜂鳴器
        for (i=0; i<40000; i++);
        StopBuzz();              //停止蜂鳴器
        for (i=0; i<40000; i++);
    }
}
/* 蜂鳴器啟動(dòng)函數(shù),frequ-工作頻率 */
void OpenBuzz(unsigned int frequ)
{
    unsigned int reload;    //計(jì)算所需的定時(shí)器重載值

    reload = 65536 - (11059200/12)/(frequ*2);  //由給定頻率計(jì)算定時(shí)器重載值
    T0RH = (unsigned char)(reload >> 8);  //16位重載值分解為高低兩個(gè)字節(jié)
    T0RL = (unsigned char)reload;
    TH0  = 0xFF;  //設(shè)定一個(gè)接近溢出的初值,以使定時(shí)器馬上投入工作
    TL0  = 0xFE;
    ET0  = 1;     //使能T0中斷
    TR0  = 1;     //啟動(dòng)T0
}
/* 蜂鳴器停止函數(shù) */
void StopBuzz()
{
    ET0 = 0;   //禁用T0中斷
    TR0 = 0;   //停止T0
}
/* T0中斷服務(wù)函數(shù),用于控制蜂鳴器發(fā)聲 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH;   //重新加載重載值
    TL0 = T0RL;
    BUZZ = ~BUZZ; //反轉(zhuǎn)蜂鳴器控制電平
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1