找回密码
 注册
关于网站域名变更的通知
查看: 502|回复: 1
打印 上一主题 下一主题

51简单的蜂鸣器驱动

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-14 06:30 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表