|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动* |$ k( y, B9 `8 A. B, @
: I6 y* M* T5 h% s+ s' ~' D
$ d" w. k& r) T$ Z+ \7 o ], W/*6 K' O4 P U& Z' Z
*******************************************************************************! u, M2 ?' q% M W! m9 b1 ]
* 《手把手教你学51单片机(C语言版)》
2 j( }* K, r/ \1 s* t+ C* 配套 KST-51 单片机开发板 示例源代码8 D# J3 O5 a$ s1 h4 B
*
! ]" Z* Q; J; B5 B* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利3 B3 d: v, d/ |/ S* o n; a6 P4 _* t
*4 r7 Y* j" ]8 c/ I8 n; X
* 文件名:main.c
5 h. Y5 r3 ^7 t# }* 描 述:第9章 蜂鸣器驱动的基础示例9 z5 D s+ T! ~1 ~8 l2 H* B# ]
* 版本号:v1.0.0
/ w# s% G9 I7 B, q* 备 注:详情见第9章9.4节
! O! Y2 ^) {4 v1 d) Z P*******************************************************************************
" O7 N. I' `. G- [- T! h# D7 c2 e*/8 P( K( Y/ ?' n' e: b
6 F u# c1 v3 s# c% \/ _# y
#include <reg52.h>
& C' R8 _) ?4 k* A1 A4 x8 f9 p# \3 z+ @+ H! c7 n
sbit BUZZ = P1^6; //蜂鸣器控制引脚( l- s! m f" f) l& W5 R
unsigned char T0RH = 0; //T0重载值的高字节7 [. z3 R8 z, j# d* e
unsigned char T0RL = 0; //T0重载值的低字节: ~( A. J7 k. H5 I2 c. |/ ^
7 x- t- [) C1 g! s
void OpenBuzz(unsigned int frequ);: E' a1 W; y" m H: J: B
void StopBuzz();
$ L: E% m* \# a8 [2 K3 z7 q' h5 Q! o! D1 g$ s
void main()
- E& W4 v: t$ t$ X. ?+ ]{# A# q5 A W+ n/ a9 N$ W( F
unsigned int i; Q$ P/ ^! k$ M
9 C; g. b }7 V: T, c: u3 o TMOD = 0x01; //配置T0工作在模式1,但先不启动" L6 F& F1 V/ @! P; {9 X+ q
EA = 1; //使能全局中断$ Z) t; S* v2 a' R3 q0 Y7 t
- d& k% x! D8 ?( U; g1 v
while (1)
* {6 E' _! H& Z" e, G# L! d: F1 f1 A {
# B2 s3 g" x; c1 G OpenBuzz(4000); //以4KHz的频率启动蜂鸣器
+ n6 L! q7 W1 i for (i=0; i<40000; i++);
" z& @6 V$ S! m2 F- u) A StopBuzz(); //停止蜂鸣器
% r0 J% _; l& @, P for (i=0; i<40000; i++);8 u a& m7 c; r2 i) ~- K
OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
$ l8 L) w5 \9 D0 X for (i=0; i<40000; i++);
! p: m3 _1 T: H) R# t) y! K StopBuzz(); //停止蜂鸣器- }" z7 b7 C/ f( ?1 F Q
for (i=0; i<40000; i++);. y$ u( d% v; R! ?
}. \' G& C7 F# ?$ h8 Z
}+ V: ~8 v% w6 r4 h
/* 蜂鸣器启动函数,frequ-工作频率 */
! V3 I& k" C8 q% z: N) @! bvoid OpenBuzz(unsigned int frequ)
4 @$ l6 K' K6 J/ v) c0 m{. l/ p6 \$ u, q- d8 F5 A) ]8 y
unsigned int reload; //计算所需的定时器重载值8 ~% `. n4 E& `; \
& V& m% _4 m- b0 {' S
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值8 Z8 v9 Q' O* F' `0 n9 J; a n
T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节6 C2 U0 X8 w" c+ l Y9 V1 X( S
T0RL = (unsigned char)reload;
+ Z' |/ S1 \4 Z' p1 [ TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作0 V1 r8 n! d2 t M
TL0 = 0xFE;
9 [/ E8 v- D7 n1 v; S6 v6 L. A. g ET0 = 1; //使能T0中断) }* k G Z6 a& p- V; l3 `6 p
TR0 = 1; //启动T0, ?) o1 D: T7 X+ ?( G$ c
}/ a' P x; `2 J4 m* l2 u1 ]# j4 g9 z
/* 蜂鸣器停止函数 */
1 |* M8 S3 [+ g/ f) x# ?void StopBuzz()
' G0 d1 ~7 N9 t& H4 z{, C- p: G7 f* `5 y; M
ET0 = 0; //禁用T0中断' g7 @" q9 s3 ~/ l4 D
TR0 = 0; //停止T0* I4 E- d7 S* `; o
}
& _$ F( ?6 B) A) Z, F/* T0中断服务函数,用于控制蜂鸣器发声 */
; k7 |' t6 n& Q; f8 P5 c8 Avoid InterruptTimer0() interrupt 1
/ \7 F. ?) G+ r( T( ^' Y* @$ _{- H; l5 t- L( X6 `( s1 H
TH0 = T0RH; //重新加载重载值* a: U3 c+ [$ k* j1 }9 c$ h& w) {
TL0 = T0RL;
+ t: b# r& B6 [& q M$ R BUZZ = ~BUZZ; //反转蜂鸣器控制电平
+ \ S l' P% R% v}
. a8 B$ i* H- i. x! L6 x |
|