|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动: D' r1 ~, H% ~2 p# X; v
. q. e4 r( J3 w1 {6 A
+ m0 X! O4 c, D# A) c! \# Q
/*
8 E; e4 v3 x u* q- i1 V6 h*******************************************************************************
" j; N1 L8 Z+ m+ D* h* 《手把手教你学51单片机(C语言版)》
6 t# T+ C; L$ ~% u( e3 x* 配套 KST-51 单片机开发板 示例源代码1 J8 s- H! D7 O9 T% l; w0 G1 x
*
4 L+ }, |0 I) ^/ T2 R! Y* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
/ G3 p' H8 B+ W. P" I( {9 t*9 h) y0 s. g# o6 \7 P* d/ {7 d* Q
* 文件名:main.c7 o- {5 d. x% n+ v; A7 z- Q* ?
* 描 述:第9章 蜂鸣器驱动的基础示例
( z% ]4 ~. m) @0 g* 版本号:v1.0.0! o# I$ E0 ?+ M ?' M# `# Q4 ?8 K+ a
* 备 注:详情见第9章9.4节
' a& D/ p) `" Y*******************************************************************************
8 I/ P% e) z! p*/
) W+ _% M6 M7 l; h
" w( |4 Y1 u: N% C#include <reg52.h>- g. k& L( W6 \/ z/ a$ w. O" ?
( V9 ?" T7 b2 j& N9 v+ u
sbit BUZZ = P1^6; //蜂鸣器控制引脚5 f% g. V! G$ r+ ^5 u8 i6 Z
unsigned char T0RH = 0; //T0重载值的高字节
- Y( r+ Z5 z4 a6 S7 h0 u1 g& G Funsigned char T0RL = 0; //T0重载值的低字节4 l) d9 f: ^4 Q) e4 a) |
2 {* b; V* g, f! F/ X6 ^; z( Ivoid OpenBuzz(unsigned int frequ);
% ]8 ^5 B) D% @void StopBuzz();
' t0 A4 K( ?5 d1 D: _3 Y% D5 J, a" r/ `& [& U: Q+ G
void main(); A& t! m P5 Z3 C/ \
{
. _) g2 Y' J' g- o+ z2 v unsigned int i;$ H/ H8 Z; q O' T5 g& v
1 S. w! p; K: z+ q
TMOD = 0x01; //配置T0工作在模式1,但先不启动
& D9 x! U4 ]: p$ c( X EA = 1; //使能全局中断( j1 `- Q7 w: x. [* _9 W
5 @9 c, x1 r8 l9 j" c2 k+ w& S while (1)
" s( O; C8 u0 e1 V7 u" N {
: Q1 ^7 s4 J- S. h) h7 z" u1 K OpenBuzz(4000); //以4KHz的频率启动蜂鸣器) }! i# d3 B, t5 S! g
for (i=0; i<40000; i++);) ^: v/ ^6 m# `4 l& ?. y
StopBuzz(); //停止蜂鸣器
4 P) K1 L; q: W for (i=0; i<40000; i++);
. n# S+ s+ T! Z; m2 _* V; ] OpenBuzz(1000); //以1KHz的频率启动蜂鸣器+ }: ]5 X1 b( s' Y& N' b6 s6 D! I
for (i=0; i<40000; i++);
/ y# ]. i8 A7 g. K* K StopBuzz(); //停止蜂鸣器& X8 Z' Y. ], @
for (i=0; i<40000; i++);- ?3 X( Y' o+ f% i: c
}
2 H5 _% H! d: m9 H7 x}
8 Z7 ?) y6 G! s$ P# \7 h/* 蜂鸣器启动函数,frequ-工作频率 */
, n: Y: V" `/ K& V* _5 S* w' gvoid OpenBuzz(unsigned int frequ)
% h* `# H& p8 j0 f{9 Y3 O7 _! _0 Y& X* w% }
unsigned int reload; //计算所需的定时器重载值' O! h. W+ Y! s! h, M. ?
, S% e" \& ?7 E2 C
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值* V. E: o( r8 m' Z- w- ?5 T
T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节
1 o+ g4 L+ I0 t9 P9 l! c T0RL = (unsigned char)reload;% M: o( ]$ b5 `" G+ |& O
TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
' o E0 o$ H0 ?* C- s! B8 J( h TL0 = 0xFE;5 g* _( [% l0 V6 I" s l: A
ET0 = 1; //使能T0中断* t3 S! l% @) K# q7 v
TR0 = 1; //启动T0
! p& N+ M% ^& z8 Q2 _$ b}
1 ^# ~/ F: O9 U) f4 D$ f% E/* 蜂鸣器停止函数 */
8 _% a. H: A' s$ m5 K! R# T Tvoid StopBuzz()
3 I( D4 `. r) F+ R5 v{+ X. n U6 C2 P# y
ET0 = 0; //禁用T0中断
% Z9 L5 u( B% f TR0 = 0; //停止T0" T: e5 T6 Y. n3 |% ]
}
7 h! N' U$ C) o/* T0中断服务函数,用于控制蜂鸣器发声 */2 D! f' D# c2 Y# n$ R
void InterruptTimer0() interrupt 1! b2 Q5 C% Y, Q( m
{- x) z6 M Z! @% O4 U1 M
TH0 = T0RH; //重新加载重载值! a4 O3 ]9 f a0 b1 I
TL0 = T0RL;+ y5 I5 X$ D8 @4 `0 Z" b
BUZZ = ~BUZZ; //反转蜂鸣器控制电平* z% l1 a- R7 i& y4 h( q4 C/ y0 v" |0 b
}
- @5 D8 S1 k/ i9 ?' x* O& I" \( m- { |
|