标题:
单片机控制蜂鸣器发出1~7音阶
[打印本页]
作者:
吧更符合个
时间:
2020-8-2 20:13
标题:
单片机控制蜂鸣器发出1~7音阶
这是关于51单片机驱动蜂鸣器的一个很简单的代码。主要功能是依次输出 do re mi fa so la si,然后反复循环输出。
单片机源程序如下:
#include<reg52.h>
/*反复输出1~7七个音阶*/
typedef unsigned int u16;
typedef unsigned char u8;
sbit beep=P1^5;
sbit led=P2^0;
/*C调音符对应的hz:1:523 1#:553 2:586 2#:621 3:658 4:697
4#:739 5:783 5#:830 6:879 6#:931 7:987
根据T=1/f,单片机通过对beep的IO口反复跳转电平从而输出相应的频率
输出的每一个脉冲的高电平和低电平时间都为T的一半
C调音符对应的小时间为:1:956; 2:853; 3:760; 4:717; 5:639; 6:569; 7:507;
关于节拍:设四分音符一拍等于400ms;则八分音符一拍等于200ms;十六分音符一拍等于100ms;
*/
int csign[]={956,853,760,717,639,569,507};
int tho[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe};//高位定时器的值
int tlo[]={0x44,0xab,0x08,0x33,0x81,0xc7,0x05};//低位定时器的值
static u8 k=0;
static int HT,LT;//高低位定时器的值
void Time0_init()
{
TMOD|=0X01;
TR0=1;
TH0=HT;
TL0=LT;
ET0=1;
EA=1;
}
void delay(u16 ms){u16 b;for(ms;ms>0;ms--)for(b=120;b>0;b--);}
void main()
{
Time0_init();
while(1)
{
HT=tho[k];
LT=tlo[k];
k++;
if(k>6)k=0;
delay(1000);TR0=0;
delay(1000);TR0=1;
}
}
void intf() interrupt 1
{
TH0=HT;
TL0=LT;
beep=~beep;
}
复制代码
hex文件51hei提供下载:
蜂鸣器输出1~7音阶.rar
(18.83 KB, 下载次数: 21)
2020-8-2 20:12 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1