/*基于52单片机的源代码

sbit L=P2^2;

sbit LRW=P2^1;

sbit LRS=P2^0;

#define SYSTEM_OSC  12000000 //定义晶振频率12000000HZ

#define SOUND_SPACE  4/5  //定义普通音符演奏的长度分率,//每4分音符间隔

sbit    BeepIO    =    P3^7; //定义输出管脚

sbit K1=P1^7;

unsigned int  code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表

unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 };    //1~7在频率表中的位置

unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };

unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存

unsigned char Sound_Temp_TH1,Sound_Temp_TL1;

void delay1(void) //延时程序

{

uchar i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void Getch (  )

{   uchar X,Y,Z;

P1=0xff;

P1=0xf3;       //先对P0置数  行扫描

if(P1!=0xf3)     //判断是否有键按下

{ delay1();    //延时,软件去干扰

if(P1!=0xf3)   //确认按键按下X = P3;

{

X=P1;          //保存行扫描时有键按下时状态

P1=0xfc;       //列扫描

Y=P1;          //保存列扫描时有键按下时状态

Z=X|Y;

//取出键值

switch ( Z )   //判断键值(那一个键按下)

{

case 0xf9: k=0; break; //对键值赋值

case 0xf5: k=1; break;

case 0xfa: k=2; break;

case 0xf6: k=3; break;

}

}

}

}

void Delay()

{  uint uiCount;

for(uiCount=0;uiCount<250;uiCount++);

}

void WriteCMD(uchar Commond)//LCD写指令函数

{

Delay();    //先延时。

L=1;     //然后把LCD改为写入命令状态。

LRS=0;

LRW=0;

LPORT=Commond;  //再输出命令。

LCDE=0;     //最后执行命令。

}

void WriteData(uchar dat)//LCD写数据函数

{ Delay();      //先延时。

L=1;       //然后把LCD改为写入数据状态。

LRS=1;

LRW=0;

LPORT=dat;     //再输出数据。

LE=0;       //最后显示数据。

}

void init()

{

LRW=0;

L=0;

WriteCMD(0x38);

WriteCMD(0x0c);

WriteCMD(0x06);

WriteCMD(0x01);

WriteCMD(0x80);

}

void mydelay(int x)

{ int i,j;

for(i=x;i>0;i--)

for(j=255;j>0;j--);

}

void InitialSound(void)

{

BeepIO = 0;

Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值  (10ms的初装值)

Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值

TH1 = Sound_Temp_TH1;

TL1 = Sound_Temp_TL1;

TMOD  |= 0x11;

ET0    = 1;

ET1    = 0;

TR0    = 0;

TR1    = 0;

EA     = 1;

}

void BeepTimer0(void) interrupt 1 //音符发生中断

{

BeepIO = !BeepIO;

TH0    = Sound_Temp_TH0;

TL0    = Sound_Temp_TL0;

}

void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)

{

unsigned int NewFreTab[12]; //新的频率表

unsigned char i,j;

unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;

unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;

for(i=0;i<12;i++)  // 根据调号及升降八度来生成新的频率表

{

j = i + Signature;

if(j > 11)

{

j = j-12;

NewFreTab[i] = FreTab[j]*2;

}

else

NewFreTab[i] = FreTab[j];

if(Octachord == 1)

NewFreTab[i]>>=2;

else if(Octachord == 3)

NewFreTab[i]<<=2;

}

SoundLength = 0;

while(Sound[SoundLength] != 0x00) //计算歌曲长度

{

SoundLength+=2;

}

Point = 0;

Tone   = Sound[Point];

Length = Sound[Point+1];  // 读出第一个音符和它时时值

LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)

LDiv4 = LDiv0/4;  // 算出4分音符的长度

LDiv4 = LDiv4-LDiv4*SOUND_SPACE;  // 普通音最长间隔标准

TR0   = 0;

TR1   = 1;

while(Point < SoundLength&&K1==1)//歌曲代码未放完且暂停键未被按下

{

SL=Tone%10;  //计算出音符

SM=Tone/10%10;  //计算出高低音

SH=Tone/100;  //计算出是否升半

CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率

if(SL!=0)

{

if (SM==1) CurrentFre >>= 2;  //低音

if (SM==3) CurrentFre <<= 2;  //高音

Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值

Sound_Temp_TH0 = Temp_T/256;

Sound_Temp_TL0 = Temp_T%256;

TH0 = Sound_Temp_TH0;

TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿

}

SLen=LengthTab[Length%10];  //算出是几分音符

XG=Length/10%10;  //算出音符类型(0普通1连音2顿音)

FD=Length/100;

LDiv=LDiv0/SLen;  //算出连音音符演奏的长度(多少个10ms)

if (FD==1)

LDiv=LDiv+LDiv/2;

if(XG!=1)

if(XG==0)  //算出普通音符的演奏长度

if (SLen<=4)

LDiv1=LDiv-LDiv4;

else

LDiv1=LDiv*SOUND_SPACE;

else

LDiv1=LDiv/2;  //算出顿音的演奏长度

else

LDiv1=LDiv;

if(SL==0) LDiv1=0;

LDiv2=LDiv-LDiv1;  //算出不发音的长度

if (SL!=0)

{

TR0=1;

for(i=LDiv1;i>0;i--)  //发规定长度的音

{

while(TF1==0);

TH1 = Sound_Temp_TH1;

TL1 = Sound_Temp_TL1;

TF1=0;

}

}

if(LDiv2!=0)

{

TR0=0; BeepIO=0;

for(i=LDiv2;i>0;i--)  //音符间的间隔

{

while(TF1==0);

TH1 = Sound_Temp_TH1;

TL1 = Sound_Temp_TL1;

TF1=0;

}

}

Point+=2;

Tone=Sound[Point];

Length=Sound[Point+1];

}

BeepIO = 0;

}

main()

{ uint i;

k=8;

init();

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

{

WriteData(tab[i]); //LCD写数据函数写第一行

mydelay(50);

}

mydelay(1000);

WriteCMD(0x80+0x40+2); //将指针设到第二行空两字符

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

{

WriteData(tab1[i]);

mydelay(50);

}

InitialSound(); //发音初始化程序

while(1)

{  Getch(); //扫描键盘,获得键值

if(k==0) //若键值为0

{ uint i;

init();

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

{

WriteData(tab2[i]); //写第一首歌序号

mydelay(50);

}

mydelay(1000);

WriteCMD(0x80+0x40); //转到第二行

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

{ WriteData(tab3[i]); //写歌名

mydelay(50);

}

Play(Music_Girl,0,3,360); //播放第一首歌

mydelay(500);

break;

}

else if (k==1)  //若键值为1

{ uint i;

init();

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

{ WriteData(tab4[i]);  //写第二首歌序号

mydelay(50);

}

mydelay(1000);

WriteCMD(0x80+0x40);  //转到第二行

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

{

WriteData(tab5[i]);  //写歌名

mydelay(50);

}

Play(Music_Jingle,0,3,360);//播放第二首歌

mydelay(500);

break;

}

else if (k==2) //若键值为2

{ uint i;

init();

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

{ WriteData(tab6[i]);  //写第三首歌序号

mydelay(50);

}

mydelay(1000);

//WriteCMD(0x01);

WriteCMD(0x80+0x40);  //转到第二行

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

{

WriteData(tab7[i]);  //写歌名

mydelay(50);

}

Play(Music_Two,0,3,360);  //播放第三首歌

mydelay(500);

break;

}

else if (k==3) //若键值为3

{ uint i;

init();

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

{ WriteData(tab8[i]);  //写第四首歌序号

mydelay(50);

}

mydelay(1000);

WriteCMD(0x80+0x40);  //转到第二行

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

{ WriteData(tab9[i]);  //写歌名

mydelay(50);

}

Play(Music_Jingle,0,3,360);//播放第三首歌

mydelay(500);

break;

}

}

单片机实习音乐播放器的源码相关推荐

  1. 依米花音乐播放器php源码下载

    仿依米花音乐播放器是一款简约的HTML悬浮音乐播放器,免费分享和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的.这款依米花音乐播放器php源码支持网易云/QQ音乐,可搭建类是与 ...

  2. 依米花音乐播放器php源码

    简介: 和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的. 这款依米花音乐播放器php源码支持云/QQ音乐,可搭建类是与播放器功能的平台. 源码安装方法: 环境:php5.6或 ...

  3. 几款最主流的音乐播放器应用源码-android源码

    影音播放 优雅音乐播放器应用源码 这是一款不错的音乐播放器应用源码案例,优雅音乐播放器应用源码,该应用的界面有点类似小米音乐播放器,应用的整天布局还没有那 人气:3328运行环境:/android/i ...

  4. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  5. 最新依米花H5音乐播放器系统源码+Thinkphp内核

    正文: 最新依米花H5音乐播放器系统源码+Thinkphp内核,源码0加密,如果无法发送邮箱和短信啥的,就是你没配置好,自己去检查. 安装环境: 国内外服务器都可以用 主机无法运行 需求环境 php7 ...

  6. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

  7. 【博主推荐】html好看的音乐播放器(附源码)

    html好看的音乐播放器 文章目录 1.主界面列表效果 2.主界面详情效果 3.背景风格1-背景色轮动 4.背景风格2-图片轮动 5.MP3免费下载 5.1 MyFreeMP3 5.2.铜钟音乐 源码 ...

  8. 从零开始撸音乐播放器(源码可下载)

    演示视频 哈哈,自己是真的弱.被生活狠狠打脸了. Java课设要搞音乐播放器.然而老师只讲了输入输出啥的,其他自学. 从零开始撸代码. 1 .从sound,到AppletPlayer又到Player. ...

  9. 基于Python+tkinter+pygame的音乐播放器完整源码

    import os import tkinter import tkinter.filedialog import random import time import threading import ...

最新文章

  1. Datawhale浙大分享(附投票结果)
  2. 董小姐的空调不一定能当发电站,但牛放屁确实可以发电
  3. 尼康单反相机测试软件,尼康D4S数码单反相机专题测试
  4. logging 日志输出乱码 info_接口自动化测试中logging实际用法
  5. 小米10pro使用说明书_华为Mate40、华为P40和小米10拍照对比:哪一款最好?
  6. dataframe 如何选中某列的一行_带你领略pandas中多表之间如何处理
  7. 关于AM335X移植SDIO WIFI的简易教程(转)
  8. PAT乙级(Basic Level)真题--跟奥巴马一起编程(15)
  9. Java新职篇:for循环
  10. C# 遍历DLL导出函数
  11. 面向对象闲话(一)——什么是对象
  12. 堆排序(Java语言实现)
  13. SuperScan扫描器
  14. 黑客到底有多黑-黑客群体构成,技术起源概述
  15. the sdk seems invalid pycharm
  16. Excel个人所得税简洁计算公式
  17. 新手期货开户的时候需要准备什么呢?
  18. Windows 10源码一览!
  19. openssl(CVE-2014-0160)心脏出血漏洞复现
  20. 耀耀学院task1-task3练习总结

热门文章

  1. Android 9.0蓝牙音乐上一首、下一首、暂停和播放
  2. 社区项目发现的问题四 datatable的注意事项
  3. 如何让随机出现的列表元素只出现一次 python——求解
  4. TypeScript简记
  5. 為Raspberry Pi 安裝Raspbian系統的詳細步驟 (Mac OS版本)
  6. [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
  7. echarts中国地图飞线图demo
  8. 超星/智慧树 网课答案查询 高正确率
  9. 片上总线Wishbone 学习—— 转载请注明出处:http://blog.csdn.net/ce123
  10. springboot实现数据库数据导出生成Excel报表