打印

求各位高手指点一下?

[复制链接]
1957|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夏至之初|  楼主 | 2010-8-16 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用AT89s52单片机驱动蜂鸣器播放音乐,网上搜了一下,但是看不懂,原理也不知道,求各位指点一下,最好能有一个程序,然后一条一条程序给我讲解一下,麻烦各位了,还有我是初学的,希望大家多多指教。

相关帖子

沙发
windertakers| | 2010-8-16 16:45 | 只看该作者
这个 估计没别的人会理你
想做东西的话最好从头学起
如果只是想做个东西的话 这样又有什么意义?
还有 论坛是一个论坛,是大家交流的地方 你什么都不懂 大家就算想教 怎么教》?
如果你想学 论坛里大把的书 你把你遇到的问题提出来 那样大家才会理你的
看你是超级新人 多嘴了两句
中听了就听着 觉得不适合你就当我没说过吧

唉 今天心情~~~

使用特权

评论回复
板凳
maychang| | 2010-8-16 19:25 | 只看该作者
“最好能有一个程序,然后一条一条程序给我讲解一下”
花钱上学习班,也做不到“一条一条程序”讲。

使用特权

评论回复
地板
NE5532| | 2010-8-16 20:52 | 只看该作者
这个呀,估计你得开价200元/小时,看有没有人接招了。

使用特权

评论回复
5
2008付海龙| | 2010-8-19 11:22 | 只看该作者
我的单片机能唱三首歌。
什么时候给你发过去。

使用特权

评论回复
6
lirui5528| | 2010-8-24 22:52 | 只看该作者
呵呵,现在我也遇到了这个问题。
我写的程序不能够在单片机上播出声音,不知道咋搞的。
郁闷啊!我也是初学者,找了半天都没发现有什么毛病。

使用特权

评论回复
7
lixitong| | 2010-8-25 10:54 | 只看该作者
//*****************************************************
//
//    实  验 名 称: 蜂鸣器播音乐
//
//    实  现 功 能: 用蜂鸣器播一段自己喜欢的音乐
//                       
//    实验硬件环境: 所有程序均在"亿唯电子"公司 MINI51实验板上测试成功,
//                  主控芯片: STC公司的 STC12C5A16S2 单片机
//                  晶振频率: 11.0592MHz
//      
//    更多程序下载>>亿唯电子:www.evmcu.net
//
//*****************************************************
#include <stc12c5a16s2.h>
#include<intrins.h>

#define u8 unsigned char  
#define u16 unsigned int   
#define u32 unsigned long

sbit beep=P2^0;

bit stop=0;//stop=0时发声,stop=1时不发声
u16 music_f=1734;//初始为dou

#define music_l 0x0001
#define music_m 0x0002
#define music_h 0x0003
u16 code music_f_l[8]={3500,3100,2800,2600,2300,2050,1840}; //低音
u16 code music_f_m[8]={1734,1548,1375,1295,1150,1021,915}; //中音
u16 code music_f_h[8]={450,500,570,630,670,760,850}; //高音
//三度音阶

void time_init()
{
        TMOD=0x01;           //定时器,方式1
        TH0=(65536-music_f)>>8; //写入初值高8位
        TL0=(65536-music_f)&0x00ff; //写入初值低8位
        EA=1;
        ET0=1;
        TR0=1;       
}

u8 code music_d[512]=    {5,5,6,5,1,7,5,5,6,5,2,1,5,5,5,3,1,7,6,4,4,3,1,2,1,0,5,6,5,3,2,1,2,1,6,5,6,6,5,6,6,5,5,3,2,5,6,5,3,2,1,2,6,1,2,2,2,2,3,5,5,6,1,6,1,2,2,3,5,6,5,6,6,5,3,6,5,8,1,2,1,6,1,0,0xff}; // 音乐音节
u8 code music_lv[512]=   {1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,0xff}; // 音乐度数
u8 code music_time[512]= {1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,2,1,1,2,2,2,4,2,1,1,1,1,1,1,1,1,1,4,1,2,1,1,2,1,3,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,2,1,1,3,1,2,1,2,1,1,1,2,1,2,1,2,2,6,1,1,1,1,1,1,2,0xff}; // 音乐节拍
u8 code music_s[512]=    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff}; // 音乐节拍

void delay_ms(unsigned int x) // 延时毫秒级
{
        unsigned int a=0,b=0,c=0;
        for(a=x;a>0;a--)
        for(b=5;b>0;b--)
        for(c=128;c>0;c--);
}

void play(u8 l,u8 f,u8 len,bit s)
{
        u16 *add;
        stop=0;//播放音乐
        switch(l)
        {
                case music_l:add=music_f_l;break;
                case music_m:add=music_f_m;break;
                case music_h:add=music_f_h;break;
        }
        switch(f)
        {
                case 0:{stop=1;delay_ms(1800);};break;//长停顿
                case 1:music_f=*add;break;
                case 2:music_f=*(add+1);break;
                case 3:music_f=*(add+2);break;
                case 4:music_f=*(add+3);break;
                case 5:music_f=*(add+4);break;
                case 6:music_f=*(add+5);break;
                case 7:music_f=*(add+6);break;
                case 8:stop=1;break;//空音
        }
        delay_ms(len*180);
        stop=1;//停止播放音乐
        if(s)delay_ms(len*90);                       
}

void main()
{
        u16 n=0;
        time_init();//定时中断初始化子程序
        P1=0x55;
        while(1)
        {
                while(1)
                {
                        if(music_lv[n]==0xff){n=0;break;}
                        play(music_lv[n],music_d[n],music_time[n],music_s[n]);
                        n++;
                }
        }
}

void timer0() interrupt 1  //中断
{
        TH0=(65536-music_f)>>8;  //重新写入初值
        TL0=(65536-music_f)&0x00ff;
        if(stop)beep=1;
        else beep=~beep;
}

使用特权

评论回复
8
aywyk| | 2010-8-25 17:36 | 只看该作者
这个要看懂音乐的编码,貌似很难啊!:L

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

粉丝