|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动& P5 [, V8 }& n: s9 N
1 ~1 B8 x$ U2 I8 r. B) W1 R
' p- w$ R- F% d' ~( n* v
/*
1 U9 W- E$ g( X9 Y7 ?3 q. s4 @ H3 @*******************************************************************************
9 J Q, ^0 r. i8 ~- R* 《手把手教你学51单片机(C语言版)》
- n, A) @" `$ s2 l( j1 D2 R: I# e* 配套 KST-51 单片机开发板 示例源代码
' L- q6 q7 ]% n; a+ k*' J6 M5 a2 R( ]: ^" g
* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利; X0 s7 Q. A: o7 E
*
. |2 G# _' Z# ]' V$ i- R* 文件名:main.c
2 M- w8 l0 q4 l: [* 描 述:第9章 蜂鸣器驱动的基础示例
, Z$ Y ^7 z2 ^7 i2 l2 ]* 版本号:v1.0.0
& s/ s! B/ M# V5 J g: |* 备 注:详情见第9章9.4节$ C) [" D2 q, |% q5 Z7 P
*******************************************************************************0 a/ @2 N9 z) s4 ^( [1 X* Z0 |" }: X
*/5 n# C, c/ d9 p! @/ C
- ^5 t: _- m' o6 x# e6 {#include <reg52.h>" F' A5 e8 ]# U3 _) B0 F) l1 }
K+ y* n+ U- ?sbit BUZZ = P1^6; //蜂鸣器控制引脚
8 D2 a) K; n$ r1 munsigned char T0RH = 0; //T0重载值的高字节7 B1 `- w6 P: o3 ~+ o
unsigned char T0RL = 0; //T0重载值的低字节
1 v7 O( l7 x7 U" Z- J' ]: g) f" H3 A, U
void OpenBuzz(unsigned int frequ);- W1 c) i( ^1 W, I) U" l' m
void StopBuzz();( M5 f" d% i D6 M/ T* J! A1 O: h1 q
5 `) g/ s/ `6 B7 v! R
void main()" L, t' G. C6 p& n- u9 b* _; t! O7 k
{
U" Y$ I; Q& \. f }; j6 F! _8 q unsigned int i;
0 }; v1 M' c0 q% V
8 i% X1 S% ^. Z. }) K% X TMOD = 0x01; //配置T0工作在模式1,但先不启动
9 v) Q# C. O4 c' P0 k, L EA = 1; //使能全局中断9 J% J9 [& t& F
( P1 h" k9 s& P! n8 x$ l while (1); `' U& ~4 }# K& G6 x# a4 W# n* ]
{
; M8 a* A$ g& ?1 e- o6 f OpenBuzz(4000); //以4KHz的频率启动蜂鸣器
# K/ R: f4 w5 b, | for (i=0; i<40000; i++);( |0 F/ D; d3 ^% B4 u0 O2 b1 a
StopBuzz(); //停止蜂鸣器
! T$ a7 X& \) G. i% z; a for (i=0; i<40000; i++);
! ?/ N: t: o2 } OpenBuzz(1000); //以1KHz的频率启动蜂鸣器% I0 `8 |- @/ Q% J. l. Z' y5 Q
for (i=0; i<40000; i++);( w; A+ E, \3 s% K
StopBuzz(); //停止蜂鸣器' R( F9 {" w& @' k$ ^0 |
for (i=0; i<40000; i++);
1 y: u$ l# \! _6 i8 x4 ] }
, P" q+ |( E! g& _& N}
5 v5 n$ l* H* N3 [! c( Z# T/* 蜂鸣器启动函数,frequ-工作频率 */3 F: w% v E/ ]( y( c
void OpenBuzz(unsigned int frequ)# t0 M5 l' m3 K, l" F t7 x! O
{+ u3 v: j; f Q$ A6 [; B7 w" v
unsigned int reload; //计算所需的定时器重载值
5 c4 D! Q8 G3 [9 M K# b2 E$ \& u# |% r* V
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值9 E+ ` `$ O- S( I. B( Y& h) O
T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节
1 Z8 M c6 y- o3 ` T0RL = (unsigned char)reload;6 N- K+ A: }/ b3 ^3 s
TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
* Y$ l, {& o. F' I TL0 = 0xFE;2 Y4 z- h9 O) l# ]; H
ET0 = 1; //使能T0中断1 Z2 ]5 O. b6 q5 k8 f& ~9 U) ]
TR0 = 1; //启动T0% G0 u1 E, U4 H' y
}
8 V) g4 x R y, ?2 Z" s/* 蜂鸣器停止函数 */
9 y' d- ]% H( U; i/ e fvoid StopBuzz()
- y! q+ S: \# @3 u4 f- A; O{' X* j4 @' h8 v% `! X4 u9 B R
ET0 = 0; //禁用T0中断0 q. Z$ f! J+ i4 u% ~: w
TR0 = 0; //停止T05 F- }5 `& L& S$ G+ a5 I
}
% A# ]0 J* ~; n7 U/* T0中断服务函数,用于控制蜂鸣器发声 */" Z* g7 q) a) e& W0 R- g
void InterruptTimer0() interrupt 16 s: j, _0 K3 V- X# a. e' U
{
% \1 y7 h& D; n$ w+ E; N TH0 = T0RH; //重新加载重载值/ m( T/ d0 K1 @ O
TL0 = T0RL;- ] f O- @8 `, o+ A( f7 M+ O& D
BUZZ = ~BUZZ; //反转蜂鸣器控制电平$ q' e: N! p( B; x! t1 T3 A
}
5 P+ B+ y$ Y& R# U |
|