一.写在前面
本次测试主要为编程实现蜂鸣器按指定频率发声。众所周知频率周期满足公式: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闪烁同时蜂鸣器发声。