|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动
7 O1 i. q7 H! k. ^9 t: _! j! V2 q7 L/ o4 G: q
3 \$ c7 n" J6 B3 I9 J" l( U6 E
/*$ ^! M& V {5 i( [9 a
*******************************************************************************
: s+ x* t, e/ g' _+ r* 《手把手教你学51单片机(C语言版)》+ b+ T7 o6 x5 T& p% o0 h
* 配套 KST-51 单片机开发板 示例源代码
5 ?8 i& q6 Z' ~* P- u5 {*
: |$ t3 V+ h; N4 [* ?9 m* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利0 l9 b1 T- R6 t8 [
*
' q; C% J$ z& ^) w2 j* 文件名:main.c
2 a4 u* V% j1 o9 n4 E9 P/ q8 i* 描 述:第9章 蜂鸣器驱动的基础示例
+ g" J& B" V, E, F! A/ |* 版本号:v1.0.03 D* d* A) _4 l' ?
* 备 注:详情见第9章9.4节- f% S0 [" G* ~6 i' K! r$ z
*******************************************************************************. [& \7 a/ C- K0 n
*/
; T- s$ K' ?* _' V: G, E7 n/ W' N% q% g
# Y3 G( e, P: F2 b#include <reg52.h>5 v7 H# I1 v1 A; i: {
* X4 D( o5 M- R' \3 X! w( Psbit BUZZ = P1^6; //蜂鸣器控制引脚
. v& f# O% q3 H" J$ L: g1 q ?' {unsigned char T0RH = 0; //T0重载值的高字节
, `& l7 D$ W S4 W5 ounsigned char T0RL = 0; //T0重载值的低字节
! G3 U5 U* Y5 O: n
3 c3 K! j7 m& K6 i/ Y) Xvoid OpenBuzz(unsigned int frequ);
4 N% `! d/ R! U2 g$ g! x, Gvoid StopBuzz();
4 ?1 ~, Y0 \: V% f! ]3 F! j
0 f; R0 Q8 ^5 e8 P7 e4 ?/ Avoid main()
* l# C+ G m: `! I& K3 n( \7 l{
4 ^5 f1 ?3 t, K: l4 c2 ~- k unsigned int i;
. {) _1 S7 K; N9 w- p) z2 z* j' l# J/ E7 k; U& P! s K
TMOD = 0x01; //配置T0工作在模式1,但先不启动
* H& x; \. G0 d EA = 1; //使能全局中断1 J2 o6 u ]* o6 Z! e" A
: k& I4 E! n$ n6 ?/ [3 ` while (1)" b [- n7 d- J3 `
{
' R3 k% V. b# z; ]7 C9 V OpenBuzz(4000); //以4KHz的频率启动蜂鸣器
) b. W5 L: `- r1 U! V+ z2 K for (i=0; i<40000; i++);/ z& T8 G" {) J, z3 T1 f
StopBuzz(); //停止蜂鸣器
% t j* J5 P" ^ for (i=0; i<40000; i++);
N+ f# a+ l5 L6 F/ O OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
! x3 w& H j% f6 j" Q" @ for (i=0; i<40000; i++);
% x2 ?" K6 u5 c StopBuzz(); //停止蜂鸣器7 ^. z2 l' S& `
for (i=0; i<40000; i++);
8 P+ j t6 H1 l- [ }; f, u) s& u, l+ }
}
% e a5 S* z* Q1 i f/* 蜂鸣器启动函数,frequ-工作频率 */
! Z4 e" `8 o, Z1 mvoid OpenBuzz(unsigned int frequ)0 D5 W+ O4 M9 M' V# n! d
{
9 K& u1 ]1 ^ x2 j# r' p unsigned int reload; //计算所需的定时器重载值
# I, }% b+ p& B/ U
6 ~0 B3 L" r* b6 t0 f) ?0 `6 K& y3 E reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
* `3 S7 U, s J: g# m0 C; H* { T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节7 m: `6 ?& }! z8 _# r
T0RL = (unsigned char)reload;
7 I. F. |8 t. K5 x6 d0 ] TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作( q) T2 w5 @2 G* t$ I6 l# R
TL0 = 0xFE;5 ?9 x( e0 {" K a( o6 Q) g
ET0 = 1; //使能T0中断 |4 r. d R* W; F6 e2 @6 L' r% R
TR0 = 1; //启动T0
2 ?$ s% @$ C- r- R$ q}6 W9 K0 U1 Y/ A8 f
/* 蜂鸣器停止函数 */
7 {6 D' v5 y# Q$ G6 h j' Gvoid StopBuzz()" d$ u! S3 [ c% }7 p0 e
{9 R0 B2 x2 m. z- A; y9 I* ~' a
ET0 = 0; //禁用T0中断
9 k7 @8 R: [8 I6 |) C8 s* D& @ TR0 = 0; //停止T0
; k- i2 H2 n B F8 t}
5 T; @& v7 s5 I& r; K; }/* T0中断服务函数,用于控制蜂鸣器发声 */
' b1 L0 c- V9 l% {3 C4 Xvoid InterruptTimer0() interrupt 1
- L3 c/ u9 D; u) E{9 C9 }9 k9 ~7 M
TH0 = T0RH; //重新加载重载值% Z8 s% m8 U' r! Y7 f O: p
TL0 = T0RL;
5 X4 l' m" ]) @) T BUZZ = ~BUZZ; //反转蜂鸣器控制电平
/ n8 C) k: p- B7 I" N2 J8 |}
( o# K. g+ U6 k3 |* e |
|