/*两只老虎**/

#include<reg52.h> sbit Buzz = P1^6; //声明绑定蜂鸣器

unsigned int code NoteFrequ[]={   523,587,659,698,784,880,988,    //中音对应的1-7

  1047,1175,1319,1397,1568,1760,1976   //高音对应的1-7

};

unsigned int code NoteReload[]={ //中音1-7和高音1-7对应的定时器重载值

  65536 - (11059200/12) /(523*2),//中音1-7

  65536 - (11059200/12) /(587*2),

  65536 - (11059200/12) /(659*2),

  65536 - (11059200/12) /(698*2),

  65536 - (11059200/12) /(784*2),

  65536 - (11059200/12) /(880*2),

  65536 - (11059200/12) /(988*2),

  65536 - (11059200/12) /(1047*2),//高音1-7

  65536 - (11059200/12) /(1175*2),

  65536 - (11059200/12) /(1319*2),

  65536 - (11059200/12) /(1397*2),

  65536 - (11059200/12) /(1568*2),

  65536 - (11059200/12) /(1760*2),

  65536 - (11059200/12) /(1970*2)};

bit enable = 1; //发声使能标志

bit tmrflay = 0; //定时器 中断完成标志

unsigned char T0RH = 0xff; //T0重载值高字节

unsigned char T0RL = 0x00; //T0重载值低字节

void PlayTwoTiger(); void main(){

  unsigned int i;

   EA = 1;

   TMOD =0x01;  //模式1

   TH0 = T0RH;

  TL0 = T0RL;

  ET0 = 1;  //使能T0中断

   TR0 = 1;  //启动

  while(1){

  PlayTwoTiger();

   for(i=0;i<40000;i++);

  }

}

/**音乐函数**/

void PlayTwoTiger(){

unsigned char beat;    //节拍索引

unsigned char note;    //节拍对应音符

unsigned int time=0;   //节拍计时

unsigned int beattime=0;  //总时间计时

unsigned int soundtime=0; //没拍发声时间

unsigned char code PlayTwoTigerNote[]={ //音符表

1,2,3,1,  1,2,3,1, 3,4,5, 3,4,5,

5,6,5,4,3,1, 5,6,5,4,3,1, 1,5,1, 1,5,1

};

unsigned char code PlayTwoBeat[]={  //节拍表,4表示一拍,1表示1/4拍,8表示两拍

  4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8,

  3,1,3,1,4,4, 3,1,3,1,4,4, 4,4,8, 4,4,8,

};

for(beat=0; beat<sizeof(PlayTwoTigerNote);){ //节拍索引循环变量

while(!tmrflay);   //每次定时器中断完成 节拍处理

tmrflay = 0;

if(time == 0){       //节拍播放完成重启

   note = PlayTwoTigerNote[beat]-1;

  T0RH = NoteReload[note]>>8;

  T0RL = NoteReload[note];     //计算总时间,右移2位等于除4,移位代替除法加快速度

  beattime = (PlayTwoBeat[beat]*NoteFrequ[note])>>2;   //计算发声时间,为总时间的0.75s

   soundtime =beattime - (beattime>>2);

  enable = 1;  //开始发声

  time++;

   }else{    //节拍播放未结束则继续处理

    if(time >= beattime){ //当前时间清零

      time = 0;     //准备重新启动

    beat++;

    }else{       //累加时间

   time++;

  if(time == soundtime){    //发声时间到达,关闭蜂鸣器

    enable =0;      //用以区分连续两个节拍

      }

     }

  }

}

}

void InterRupt() interrupt 1{//中断服务

TH0 =T0RH;

TL0 =T0RL;

tmrflay = 1;

if(enable){

  Buzz=~Buzz;

  }else{

    Buzz=1;

   }

}

转载于:https://www.cnblogs.com/robotes/p/7795860.html

