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

51简单的蜂鸣器驱动

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51简单的蜂鸣器驱动3 ?- S; S3 X$ G/ _
: d( R, r! |/ o) N! B

+ j8 A# j2 ]2 J: d/*% Y+ P( W, t& C9 Y9 E% r
*******************************************************************************% {3 V0 Z8 P, g- ]
*                     《手把手教你学51单片机(C语言版)》
% a5 |  w. u8 W1 ~' q- Y0 u5 P3 q*                    配套 KST-51 单片机开发板 示例源代码: G+ ^4 L7 y5 a# p+ m' M4 G
*
) i# O1 v9 B- r*         (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
0 E/ E1 u8 j# H& ]" c*8 w: s8 h% B+ T+ C# |5 J
* 文件名:main.c; g) U6 U" J4 E4 ^
* 描  述:第9章 蜂鸣器驱动的基础示例
- N% J+ ]. ?# ^% e* 版本号:v1.0.0
1 \$ p. z( a+ N! a2 p* 备  注:详情见第9章9.4节
5 U: f' U& |4 O* E9 Y! `*******************************************************************************5 |. `3 P; k, _2 R. Y
*/
! T" l7 N9 ]& P- D* v  z  _# {
, G( X, |* H9 D$ u) i7 z7 z#include <reg52.h>
* s! }3 \0 w. P4 P4 O+ h
7 b. V! g( j. |- h3 Usbit BUZZ = P1^6;  //蜂鸣器控制引脚9 C% x; X+ _) ?( p" Y
unsigned char T0RH = 0;  //T0重载值的高字节4 y5 Q" Y9 W% h
unsigned char T0RL = 0;  //T0重载值的低字节
! {; o3 a6 M- i# c" o. q: D7 d; B* F5 q2 c9 h; w8 U# e: l
void OpenBuzz(unsigned int frequ);
2 i! V6 Q" L: k, fvoid StopBuzz();5 S6 l/ A( @6 B, `! J& R

; _1 T) w  I& N( p2 @6 Gvoid main()
  f' @7 U+ r' ?# J2 r{
7 E+ n8 M; _. ?" \    unsigned int i;
/ B. p/ m$ Y7 S- m4 X3 x9 ~. ~5 X+ k5 h2 u" V
    TMOD = 0x01;  //配置T0工作在模式1,但先不启动
) ^( T3 C5 E# {- v' \! ~    EA = 1;       //使能全局中断! q3 w" z4 F+ A3 r- }

% X' {% g. s$ _  `& p    while (1)
9 a0 t- L6 g. I; k    {
: l, P; u6 M6 E, {        OpenBuzz(4000);          //以4KHz的频率启动蜂鸣器% g( R! p8 @8 l7 ^" j' i
        for (i=0; i<40000; i++);
- }0 [, Q. N' \5 z. ?& |        StopBuzz();              //停止蜂鸣器$ h4 `$ a7 S: t7 O  C
        for (i=0; i<40000; i++);! a0 q0 q! }+ j6 B- H
        OpenBuzz(1000);          //以1KHz的频率启动蜂鸣器, A) r% W7 a" V' {% e
        for (i=0; i<40000; i++);( z' d8 t& }. l' S( y* k0 s
        StopBuzz();              //停止蜂鸣器# }, q; t$ s2 Y$ g
        for (i=0; i<40000; i++);  `( {7 L! `9 j  S6 o0 Q# l
    }
5 A3 n6 v8 Z  C$ |- l}9 F/ M) J9 W' ]
/* 蜂鸣器启动函数,frequ-工作频率 */+ ?0 ?+ T2 L# j
void OpenBuzz(unsigned int frequ)
+ {0 y( S# A# ?$ i  r{
2 j; I0 ~8 T, S& u0 M1 ?    unsigned int reload;    //计算所需的定时器重载值6 G4 s" f$ k  s9 I( A5 }/ `

7 n) ~# `2 c; G7 A! @    reload = 65536 - (11059200/12)/(frequ*2);  //由给定频率计算定时器重载值
$ w  _$ V# r! T: K/ [/ @6 R  V1 p    T0RH = (unsigned char)(reload >> 8);  //16位重载值分解为高低两个字节
6 {8 G6 t& \/ w. L4 R1 s    T0RL = (unsigned char)reload;
. M7 e) T8 B; c0 C; d2 g    TH0  = 0xFF;  //设定一个接近溢出的初值,以使定时器马上投入工作( m! A# [) P& J* b
    TL0  = 0xFE;; M* G) j( i, r( v0 e. c
    ET0  = 1;     //使能T0中断2 D% x  h9 g- q& v& s% s
    TR0  = 1;     //启动T01 s* J4 D- U" j( h* [! ^% v( y/ l
}
! |4 j% r* u8 w# z' e+ s/* 蜂鸣器停止函数 */# s% A2 ^( c8 O
void StopBuzz()+ h0 W5 O0 G( }$ T* T) v
{9 i* T" P  |3 G  g& @1 v) P  q
    ET0 = 0;   //禁用T0中断; K' W6 n* R) Z) U* \
    TR0 = 0;   //停止T0, \. v( F/ ]2 Q4 Q
}
2 c- }' j* q5 d/* T0中断服务函数,用于控制蜂鸣器发声 */) q4 Q; a8 \1 P
void InterruptTimer0() interrupt 1
/ s% M  b+ R1 R# |{
8 y- L: }, }0 g7 I) F8 x    TH0 = T0RH;   //重新加载重载值
1 ^# Y! \/ d, D+ M6 n* M    TL0 = T0RL;. T# e, R% r; o" m
    BUZZ = ~BUZZ; //反转蜂鸣器控制电平$ ^# A2 E7 R* E. y, v/ d
}

" \3 ~7 ^: t" B+ A2 F1 [& |# s; @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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