1. 51-microcontroler

51-microcontroler-第九话-BUZZER

一.写在前面

本次测试主要为编程实现蜂鸣器按指定频率发声。众所周知频率周期满足公式:FT = 1;假设我们需要蜂鸣器震动在1KHz频率上则由公式可知T = 1ms即1ms切换一次高低电平。

那么问题就转换为如何使用C51单片机精准实现这个1ms切换呢?首先想到的当然是定时器啊!只要将定时器设置为1ms溢出时触发中断执行蜂鸣器引脚的电平切换即可。(注意:C51单片机的输出能力实在不行,需要使用三极管)。

二.电路图

三.代码

/* Main.c file generated by New Project wizard
 *
 * Created:   周日 6月 23 2019
 * Processor: AT89C51
 * Compiler:  Keil for 8051
 */

#include <reg51.h>
#include <stdio.h>
typedef unsigned char uint8_t;
sbit LED = P0^0;
sbit SPEAKER = P2^0;

void sleep(int i){
    uint8_t j = 120;
    for(;i>0;i--)
        for(;j>0;j--);
}


void t1() interrupt 3{
    TH1 = (65536 - 1000) / 256;
    TL1 = (65536 - 1000) % 256;
    SPEAKER = ~SPEAKER;
}


void main(void)
{ 
    // Write your code here
    LED = 1;//初始化LED
    SPEAKER = 1;//初始化BUZZER
    TMOD = 0x01;
    TH1 = (65536 - 1000) / 256;//设置1ms定时
    TL1 = (65536 - 1000) % 256;
    EA = 1;//打开中断总开关
    ET1 = 1;//打开T1中断
    TR1 = 1;//开启定时器T1
    while (1){
        LED = ~LED;
        sleep(30000);
    }
}

开启模拟后LED闪烁同时蜂鸣器发声。