|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动3 R) U* p1 K; N3 {
) u, w- G; r! |; W. K
8 A3 ~# P2 A( o
/*5 e# s' L' _ i9 C5 I( x: {
*******************************************************************************$ r d x3 A+ r4 B; r; v0 m v
* 《手把手教你学51单片机(C语言版)》! I. s' R8 M' S" T4 Z9 I2 B& ?8 P
* 配套 KST-51 单片机开发板 示例源代码; K$ ~/ F) `4 H. ]; @) @4 Y
*$ l( L0 F) r1 _. Q( U
* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利% U$ J2 F2 _, o k; W; }# r/ [% l T
*
8 ~9 _- t) n: Y. `$ B0 b* 文件名:main.c4 d% N6 B A6 F
* 描 述:第9章 蜂鸣器驱动的基础示例
- T) x. n7 e3 V, S @* 版本号:v1.0.0
/ e; ^" T& i3 h' L: b6 x2 p* 备 注:详情见第9章9.4节" s- w$ ]0 A) q. J1 u, @0 i
*******************************************************************************
# Y9 b: n+ j0 g1 L; U*/
; J" D2 s; _# ]' a% E) m4 U) ^& j# X7 J4 p, r
#include <reg52.h>
' S( ?" e* E5 m8 Y2 ^
7 p0 ^8 b7 W* S, s4 J6 Msbit BUZZ = P1^6; //蜂鸣器控制引脚
) N, S6 R# t6 `$ ~' }; |+ bunsigned char T0RH = 0; //T0重载值的高字节- d% r: |% ]0 j) f& \! R( o: U
unsigned char T0RL = 0; //T0重载值的低字节
3 Q8 T" u/ A& { R2 h0 \& N# y% c& N! m' h# ~0 ?
void OpenBuzz(unsigned int frequ);% | }+ L% C3 T5 e% y& K6 E |
void StopBuzz();
1 X. p1 N/ S/ I6 ~8 L5 R9 F
7 v6 d' }0 T, U# t7 qvoid main()) o! a+ a8 G, z# m
{
4 h/ Z$ B2 {2 W% x/ A unsigned int i;4 P$ a! u+ d2 ]5 `4 i6 I
, A1 `- P3 g. k6 [+ V
TMOD = 0x01; //配置T0工作在模式1,但先不启动5 n' r9 i0 w, V# I1 i
EA = 1; //使能全局中断8 S5 k9 k: r# B
' w! P/ j- j0 w4 Z
while (1)+ r0 j+ Z1 f* f7 y: b5 H' @6 u+ A
{ w+ Q6 c. q& C0 E& R; L
OpenBuzz(4000); //以4KHz的频率启动蜂鸣器1 z3 V( T5 X* d0 }0 z, V; |
for (i=0; i<40000; i++);# ^% a$ W7 B1 R# u' [0 m' P4 B
StopBuzz(); //停止蜂鸣器
# v* S3 i, D5 U" x4 d! z for (i=0; i<40000; i++);+ o0 u( _$ P; `+ V8 a% O
OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
8 _2 n+ U/ O1 ~& P for (i=0; i<40000; i++);1 d$ F0 [9 V1 g$ |
StopBuzz(); //停止蜂鸣器
" Q- {7 [: S1 D/ t for (i=0; i<40000; i++);- o" n2 d( G$ T
}5 {# `# {1 ~: j% E y- r; F
}' x+ V8 P8 ?- Q7 e$ o
/* 蜂鸣器启动函数,frequ-工作频率 */# k2 m2 ]4 ^8 Z& T N
void OpenBuzz(unsigned int frequ)
7 u: ]6 v$ H5 G( j( a- g) [6 s( @{- r) f5 s2 K5 S$ U- }
unsigned int reload; //计算所需的定时器重载值2 u- Z9 P4 n, A4 o; l" T* z
- `. e. |% x: G" e. E8 r7 N
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值0 r8 i6 O. @8 q' y' A, w
T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节
# G; h+ ~9 d6 B! _/ J& }, G7 [ T0RL = (unsigned char)reload;& u* G8 ]- d+ y6 T
TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作& {: Y- X6 _" m1 L$ @2 k Q
TL0 = 0xFE;% F4 ?, o8 p! G2 v+ m/ v- n0 N
ET0 = 1; //使能T0中断
. X, h) Q% E( G- X2 }. u) S TR0 = 1; //启动T0
6 m/ @6 c! j4 Q' ~& D3 `, Z}- P- f: p* ~ M% E, Q
/* 蜂鸣器停止函数 */
2 @9 X/ {% I9 i+ D$ }- @$ D, r, d* Hvoid StopBuzz()
& N4 u1 M# T, f$ g7 [4 V$ V5 @# w{3 P$ r! [' X) M3 l7 q; J, M P
ET0 = 0; //禁用T0中断
) b' u5 d$ }1 E- V8 O/ r( y: ] TR0 = 0; //停止T0
& }, L% L- w5 G( s( \' f$ w}+ ?2 i: e* c, d% E$ I. P3 a) Q8 |+ S
/* T0中断服务函数,用于控制蜂鸣器发声 */9 h1 [8 N' b' G- d5 \/ ?1 i
void InterruptTimer0() interrupt 1
. [- d- T6 N$ U{
( }/ o( L7 }9 k4 M; D TH0 = T0RH; //重新加载重载值
) R7 ^8 W2 C/ a6 B7 m" p TL0 = T0RL;
/ W6 o. t1 J: A$ t) f0 A BUZZ = ~BUZZ; //反转蜂鸣器控制电平
. o2 Z3 w" r4 Q& D" `: Z* q' A}
" J) p3 i% ?1 ?2 z/ l6 z |
|