由于同学的需要,于是用51单片机的蜂鸣器功能谱了一首《我和我的祖国》,下面是全部的代码:
#include sbit beep = P1^5; unsigned char timer0H, timer0L, time; //单片机晶振采用11.0592MHz // 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据 code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表 低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //数据表 code unsigned char song[] = { 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我和我的祖国 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12, //一刻也不能分割 6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6, //无论我走到哪里 7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12, //都唱出一首赞歌 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我歌唱每一座高山 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12, //我歌唱每一条河 1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6, //袅袅炊烟 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6, //小小村落 7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12, //路上一道辙 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//我最亲爱的祖国 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永远紧依着你的心窝 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6,4, 2, 6, 2, 2, 4, 1, 2, 2,1, 2, 10,//你用你那母亲的脉搏和我诉说 }; //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 //6, 2, 3 分别代表:6, 中音, 3个半拍; //5, 2, 1 分别代表:5, 中音, 1个半拍; void t0int() interrupt 1 //T0中断程序,控制发音的音调 { TR0 = 0; //先关闭T0 beep = !beep; //输出方波, 发音 TH0 = timer0H; //下次的中断时间, 这个时间, 控制音调高低 TL0 = timer0L; TR0 = 1; //启动T0 } void delay(unsigned char t) //延时程序,控制发音的时间长度 { unsigned char t1; unsigned long t2; for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍 for(t2 = 0; t2 < 4000; t2++); //延时期间, 可进入T0中断去发音 TR0 = 0; //关闭T0, 停止发音 } void sing() //演奏一个音符 { TH0 = timer0H; //控制音调 TL0 = timer0L; TR0 = 1; //启动T0, 由T0输出方波去发音 delay(time); //控制时间长度 } void main(void) { unsigned char k, i; TMOD = 1; //置T0定时工作方式1 ET0 = 1; //开T0中断 EA = 1; //开总中断 while(1) { i = 0; time = 1; while(time) { k = song[i] + 7 * song[i + 1] - 1;//第i个是音符, 第i+1个是第几个八度 timer0H = FREQH[k]; //从数据表中读出频率数值 timer0L = FREQL[k]; //实际上, 是定时的时间长度 time = song[i + 2]; //读出时间长度数值 i += 3; sing(); //发出一个音符 } } } 根据下面这张简谱制作的
上一篇:51单片机蜂鸣器程序
下一篇:关于单片机--蜂鸣器输出音调设置
推荐阅读最新更新时间:2024-11-11 22:38
设计资源 培训 开发板 精华推荐
- TB62737FUG 升压 DC-DC 转换器的典型应用,适用于 4 WLED 驱动器
- AD8052AR-EB,AD8052ARZ 双通道高速运算放大器评估板,采用 8 引脚 SOIC 封装
- 更好的PCB照片 - 避免卡顿
- NCP1081REF12VC4GEVB:PoE-PD 转换器 REF 设计 12V-25W,IEEE 802.3at
- LT1619 的典型应用 - 低电压电流模式 PWM 控制器
- ESP8266共阴极灯带控制器
- 使用 ROHM Semiconductor 的 BD45442 的参考设计
- Tah:兼容 Arduino的BLE平台,可用作信标、微控制器和 HID 设备(含原理图、源码等)
- LTC3119IFE 12V、2MHz 宽输入稳压器的典型应用电路
- MAXREFDES9002:从 Cortex-M4 GPIO 引脚操作 DS28E18 的 C 源代码参考