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

51简单的蜂鸣器驱动

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 04:23 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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