学习笔记 从零开始学单片机(8) 蜂鸣器唱歌

 单片机上的蜂鸣器结构非常的简单

只要给一个0,它就会“叫”。让它唱歌的原理很简单,声音大小是固定的,让它的频率变化,就能让它发出不同的音符。

代码中在软件循环延时过程中,依次给它一个固定频率的方波,让它唱起来。

 

//晶振11.0592

#include <reg51.h>

sbit  speaker=P2^3; 
unsigned char byteTH0,byteT0L,duration;

        // 小星星句子,三个一组,第一个表示音符,第二个表示音阶,第三个表示延时长度(单位约等于0.1s)
code unsigned char music[]={     
 1,2,2, 1,2,2, 5,2,2, 5,2,2, 6,2,2, 6,2,2, 5,2,4,
 4,2,2, 4,2,2, 3,2,2, 3,2,2, 2,2,2, 2,2,2, 1,2,4,
 5,2,2, 5,2,2, 4,2,2, 4,2,2, 3,2,2, 3,2,2, 2,2,4,
 5,2,2, 5,2,2, 4,2,2, 4,2,2, 3,2,2, 3,2,2, 2,2,4,
 1,2,2, 1,2,2, 5,2,2, 5,2,2, 6,2,2,  6,2,2, 5,2,4,
 4,2,2, 4,2,2, 3,2,2, 3,2,2, 2,2,2, 2,2,2, 1,2,4 };

 

//定时器计时初值,高八位,代表不同音符的频率

code unsigned char FREQH[]={
 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,
 0xFC,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,0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};

 

void song();
void delay(unsigned char t);

 

void main(void)
{
 unsigned char index, step;
 TMOD=1;
 EA=1;
 ET0=1;
 while(1)
    {
  step=0; 
     while(step<126)
  {    
   index = music[step] + 7 * music[step+1] - 1;
         byteTH0 = FREQH[index];
         byteT0L = FREQL[index];
         duration = music[step+2];
         step += 3;
         song();
  }
      delay(10);
     }
}

void timer0() interrupt 1
{
 TR0=0;
 speaker=!speaker;
 TH0 = byteTH0;
 TL0 = byteT0L;
 TR0=1;
}

void delay(unsigned char t)
{
 unsigned int i;
 unsigned char j=80;
 for(i=0; i<t*100; i++)
  while(j--);
    TR0=0;
}

void song()
{
 TH0 = byteTH0;
 TL0 = byteT0L;
 TR0 = 1;
 delay(duration);                      
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单片机唱歌内附歌曲请环伺,爱情买卖等等 #include <REG51.H> #include <INTRINS.H> //本例采用89C51, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码. //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; //所以拿出谱子, 试探编吧! sbit Beep = P1^5 ; unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; //开定时器1 while(n!=0) Beep=~Beep,delay(m); TR0=0; //关定时器1 } }
学习51单片机C语言需要有一定的基础知识,首先要了解C语言的基本语法和编程规范。可以通过阅读相关的书籍和资料,网上视频教程来系统地学习C语言的基础知识。掌握了C语言的基础知识之后,就可以开始学习51单片机的相关知识。 其次,需要了解51单片机的硬件结构、指令集和编程环境。可以通过查阅51单片机的相关资料和学习笔记来了解51单片机的基本知识和编程环境的搭建。学习过程中可以通过实验和练习加深理解,掌握51单片机的基本原理和编程方法。 学习过程中还需要具备一定的动手能力和实践经验,可以通过购买一些实验套件进行实际的操作和编程练习。通过实际操作可以更加深入地理解单片机的工作原理和编程方法,同时也可以提自己的动手能力和解决问题的能力。 另外,学习51单片机C语言还需要有一定的毅力和耐心,因为学习过程中可能会遇到各种各样的困难和问题,需要持之以恒地克服这些困难。可以多参与一些相关的社区和论坛,向其他有经验的人请教和交流,可以更快地解决问题和提自己的学习效率。 总之,学习51单片机C语言需要持续地学习和实践,掌握C语言的基础知识、了解51单片机的硬件结构和编程环境,提动手能力和解决问题的能力,同时要有毅力和耐心,相信通过不懈的努力一定能够掌握这门技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值