找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9564|回复: 4
收起左侧

关于蜂鸣器唱歌程序

[复制链接]
ID:46108 发表于 2012-11-24 10:37 | 显示全部楼层 |阅读模式

各位大神好,一直对蜂鸣器唱歌很感兴趣,前几天在我们这个论坛发现了一个关于蜂鸣器唱歌的程序,程序如下:

/************************************************
跳线设置:
1.蜂鸣器和继电器 共用p2.2 ,跳线J5设置到23端选中蜂鸣器
2.J7拔掉,双排针除PSEN外全部插上

效果:
   1,生日快乐歌曲
相关知识点:
   1,利用单片机的定时器精准定时
************************************************/

#include"AT89x52.h"
#define uchar unsigned char
#define uint unsigned int
sbit P22=P2^2;
uchar i,j,time1,time2;
uint code array1[]={
     400,400,650,650,650,1200,
     400,400,650,650,650,1200,
     400,400,650,650,650,650,1200,
     400,400,650,650,650,1200
     };
uchar code array[]={
     0xfd,0x79,0xfd,0x79,0xfd,0xc7,0xfd,0x79,0xfe,0x21,0xfe,0x05,
        0xfd,0x79,0xfd,0x79,0xfd,0xc7,0xfd,0x79,0xfe,0x51,0xfe,0x21, 
     0xfd,0x79,0xfd,0x79,0xfe,0xc0,0xfe,0x84,0xfe,0x21,0xfe,0x05,0xfd,0xc7,
     0xfe,0x99,0xfe,0x99,0xfe,0x90,0xfe,0x21,0xfe,0x51,0xfe,0x21
     };

void delay(uint m)
{
    uint n;
 for(;m>0;m--)
  for(n=125;n>0;n--);

void main()
{
 TMOD=0x01;
 TH0=0;
 TL0=0;
 EA=1;
 ET0=1;
 TR0=1;
 while(1)
 {
  time1=array[i++];
  time2=array[i++];
  if(i==50)
   i=0;
  delay(array1[j++]);
  if(j==25)
   j=0;
 }

}
void init() interrupt 1
{
 TR0=0;
 P22=~P22;
 TH0=time1;
 TL0=time2;
 TR0=1;
}

但是,我不太理解这程序的思路,求各位前辈高人帮我解释下,我对蜂鸣器唱歌的理解是在一段时间里面,输出不同频率的方波给蜂鸣器引脚,不知道这样对不对,另外从程序上怎么体现出来,希望高手可以帮我把这程序讲解下,最好是每行都注释一下,我是新手,谢谢你的解惑和不吝赐教!谢谢!

回复

使用道具 举报

ID:27916 发表于 2012-11-24 13:11 | 显示全部楼层

是的,要发出不同的声音,就需要不同的频率,上面 程序就是这样来做的,ARRAY[]里存放的是不同频率对应的定时器初值,ARRAY1[]里放的是延时系数,发出了一个频率之后,还得延时一段时间,要不然你听不到,但是这个延时也不能太长,长了听上去就会慢

回复

使用道具 举报

ID:7485 发表于 2012-11-25 13:27 | 显示全部楼层
在这里不可能有人给你讲的很详细。你还是找一点相关的资料自己研究研究比较好。这类的“音乐”其实只是简单地发音,一般仅仅简单的控制音阶的高低(高低音,频率),和拍节。
回复

使用道具 举报

ID:48307 发表于 2013-2-26 16:46 | 显示全部楼层
  yhug
回复

使用道具 举报

ID:51012 发表于 2013-6-17 18:16 | 显示全部楼层
我也想知道啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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