C51蜂鸣器演奏两只老虎相关推荐

  1. 89C51单片机蜂鸣器演奏两只老虎-源码

    /* ********************************************************************** * 头文件包含 ****************** ...

  2. 蜂鸣器播放《两只老虎》

    文章目录 前言 一.回顾蜂鸣器 二.乐谱知识 2.1 音符音频 2.2 两只老虎乐谱 三.系统框图 四.模块调用 五.模块原理图 六.工程源码 6.1 音符选择模块代码 6.2 pwm产生模块代码 6 ...

  3. FPGA蜂鸣器实现歌曲《两只老虎》

    1.简谱中的符号含义 2.两只老虎简谱 3.音符与频率的对照表 4.首先在这里解释一个名词→音乐频率--众所周知,声音是由物体的振动产生的,本质是传播媒介的振动,另外声音有两大特性--音量和音色,我们 ...

  4. 计算机打音乐两只老虎,两只老虎(音乐、汇编程序)

    /* 程序效果:蜂鸣器发出两只老虎的音律 */ ORG 0000H AJMP START ORG 000BH AJMP TIM0 ORG 0030H START:     MOV TMOD,#01H ...

  5. 用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》

    本文介绍如何在HiSpark Wi-Fi IoT套件上,使用Harmony OS IoT硬件子系统的PWM接口 驱动蜂鸣器 播放音乐. 用PWM输出方波的API 鸿蒙系统IoT硬件子系统提供了PWM相 ...

  6. FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例

    ** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...

  7. 计算机弹奏两只老虎爱跳舞,原神风物之诗琴乐谱大全

    原神风物之诗琴乐谱大全带给大家,这是很多小伙伴都非常期待的内容,最近原神风物之诗琴玩法引起了大家的注意,但是大家不知道弹什么,手心游戏小编就带给大家最全的乐谱介绍. 原神风物之诗琴乐谱大全 弹奏键位 ...

  8. python 常量_大疆机甲大师Python开发: 两只老虎

    大疆机甲大师演奏<两只老虎>https://www.zhihu.com/video/1168271599123320832 之前大疆机甲大师Python开发: 中文命名变量初尝试说到跳过了 ...

  9. 宝贝宝贝用计算机弹奏,原神宝贝宝贝琴谱 原神琴谱两只老虎爱跳舞怎么弹

    原神宝贝宝贝琴谱,原神游戏内,我们通过风物琴,可以演奏不同的音乐出来,今天小辰给大家带来原神宝贝宝贝琴谱,一起来看看吧! 如上图,原神的风物琴分为上高音,中音.下低音3个部分:我们把它分为三行,琴谱空 ...

最新文章

  1. bat+sqlcmd 批量执行脚本
  2. linux配置4g网络命令_Linux网络基本配置命令
  3. 算法提高 身份证排序
  4. java axis webservice_Axis Webservice框架使用案例
  5. P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】
  6. AUTOSAR专业知识篇(七)-比亚迪汉ECU接口
  7. CPU8085 8086名字的由来
  8. MyBatis : Example 条件查询 in 用法
  9. 粉丝回馈,8000元大礼包免费相送
  10. 【java】java 如何不使用第三个变量来交换两个数的值
  11. 算法-codeup1928-日期差值
  12. 【华为OJ】【算法总篇章】
  13. eclipse汉化方法取消汉化退回英文版
  14. 基于Java医院网上预约挂号系统设计与实现(含源代码)
  15. order by case when 使用方法
  16. oracle查看登录失败次数,Oracle取消用户连续登录失败次数限制
  17. c语言中指数函数fabs,高一指数函数公式,高一指数函数
  18. Java 读取文件 MD5 sha1 sha256 sha224 sha384 sha512
  19. 微信怎么群发视频和文件?
  20. java中宏定义,宏定义的使用

热门文章

  1. Response对象-响应字符数据
  2. PTA L1-030 一帮一(详解)
  3. 怎样使用JS代码代码跳转的方法
  4. 深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )
  5. AI创业时代!这9个方向有钱途;AIGC再添霸榜应用Lensa;美团SemEval2022冠军方法分享;医学图像处理工具箱… | ShowMeAI资讯日报
  6. 基于大数据分析的葡萄酒品质鉴别系统设计与实现
  7. 电子科技大学硕士毕业论文和博士毕业论文Latex模板及问题集锦
  8. AutoDesk CAD激活后闪退解决方法
  9. Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白、异常解决方案(提供模拟内存不足导致系统回收内存的方案)。
  10. log4cplus的各种坑