|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动; y% x k$ h" F( D
5 i' H, a; T1 U9 e
0 M! H, V- U8 D* B4 |0 v/ {, h/*0 z% K/ u1 e B- @! u7 X7 \0 O
*******************************************************************************
% b- a0 Q4 O3 v Q. b* 《手把手教你学51单片机(C语言版)》
) n- N* U X% N6 g* l* 配套 KST-51 单片机开发板 示例源代码3 B1 ^0 |/ }! F0 V7 Y
*
, F/ l- `& d7 S$ I% _0 }* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利5 [5 m% `* T2 j' z+ ~$ j0 U. z' Y7 Q
*% Q2 ?/ k' F9 k/ `
* 文件名:main.c7 m3 ^8 q- c4 C T* G- U% u! c! y
* 描 述:第9章 蜂鸣器驱动的基础示例" x2 }* @9 L; _( E( { {- e
* 版本号:v1.0.0& p9 s* ~! G( L- X2 ^+ e
* 备 注:详情见第9章9.4节: _; a: ^9 ?' Z. S1 ?$ |
*******************************************************************************
- @9 X" S* Z& ^*/- d5 x2 s4 l5 Z8 F6 N3 A
! \1 ~/ l+ i& S
#include <reg52.h>
2 R+ C, m' i# f4 q7 m
, ~% m, M6 `0 }( v! \; ?: r4 _" @sbit BUZZ = P1^6; //蜂鸣器控制引脚
5 j7 d, n& g4 y) runsigned char T0RH = 0; //T0重载值的高字节
. h+ T9 j- H! Punsigned char T0RL = 0; //T0重载值的低字节
7 i( ^+ q' f0 M z: @6 U; B: ]7 m/ L$ _+ s
void OpenBuzz(unsigned int frequ);
0 H: m9 P* j% T, ^5 h* Cvoid StopBuzz();
2 X! W; g9 }% [- I+ |7 l
6 s! i. r/ a$ ^ d9 Uvoid main()) y$ U, C: x# |
{& ?7 i4 T Y3 R3 E
unsigned int i;
0 B. m! `& E, w& Q8 A# V l8 i [3 Q/ G. W
TMOD = 0x01; //配置T0工作在模式1,但先不启动& q( ?" u/ D0 P# Y
EA = 1; //使能全局中断( u8 b" \8 i+ I. C( A2 O! K7 M
. S4 A1 o' {6 ?
while (1)
/ L& T, ^% B7 O. S* R {- @( D. R$ w0 B- G5 ?2 n
OpenBuzz(4000); //以4KHz的频率启动蜂鸣器
G6 }8 }( n& Y! @5 H for (i=0; i<40000; i++);3 g3 n' ~. d3 V, P& M% X6 |: }
StopBuzz(); //停止蜂鸣器
8 G: `7 t; X6 ~+ Q$ ~( t: n v6 a for (i=0; i<40000; i++);3 F1 p7 `; q7 ^ e7 o: }* w
OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
& I. l; k4 R# q6 p1 B: x" d9 N P for (i=0; i<40000; i++);
) J! N& S! o% m% v. r3 ~5 Q, } StopBuzz(); //停止蜂鸣器
" e$ h# u! }& k. b, i for (i=0; i<40000; i++);
: h8 R2 C+ H9 p1 Y' d; i: Y. A }7 W6 Z- O. Q2 u0 M9 a0 U
}4 X: {: G) G0 k; w+ y2 h
/* 蜂鸣器启动函数,frequ-工作频率 */
6 F0 Y' _3 q9 u# o) t) ?4 qvoid OpenBuzz(unsigned int frequ)- `0 ^5 L* t7 T
{
* H: u$ ?; V d+ o- u unsigned int reload; //计算所需的定时器重载值1 J& @ a$ f- r& O" ]
}, ]' L7 u& E6 }0 R; `. b1 c
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值5 K2 U g+ L2 `- X: D; s4 ?
T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节7 G# t, ]6 L C( q8 ?/ y
T0RL = (unsigned char)reload;$ R' w/ D0 ~' L! a
TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作" H- N7 K1 ?5 m/ D c- L
TL0 = 0xFE;
$ p4 P5 Y& [" }: E3 R ET0 = 1; //使能T0中断. w9 U! ^% j5 O' j; E& N0 S4 A
TR0 = 1; //启动T0# u) X( F j3 e9 ]- x9 c$ c4 l8 ]
}: L* n6 j6 P" N5 C* k& U8 V( J
/* 蜂鸣器停止函数 */
; z, ~. m" C$ E* Xvoid StopBuzz()% H: F' C+ Z1 E3 Y
{
$ a$ K# s: H' {9 Y9 C2 n ET0 = 0; //禁用T0中断* ~$ ^8 P9 M* Y7 ]
TR0 = 0; //停止T0 x2 @ h! q! L; M: W1 O/ d
}
* c, Y1 J/ g' @" f! Y3 |/* T0中断服务函数,用于控制蜂鸣器发声 */. H: T; S+ Y5 ^' e0 g7 e
void InterruptTimer0() interrupt 1
) H7 ?3 s5 e5 h' n0 b# G0 J{5 e, z8 z2 `" E' m
TH0 = T0RH; //重新加载重载值8 B" q0 |+ O, r- u" s- k: i# @
TL0 = T0RL;1 F; u& V, m" G9 }& M; b$ @* a5 D
BUZZ = ~BUZZ; //反转蜂鸣器控制电平
6 ?! V2 e' d! F" G. H}
7 S5 `. f2 ^9 P" }6 y0 L: E |
|