微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何用单片机 唱生日快乐歌

如何用单片机 唱生日快乐歌

时间:10-02 整理:3721RD 点击:

菜鸟不懂,求大家帮忙 如何用单片机 控制唱生日快乐歌,都要哪些元件?
是用蜂鸣器有源的还是无源的  还是用什么扬声器什么的,具体怎么控制,求PCB图啊,最好 有个仿真 的  还有C程序啊,谢谢



朋友,你是想学习还是想要点资料交功课,如果是后者,建议你以后不要学习电子相关的东西,因为你的心根本不在这里;要是前者,你应该买个51开发板,然后慢慢的学习. 提示一下应该使用蜂鸣器好做一点.

是自己研究,开发板 早就买了 ,proteus 和Protel都会用,网上查资料 没有详细 的讲解,看别人能做出来,不知道咋做的,电路图程序 什么 的想学习研究下!

这是世上只有妈妈好的音乐,生日歌你自己改编下,用的蜂鸣器
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char timer0h,timer0l,time;
        //世上只有妈妈好数据表
code unsigned char sszymmh[]={        
    6,2,3,  5,2,1,  3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
    6,2,4,  3,2,2,  5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
    6,1,1,  5,2,1,  3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
    5,2,1,  6,2,1,  3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
    2,2,1,  1,2,1,  6,1,1, 1,2,1, 5,1,6, 0,0,0
  };
//音阶频率表 高八位
code unsigned char FREQH[]={
           0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
           0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
           0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
           0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
           } ;
//音阶频率表 低八位
code unsigned char FREQL[]={
           0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
           0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
           0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
           0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
           };
  void delay(unsigned char t)
  {
   unsigned char t1;
   unsigned long t2;
   for(t1=0;t1<t;t1++)
   {
            for(t2=0;t2<8000;t2++)
     {
      ;
     }
   }
   TR0=0;
  }
void t0int() interrupt 1
{
  TR0=0;
  TH0=timer0h;
  TL0=timer0l;
  TR0=1;
}
void song()
{
  TH0=timer0h;
  TL0=timer0l;
  TR0=1;
  delay(time);                       
}
void main(void)
{
   unsigned char k,i;
   TMOD=1; //置CT0定时工作方式1
   EA=1;
   ET0=1;   //IE=0x82     //CPU开中断,CT0开中断
   while(1)
   {
        i=0;  
        while(i<100){         //音乐数组长度 ,唱完从头再来        
          k=sszymmh[i]+7*sszymmh[i+1]-1;
      timer0h=FREQH[k];
      timer0l=FREQL[k];
      time=sszymmh[i+2];
      i=i+3;
      song();
    }
  }
}

佩服.

找点资料,把原理看懂吧

谢谢,但是电路图是什么样的?、我要做实物

偌大一个互联网,这点资料怎么会找不到呢,蜂鸣器要用无源蜂鸣器,要靠不同频率的信号才能驱动发声,而有缘蜂鸣器只要有电压就会发声、

