標(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