C51蜂鸣器演奏两只老虎

/*两只老虎**/

#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;

   }

}

时间: 2024-10-05 08:47:37

C51蜂鸣器演奏两只老虎的相关文章

两只老虎简谱

一个手指头正对着一个键盘,五个手指就对应 do.re.mi.fa.so 五个音. 音乐中的音符除了有高低之分外,当然还要表示长短之分.表示音乐的长短需要有一个相对固定的时间概念.四分音符,它是一个基本参照度量长度,即四分音符为一拍.一拍的长度没有限制,可以是1秒 也可以是2秒或半秒. 用一条横线"-"在四分音符的右面或下面来标注,以此来定义该音符的长短.右边加横线表示延长,下边加横线表示缩短. 原文地址:https://www.cnblogs.com/badboy200800/p/96

v3学院带你学习《驱动蜂鸣器演奏歌曲》

此文章为原创出自 V3学院 www.v3edu.org,FPGA培训专家 一.实验背景(一)蜂鸣器的介绍1.蜂鸣器的作用蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电子设备.电话机.定时器等电子产品中作发声器件.2.蜂鸣器的分类蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型.3.蜂鸣器的电路图形符号蜂鸣器在电路中用字母"H"或"HA"(旧标准用"FM"."LB"

FPGA学习之蜂鸣器演奏乐曲

参考链接:http://www.cnblogs.com/kongtiao/archive/2011/07/20/2111581.html 一.实验目的:学习驱动FPGA之IO引脚来控制蜂鸣器演奏音乐.二.实验环境:FPGA开发板AX301,Quartus ii三.实验介绍: 我们都知道,乐曲由音调和音长组成,只要将音调和音长控制好就能演奏出动听的乐曲.下面将用Verilog HDL 硬件描述语言完成乐曲演奏的设计. 1.音调的控制 频率的高低决定了音调的高低.图1.1是音调和音律之间的关系. 图

两只蜗牛的故事

有一天,一只蜗牛妈妈生了两只小蜗牛,母亲叫它们一个是大牛,一个是小牛. 大牛天性活泼好动,而弟弟小牛却好吃懒做,但妈妈都很爱它们.一天,蜗牛妈妈告诉了一个蜗牛族流传的话:"能到达金字塔顶端的只有两种动物:一种是鹰,另一种是蜗牛,可现在也没有哪只蜗牛到达塔顶".大牛听了这句话心被触动了,它决心要去征服金字塔,要证实这个传言. 然而它偷偷地跑了出去,但它很盲目,因为它并不知道金字塔在哪里,是什么样,它拖着沉重的壳,四处游走,它看到了小鸟,就问小鸟:"小鸟,请问你知道金字塔在哪里吗

洛谷——P1518 两只塔姆沃斯牛 The Tamworth Two

https://www.luogu.org/problem/show?pid=1518 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子. 一个格子可以是: . 空地 障碍物 C 两头牛 F 农民John 这里有一个地

洛谷P1518 两只塔姆沃斯牛 The Tamworth Two

P1518 两只塔姆沃斯牛 The Tamworth Two 109通过 184提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 求数据 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进

Openjudge NOI题库 数论4975 两只鼹鼠

总时间限制: 1000ms 内存限制: 65536kB 描述 一个圆形花圃被分为k个扇形区域(0,1,-,k-1).有两只小鼹鼠A,B分别位于其中的两个区域.鼹鼠从一个扇形区域移动到相邻的区域需要1分钟.已知A鼹鼠总是沿顺时针方向移动(序号增大),B鼹鼠总是沿逆时针方向移动(序号减小),两只鼹鼠都是每隔一段时间钻出地面一次.请你求出两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间.如果永远遇不到,则输出"no answer". 输入 第一行为一个整数k,表示扇形区域的个数.1 <

【USACO 2.4.1】两只塔姆沃斯牛

[题目描述] 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子. 一个格子可以是: . 空地 * 障碍物 C 两头牛 F 农民John 这里有一个地图的例子: *...*..... ......*... ...*...*.. ......

2018-05-22两只垃圾基金南方产业活力000955和鹏华全球高收益债券000290

1. 第一个垃圾基金,南方产业活力000955,表现很差 研究了下基金经理,名字叫张旭,的另外两只基金,也是很差劲,差劲,这么差劲的基金,果断清仓 2. 下一个是债券基金,也是坑成狗,今天卖出 3. 最近打算全面清查手上的购买基金情况,发现表现差的,立马卖出,买入表现好的基金.明确,基金要每个月审查一下,剔除垃圾基金. 原文地址:https://www.cnblogs.com/429512065qhq/p/9086057.html