这么巧,我前几个星期刚做过。我这里就有程序,在实验板上调试出来的,实物我没有做过。不过接法也应该很简单,就是P3随便找个口接蜂鸣器,如果功率不够再接个上拉。
ORG 0000H
JMP MAIN
ORG 000BH ;跳转定时器0,定时器0控制节拍
JMP SETJPJS        ;跳转节拍计数中断,
ORG 001BH ;跳转定时器1,定时器1控制频率
JMP SETPLZF        ;跳转到频率计数中断,在该中断中对喇叭高低电平至反
ORG 0080H
MAIN:
MOV TMOD , #00010001B
JMP RESETJS
LOOP:
MOV P3 , R7
JMP LOOP
RET
RESETJS:
;对定时器赋初值
MOV R1 , #00H
MOV R2 , #00H
MOV R3 , #00H
MOV R4 , #00H
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @a + DPTR
MOV TH0 , A            ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A            ;对TL0赋初值
INC R1
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2                       ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A            ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A            ;对TL1赋初值
INC R4
MOV IE , #10001010B
SETB TR0
SETB TR1
JMP LOOP
RESETJS1:
;对定时器赋初值
MOV R1 , #00H
MOV R2 , #00H
MOV R3 , #00H
MOV R4 , #00H
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV TH0 , A            ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A            ;对TL0赋初值
INC R1
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2                       ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A            ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A            ;对TL1赋初值
INC R4
RETI
SETPLZF:
MOV A , R7
CPL A
MOV R7 , A
MOV TH1 , 20H
MOV TL1 , 21H
;CPL P1.1
RETI
SETJPJS:
DJNZ R3 , SETLOOP
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A              ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV R6 , A
CJNE A , #00H , SETJS
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
CJNE A , #00H , SETJS
;如果节拍记录到0000H则要重头开始
JMP RESETJS1
RETI
SETJS:
MOV TH0 , R6           ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A
INC R1                 ;对TL0赋初值
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2                       ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A            ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A
INC R4                 ;对TL1赋初值
RETI
SETLOOP:
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV TH0 , A            ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R2
MOVC A , @A + DPTR
MOV TL0 , A            ;对TL0赋初值
;MOV DPTR , #TAB3
;MOV A , R2
;MOVC A , @A + DPTR
;MOV R3 , A
;INC R2                       ;对R3赋初值,决定节拍的长度
RETI
;祝你生日快乐歌
TAB1: DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH   ;TH0
      DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
      DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
                DB 03CH , 03CH , 03CH , 03CH
      DB 000H
TAB2: DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H   ;TL0
      DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
      DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
                DB 0B0H , 0B0H , 0B0H , 0B0H
      DB 000H
TAB3: DB 02H , 02H , 04H , 04H , 04H , 08H , 02H   
      DB 02H , 04H , 04H , 04H , 08H , 02H , 02H
      DB 04H , 04H , 04H , 04H , 04H , 02H , 02H
                DB 04H , 04H , 04H , 08H
      DB 000H
TAB4: DB 0FBH , 0FBH , 0FBH , 0FBH , 0FCH , 0FCH , 0FBH
      DB 0FBH , 0FBH , 0FBH , 0FCH , 0FCH , 0FBH , 0FBH
           DB 0FDH , 0FDH , 0FCH , 0FCH , 0FBH , 0FDH , 0FDH
           DB 0FDH , 0FCH , 0FCH , 0FCH
TAB5: DB 004H , 004H , 090H , 004H , 044H , 00CH , 004H
      DB 004H , 090H , 004H , 0ACH , 044H , 004H , 004H
           DB 082H , 009H , 044H , 00CH , 090H , 084H , 084H
           DB 009H , 044H , 0ACH , 044H
;1-7 , 1-7 , 1-7
;TAB1: DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH   ;TH0
;      DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
;      DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
;      DB 000H
;TAB2: DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H   ;TL0
;      DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
;      DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
;      DB 000H
;TAB3: DB 014H , 014H , 014H , 014H , 014H , 014H , 014H   ;TH0
;      DB 014H , 014H , 014H , 014H , 014H , 014H , 014H
;      DB 014H , 014H , 014H , 014H , 014H , 014H , 014H
;      DB 000H
;TAB4: DB 0F8H , 0F9H , 0FAH , 0FAH , 0FBH , 0FBH , 0FCH   ;TH1
;      DB 0FCH , 0FCH , 0FDH , 0FDH , 0FDH , 0FDH , 0FEH
;      DB 0FEH , 0FEH , 0FEH , 0FEH , 0FEH , 0FEH , 0FFH
;      DB 000H
;TAB5: DB 08CH , 05CH , 015H , 067H , 004H , 090H , 00CH   ;TL1
;      DB 044H , 0ACH , 009H , 084H , 082H , 0C8H , 006H
;      DB 021H , 056H , 085H , 09AH , 0C1H , 0E4H , 003H
;      DB 000H

END

加油

就直接将蜂鸣器接到一个IO就行了?
有么有C语言的程序,

大哥,还要电路图,程序中的接口定义你都看不懂还玩?初学者表示鄙视之。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top