#include<reg52.h>
sbit beep = P1 ^ 5;
sbit k1 = P3 ^ 1;
sbit k2 = P3 ^ 0;
sbit k3 = P3 ^ 2;#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar th0_h, tl0_l, time;
uint key;
ulong i, j;//不能用char或int 因为j的值会很大code uchar th0high_8[] = {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};   //28个频率的初始TH0值code uchar tl0light_8[] = {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};//28个初始TL0的值   code uchar song_1[] =
{0,2,2,1,2,1,5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,3,2,2,3,2,1,3,2,2,3,2,1,4,2,2,5,2,1,2,2,3,1,2,3,
5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,5,2,2,5,2,1,3,2,2,3,2,1,3,2,2,5,2,1,2,2,3,1,2,3,3,2,6,2,2,1,3,2,6,2,2,1,
3,2,3,5,2,3,5,2,6,5,2,1,2,2,6,1,2,1,2,2,6,1,2,1,5,2,2,1,2,3,1,2,2,7,1,3,
1,2,3,1,2,3,2,1,1,3,2,3,3,2,1,5,2,3,5,2,1,1,2,3,2,2,3,1,2,3,7,2,1,1,2,3,1,2,3,2,2,1,3,2,3,1,3,1,
7,2,3,7,2,1,1,2,3,1,2,1,2,2,3,2,2,1,1,2,3,7,2,1,1,2,3,1,2,2,1,2,3,1,2,1,3,2,3,3,2,1,3,2,3,3,2,1,2,2,3,2,2,1,1,2,3,
2,2,3,0,2,3,0,2,3,0,2,2,1,2,1,5,2,3,5,2,1,5,2,3,5,2,1,5,2,3,6,2,1,3,2,3,2,2,1,
3,2,3,3,2,3,3,2,2,1,3,3,7,2,2,5,2,3,5,2,1,5,2,3,7,2,1,3,2,3,2,2,1,3,2,3,2,2,1,2,2,3,2,2,1,1,2,3,7,1,3,
1,2,3,7,2,1,5,1,3,3,2,3,2,2,1,2,2,3,1,2,1,1,2,3,2,2,4,1,2,1,3,2,1,1,2,1,2,2,1,1,2,2,1,2,4,3,2,4,2,2,4,1,2,4
7,1,4,1,2,4,7,1,4,1,2,4,};//《朗朗晴天》的音乐码code uchar song_2[] =
{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,//你用你那母亲的脉搏和我诉说
};//《我和我的祖国》的音乐码code uchar song_3[] =
{ 1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,2,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2,
4,2,4,1,3,3,7,2,1,7,2,1,1,3,2,5,2,4,4,2,3,3,2,2,4,2,1,4,2,4,1,3,3,7,2,1,7,2,1,6,2,1,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,
7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2,4,2,4,5,2,3,4,2,2,4,2,2,5,2,2,3,2,3,5,2,3,1,3,3,3,3,3,
2,3,4,2,3,2,2,3,2,1,3,3,1,3,2,1,3,6,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,
7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,4,2,2,2,3,2,2,4,2,4,1,3,3,7,2,2,1,3,2,5,2,4,4,2,3,3,2,3,4,2,1,
4,2,4,1,3,3,7,2,2,7,2,2,6,2,2,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,};//《lemon》的音乐码void delay1(uint m)
{while (m--);
}//用于识别按键的延时函数与前面的延时函数不同uchar key_1()//返回值为0或1,用于后面的判断
{key = 0;if (k1 == 0)          //检测按键K1是否按下{delay1(1000);   //消除抖动 一般大约10msif (k1 == 0)     //再次判断按键是否按下{key = 1;}while (!k1);     //检测按键是否松开}if (key == 1)return 1;else return 0;
}uchar key_2()
{key = 0;if (k2 == 0)          //检测按键K1是否按下{delay1(1000);   //消除抖动 一般大约10msif (k2 == 0)     //再次判断按键是否按下{key = 1;}while (!k2);     //检测按键是否松开}if (key == 1)return 1;else return 0;
}uchar key_3()
{key = 0;if (k3 == 0)          //检测按键K1是否按下{delay1(1000);   //消除抖动 一般大约10msif (k3 == 0)     //再次判断按键是否按下{key = 1;}while (!k3);     //检测按键是否松开}if (key == 1)return 1;else return 0;
}void t0int() interrupt 1//定时中断
{TR0 = 0;beep = !beep;TH0 = th0_h;TL0 = tl0_l;TR0 = 1;
}void delay(uchar t)//延时函数
{uchar t1;ulong t2;for (t1 = 0;t1 < t;t1++)for (t2 = 0;t2 < 2765;t2++);//可以设置t2的数值,根据具体歌的简谱大调来选择TR0 = 0;//关闭T0
}void sing()
{TH0 = th0high_8;TL0 = tl0light_8;TR0 = 1;delay(time);
}void play_1()
{i = 0;time = 1;while (time){a:j = song_1[i] + 7 * song_1[i + 1] - 1;th0_h = th0high_8[j];tl0_l = tl0light_8[j];time = song_1[i + 2];if (song_1[i] != 0)//休止符{sing();i += 3;}else{beep = 1;delay(time);i += 3;goto a;}if (key_3() == 1 || key_2() == 1){beep = 1;break;}}
}void play_2()
{i = 0;time = 1;while (time){a:j = song_2[i] + 7 * song_2[i + 1] - 1;th0_h = th0high_8[j];tl0_l = tl0light_8[j];time = song_2[i + 2];if (song_2[i] != 0)//休止符{sing();i += 3;}else{beep = 1;delay(time);i += 3;goto a;}if (key_1() == 1 || key_3() == 1){beep = 1;break;}}
}void play_3()
{i = 0;time = 1;while (time){a:j = song_3[i] + 7 * song_3[i + 1] - 1;th0_h = th0high_8[j];tl0_l = tl0light_8[j];time = song_3[i + 2];if (song_3[i] != 0)//休止符{sing();i += 3;}else{beep = 1;delay(time);i += 3;goto a;}if (key_1() == 1 || key_2() == 1){beep = 1;break;}}
}void main(void)
{TMOD = 1;ET0 = 1;EA = 1;while (1){beep = 1;if (key_1()){play_1();}if (key_2()){play_2();}if (key_3()){play_3();}}
}

懒得打解释了,等有空再打上去
除了中间那首歌是完整的
其他两首歌我还没有编写完全,工作量太大了

51单片机简易音乐盒(可切歌)相关推荐

  1. 基于51单片机简易数字示波器Proteus仿真

    功能介绍: 采用51单片机作为主控CPU:LCD12864可显示方波,三角波,锯齿波,正弦波等,可通过光标对波形进行测量,可以调节显示波形的幅度和频率,也可以将波形进行左右拖拉,完美的仿真出一个51单 ...

  2. 51单片机简易电阻电感电容RLC测量仪仿真设计

    51单片机简易电阻电感电容RLC测量仪仿真( proteus仿真+程序+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0040 5 ...

  3. 51单片机简易电阻测量仪仿真设计

    51单片机简易电阻测量仪仿真设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0037 51单 ...

  4. 基于51单片机的音乐盒播放器proteus仿真

    资料编号:092  下面是相关功能视频演示: 92-基于51单片机的音乐盒播放器proteus仿真(源码+仿真+全套资料) 功能介绍:使用51单片机,采用蜂鸣器进行音乐播放,提供了音乐代码生成器软件, ...

  5. 51单片机 简易光电循迹小车

    前言 应学校暑期课程要求,也作为和小组成员完成一次对51单片机的练手,制作了简易的光电小车,完成了循迹功能,下面包括较为详细的小车搭建过程以及完整代码. 硬件部分准备 电源 可充电的电池组是智能车的唯 ...

  6. 基于51单片机简易智能家居

    基于51单片机的智能家居的设计 前言 一.项目简介 二.开发环境/工具: 1.Keil 5/Keil 4 2.STC-ISP 3.蓝牙串口助手 4.手机app 三.硬件设计: 1.单片机与蓝牙模块连接 ...

  7. 51单片机 简易秒表计时器(100秒) 小数点后四位

    51单片机制作简易秒表,精确到小数点后四位(即0.0001s)的制作,使用到单片机定时器部分,数码管部分. 程序上分为: 1.延时函数 用来延时让数码管动态显示 2.定时器/计数器初始化函数 3.显示 ...

  8. 【Proteus仿真】【51单片机】音乐盒电子琴设计

    文章目录 一.主要功能 二.使用步骤 三.硬件资源 四.软件设计 1.主要代码 五.实验现象 联系作者 一.主要功能 1.能播放/切换音乐,播放速度调节 2.能当作播放器&电子琴 3.电子琴支 ...

  9. T144基于51单片机简易上下限液位报警器Proteus设计、keil程序、c语言、源码

    一.功能简介 使用51单片机设计一个简易上下限液位报警器: 1.可以检测液位的上限报警和下限报警: 2.配有上下限液位报警指示灯,当液位传感器检测到信号的时候对应的LED灯亮: 3.配有报警功能,当液 ...

  10. 如何使用51单片机自制音乐盒

    51单片机音乐盒 注:下载链接 https://download.csdn.net/download/weixin_42150033/10717356 一.材料 发光二极管 18个: 按键 4个: S ...

最新文章

  1. semantic-ui-react图像组件不显示图像的问题
  2. 大文件分片上传前端框架_基于Node.js的大文件分片上传
  3. leetcode129. 求根到叶子节点数字之和(dfs)
  4. URLDecoder: Illegal hex characters in escape (%) pattern ...
  5. spring整合kafka项目生产和消费测试结果记录(一)
  6. 蓝奏网盘直链转换器 v1.1
  7. 莫比乌斯函数之和(51nod 1244)
  8. Linux系统瓶颈分析(经典)
  9. 国脉信息学院计算机网络,福建工程学院国脉信息学院《计算机网络模拟题》
  10. java wifi设置 linux,Debian系列Linux的WiFi配置
  11. siamfc代码解读_分析SiamFC
  12. 用matlab解超越方程,MATLAB实例之对线性,非线性,超越方程的求解
  13. 男友是程序员,看着他压力大我难受。有哪些缓解压力的好方法?
  14. 谷歌中国追求中国式生存
  15. 【镜像复现】开源围棋AI—— ikataGo 快速复现教程
  16. 华为云CDN,给企业发展按下“加速键”
  17. 【原创】Unity3D 模仿《魔兽世界》的第三人称角色控制器
  18. 政府运用大数据 决策告别“拍脑袋”
  19. Spring三级缓存详解
  20. RC6加密解密算法C#实现源码!

热门文章

  1. 2019年物联网9个趋势和预测
  2. 将Ubuntu中文目录改为英文目录
  3. 一分钟轻松掌握 !Java 高级数据结构 -- 原生 BitSet 源码刨析
  4. 1.2Sakura语法基础篇
  5. 矩阵基础4-线性方程组详解
  6. 均方根误差,平均绝对误差,均方误差,标准差计算方法
  7. 阿里面试整个流程(已OC)
  8. 三角形的几何公式大全_初中数学几何公式、定理梳理大全,老师都收藏了
  9. cad图纸问号怎么转换文字_打开cad2016图纸字体和符号显示问号怎么办?
  10. RabbitMQ安装问题