|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51简单的蜂鸣器驱动, H: I/ B( i) Q5 b+ J0 z9 e1 z
3 z3 T4 ]% F( V& D& O; A- G
3 x! W% Q% q* X/*
) b9 A% }( X5 [* O( n S" Q- U, M*******************************************************************************1 T1 {( ^9 S! x
* 《手把手教你学51单片机(C语言版)》8 d$ I5 K! e+ `$ M* Q" d
* 配套 KST-51 单片机开发板 示例源代码: c; b/ k# p) J" _7 {+ O2 e$ @
*
! W. j6 P& f1 o3 a7 b- l8 |& S* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
5 b- G# J5 b3 I$ n8 \+ Z*; D" D& B, k. A1 |5 K, Y! r
* 文件名:main.c
# Y0 q, f& w8 D+ K9 ~2 N+ m( J* 描 述:第9章 蜂鸣器驱动的基础示例
) r v" @1 g K4 D W, _* 版本号:v1.0.0
! ^: B' a3 Q1 l- I# J6 ?* 备 注:详情见第9章9.4节3 H# d) V! l1 F6 l; K
*******************************************************************************1 y4 C& C9 B2 t) v4 S
*/
, C" ~- X( ] o. ^* X2 e3 {5 n: l) k/ Y2 B* H' z
#include <reg52.h>2 P2 ^6 s, ]4 X: `6 s
7 }) c% \0 v Csbit BUZZ = P1^6; //蜂鸣器控制引脚7 v' \) ^# z6 m! r* ?
unsigned char T0RH = 0; //T0重载值的高字节
3 I6 U0 c* R8 y7 I3 Nunsigned char T0RL = 0; //T0重载值的低字节5 E! d3 J3 C) o3 R8 A3 f0 D: Q5 x
) K- I( F/ I% O2 C: X
void OpenBuzz(unsigned int frequ);" E7 K" ^, {5 {0 H* I
void StopBuzz();
$ |/ H* y; `3 L3 [: j2 y+ r% U4 V. ?+ I% Y
void main()0 }* H* C7 \( r/ R& s
{0 z1 _; @" i( B3 `! B) e3 Y
unsigned int i;& d, Z: v0 M) A( ^% x& t
8 l+ t# V. T/ j; B0 X. ]5 J8 [ TMOD = 0x01; //配置T0工作在模式1,但先不启动
2 |2 t- P. ?( \ EA = 1; //使能全局中断
- y! b% K6 O/ k. @0 Q* c! e f/ q) E5 u% @* }6 H
while (1)3 b* ?" c b, H$ H, M4 a& Z& R% c
{. o% D1 w6 Y' d5 s
OpenBuzz(4000); //以4KHz的频率启动蜂鸣器6 A+ m1 D$ e3 q
for (i=0; i<40000; i++);
( J7 T- [! J/ A StopBuzz(); //停止蜂鸣器' _) k' h! B0 G1 K
for (i=0; i<40000; i++);' `0 h' j- O/ I6 c% q. x
OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
3 ]5 Y8 r( @! P for (i=0; i<40000; i++);3 u! v2 H g! F" ]3 H$ ?
StopBuzz(); //停止蜂鸣器
- s: e9 A4 S* Y% ?' c( | for (i=0; i<40000; i++);( X# P3 q" |) q% ~$ `$ `# M
}' e$ W$ z" p; w" Z+ P- @$ z6 C
}. ~ g6 K" L0 f2 |: m' B1 `
/* 蜂鸣器启动函数,frequ-工作频率 *// U' z& l. _* z4 f, u- H( s
void OpenBuzz(unsigned int frequ)& @. Q4 i0 E4 @+ n
{8 c# W1 J6 H" s2 [0 z$ K
unsigned int reload; //计算所需的定时器重载值! |7 t# @9 ?8 U \4 j1 Z
/ [& [6 e* Z5 c! Z3 R/ G
reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
# M [; N* u+ ]" ~5 K3 M$ P T0RH = (unsigned char)(reload >> 8); //16位重载值分解为高低两个字节7 ?) Z; p# U$ r3 \$ _9 K
T0RL = (unsigned char)reload;
6 n6 k4 d" y& S0 E7 M. P: z TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作9 b8 y7 o. B1 k6 i0 H* i
TL0 = 0xFE;1 @) \7 }9 a6 F' r# ?6 X, Y. X
ET0 = 1; //使能T0中断
! _/ z9 `' n! X( x; X. r) g TR0 = 1; //启动T0. M8 }4 W( J5 L: Y4 h
}7 S& k: B8 d) c$ J* x( g
/* 蜂鸣器停止函数 */1 e5 y- H. z; g& t3 o' s
void StopBuzz(), I0 ^ e- W) ]& {: I1 w5 N7 G9 b i
{( @- V- |+ d. N/ x
ET0 = 0; //禁用T0中断7 c% ?/ l7 E' x X# B) h& e
TR0 = 0; //停止T0
) I! l) M7 p' H' K}; V. e1 o) G1 v
/* T0中断服务函数,用于控制蜂鸣器发声 */; p# G, b4 O6 t
void InterruptTimer0() interrupt 16 |) {: [9 {! X4 {& f) U. ]" i
{
7 ~ g2 z, g( r' g( @! K( P2 l TH0 = T0RH; //重新加载重载值
% O4 a0 n0 |* I0 I3 j TL0 = T0RL;
, e/ _9 ] V: ~% _" g1 Q1 U BUZZ = ~BUZZ; //反转蜂鸣器控制电平
% k' T8 t. g$ v}
, v1 p/ V, w7 H$ G- p2 W, B |
|