基于AT89C51制作的数字音乐盒

发布者:创意航海最新更新时间:2020-10-10 来源: 51hei关键字:AT89C51  数字音乐盒 手机看文章 扫描二维码
随时随地手机看文章

#include

#define uchar unsigned char

#define uchar unsigned char

#define uint unsigned int

#define  LCDPORT P0

uchar code tab[]="Press key";

uchar code tab1[]="Select song";

uchar code tab2[]="First Song" ;

uchar code tab3[]="butterfly";

uchar code tab4[]="Second Song"        ;

uchar code tab5[]="Jingle bell ";

uchar code tab6[]="Third Song" ;

uchar code tab7[]="Yesterday";

uchar code tab8[]="Forth Song" ;

uchar code tab9[]="Youth League";

sbit LCDE=P2^2;

sbit LCDRW=P2^1;

sbit LCDRS=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;        

unsigned char code Music_Girl[]=

{ 0x1B,0x02, 0x1A,0x02, 0x1B,0x02, 0x19,0x66, 0x1A,0x03,

  0x18,0x02, 0x17,0x02, 0x16,0x0D, 0x17,0x03, 0x18,0x0D,

  0x17,0x03, 0x19,0x66, 0x17,0x03, 0x16,0x0D, 0x17,0x03,

  0x19,0x0D, 0x16,0x03, 0x17,0x0D, 0x18,0x03, 0x17,0x0D,

0x16,0x03, 0x15,0x00, 0x19,0x02, 0x11,0x02, 0x16,0x02,

0x10,0x02, 0x15,0x02, 0x0F,0x00, 0x10,0x03, 0x15,0x03,

0x0F,0x00, 0x0D,0x01, 0x0F,0x66, 0x10,0x03, 0x15,0x66,

0x16,0x03, 0x10,0x0D, 0x15,0x03, 0x0F,0x03, 0x19,0x66,

0x1F,0x03, 0x1A,0x0D, 0x19,0x03, 0x17,0x03, 0x19,0x03,

0x16,0x00, 0x16,0x66, 0x17,0x03, 0x11,0x0C, 0x10,0x02,

0x19,0x66, 0x10,0x03, 0x15,0x02, 0x16,0x02, 0x0D,0x02,

  0x15,0x02, 0x10,0x0D, 0x0F,0x03, 0x10,0x0D, 0x15,0x03,

  0x0F,0x00, 0x17,0x66, 0x19,0x03, 0x11,0x02, 0x16,0x02,

0x10,0x0D, 0x15,0x03, 0x0F,0x15, 0x0D,0x03, 0x0F,0x02,

0x0D,0x03, 0x0F,0x0D, 0x10,0x03, 0x11,0x0D, 0x16,0x03,

  0x10,0x00, 0x0F,0x0D, 0x10,0x03, 0x15,0x66, 0x16,0x03,

  0x19,0x02, 0x17,0x02, 0x16,0x02, 0x17,0x0D, 0x16,0x03,

  0x15,0x02, 0x10,0x0D, 0x0F,0x03, 0x0D,0x01, 0x15,0x01,

0x10,0x03, 0x15,0x04, 0x10,0x0D, 0x0F,0x03, 0x0D,0x0D,

0x0F,0x03, 0x10,0x0D, 0x15,0x03, 0x0F,0x00, 0x17,0x0D,

0x19,0x03, 0x16,0x0D, 0x17,0x03, 0x16,0x0D, 0x15,0x03,

  0x11,0x02, 0x10,0x02, 0x0F,0x00, 0x00,0x00 };

unsigned char code Music_Jingle[]={

0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03,

0x0F,0x66, 0x19,0x04, 0x19,0x04, 0x0F,0x03, 0x17,0x03,

0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x03, 0x10,0x03,

0x18,0x03, 0x17,0x03, 0x16,0x03, 0x10,0x66, 0x10,0x03,

0x19,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x17,0x02,

0x15,0x03, 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03,

0x15,0x03, 0x0F,0x66, 0x0F,0x03, 0x0F,0x03, 0x17,0x03,

0x16,0x03, 0x15,0x03, 0x10,0x66, 0x10,0x03, 0x10,0x03,

0x18,0x03, 0x17,0x03, 0x16,0x03, 0x19,0x03, 0x19,0x03,

0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x18,0x03,

0x16,0x03, 0x15,0x66, 0x17,0x03, 0x17,0x03, 0x17,0x02,

0x17,0x03, 0x17,0x03, 0x17,0x02, 0x17,0x03, 0x19,0x03,

0x15,0x03, 0x16,0x03, 0x17,0x01, 0x18,0x03, 0x18,0x03,

0x18,0x67, 0x18,0x04, 0x18,0x03, 0x17,0x03, 0x17,0x03,

0x17,0x04, 0x17,0x04, 0x17,0x03, 0x16,0x03, 0x16,0x03,

0x15,0x03, 0x16,0x03, 0x19,0x66, 0x19,0x03, 0x19,0x03,

0x18,0x03, 0x16,0x03, 0x15,0x02, 0x00,0x00  };

unsigned char code Music_Two[] ={

0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,

0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,

0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,

0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,

0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,

0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,

0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,

0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,

0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,

0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,

0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,

0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,

0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,

0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,

0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,

0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,

0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,

0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,

0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,

0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,

0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,

0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,

0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,

0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,

0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,

0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,

0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,

0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,

0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,

0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,

0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,

0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,

0x10,0x03, 0x15,0x00, 0x00,0x00 };

unsigned char code Music_Yesterday[]={

0x15,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x19,0x02,

0x19,0x03, 0x17,0x03, 0x19,0x03, 0x17,0x03, 0x1A,0x02,

0x19,0x66, 0x17,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x02,

0x16,0x02, 0x17,0x03, 0x19,0x02, 0x1A,0x15, 0x17,0x03,

0x19,0x03, 0x1A,0x02, 0x21,0x02, 0x20,0x03, 0x1F,0x02,

0x1B,0x03, 0x1B,0x66, 0x19,0x03, 0x17,0x03, 0x19,0x02,

0x17,0x02, 0x16,0x14, 0x15,0x03, 0x15,0x03, 0x16,0x03,

0x17,0x03, 0x19,0x02, 0x19,0x03, 0x19,0x03, 0x17,0x03,

0x19,0x03, 0x17,0x03, 0x1A,0x03, 0x19,0x02, 0x17,0x03,

0x17,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1B,0x02,

0x17,0x03, 0x19,0x02, 0x1A,0x03, 0x1A,0x01, 0x1B,0x02,

0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66, 0x1B,0x03,

0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x02, 0x1A,0x66,

0x1A,0x03, 0x1B,0x03, 0x1F,0x02, 0x1F,0x02, 0x1A,0x03,

0x1F,0x02, 0x20,0x03, 0x20,0x16, 0x1F,0x02, 0x20,0x02,

0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x02, 0x20,0x03,

0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66,

0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1F,0x03, 0x20,0x03,

0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x02,

0x20,0x03, 0x1F,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66,

0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1A,0x03, 0x1B,0x03,

0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03,

0x20,0x66, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x02,

0x1F,0x03, 0x20,0x66, 0x1F,0x03, 0x20,0x03, 0x21,0x02,

0x21,0x02, 0x20,0x03, 0x1F,0x02, 0x1A,0x03, 0x1A,0x02,

0x17,0x02, 0x17,0x03, 0x1A,0x03, 0x17,0x03, 0x19,0x03,

0x19,0x14, 0x17,0x03, 0x17,0x03, 0x16,0x04, 0x15,0x04,

0x15,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x18,0x02,

0x16,0x03, 0x16,0x14, 0x17,0x03, 0x17,0x03, 0x17,0x03,

0x18,0x02, 0x16,0x03, 0x16,0x16, 0x15,0x03, 0x16,0x03,

0x17,0x03, 0x16,0x01, 0x1F,0x02, 0x20,0x02, 0x21,0x03,

0x21,0x03, 0x21,0x03, 0x21,0x02, 0x20,0x03, 0x1F,0x03,

0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x03, 0x1A,0x02,

0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1F,0x02, 0x20,0x02,

0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x66, 0x20,0x03,

0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66,

0x17,0x03, 0x19,0x03, 0x19,0x00, 0x00,0x00 };



uchar k;

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;

[1] [2] [3] [4]
关键字:AT89C51  数字音乐盒 引用地址:基于AT89C51制作的数字音乐盒

上一篇:51单片机自动售水机程序
下一篇:两路电机驱动 H桥L9110

推荐阅读最新更新时间:2024-11-16 20:49

基于智能传感器的弹药库温/湿度监控系统设计
1 引言 弹药从出厂到部队作战或训练使用以前主要存放在仓库中。在长期的储存过程中,弹药虽然处于宏观静止状态。但其质量不断发生变化。这是因为弹药主要由金属和装药组成.在长期储存过程中,由于温,湿度的影响。金属会锈蚀.从而使金属部件的强度降低。表面机械性能变坏,严重影响弹药的使用.甚至会造成重大事故。温,湿度还会使弹药装药的物理和化学性质发生变化.从而使其失去应有的战技要求。因此,温,湿度是弹药质量发生变化的主要矛盾。根据我军的仓库条件、我国的气候条件和目前仓库的管理水平.通常规定最高温度不超过30℃.最大湿度不超过。70%.即通常所说的“三七”线。 传统弹药仓库的监控系统采用的是干,湿球湿度计、毛发湿度计、湿敏电阻器或由普通的温,
[单片机]
基于智能传感器的弹药库温/湿度监控系统设计
基于AT89C51的时间/位移换向控制器设计
引言   在实际生产过程中,常常要用到具有自动换向功能的控制部件,如机械加工中的往返运行(位移),直流电源的正反向输出,电动机的正反转运行等现象,都是当正向(或反向)运行到一定时间或一定位置时,自动换为反向(或正向)运行,周而复始的过程。实现这一过程的自动化,就是设计一套控制电路,再配以位移传感器或时间继电器。目前市场现有的时间继电器虽然可以用多个组合来满足一些使用场合的要求,但仍存在着重复计时误差大,稳定可靠运行性不高,使用不方便灵活等问题。为此,笔者研发了以单片机为核心组成的时间/位移换向控制器SWHX-1,该系统具有成本低等特点,可完全且克服以上不足。 电路组成及工作原理   SWHX-1的内部电路如图1所示。该系统分
[单片机]
AT89C51的串口和电脑的串口进行通信
串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而且也能实现电脑对单片机的控制,比如你可以把写入单片机的数据码显示在电脑上,如可以使用一个按键,当按下它时使某一个字母如:AA,通过单片机的串口将它发送到电脑上显示,起到仿真器的某些功效,站长在开发数据采集设备时就是通过串口来检查数据正确与否的。 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我
[单片机]
<font color='red'>AT89C51</font>的串口和电脑的串口进行通信
AT89C51单片机详解
上面是AT89C51单片机的RAM内存分布表,必须要了解! 二进制需要加B,十进制加D也可以省略,十六进制需要加H,A~F前要加0 电源控制寄存器PCON
[单片机]
一种单片机电话单机测试仪的设计
随着我国电讯业的迅速发展,电话单机需求量激增,为此研制了一种能快速、准确测试电话单机主要性能并对其故障定位的测试仪器。测试仪的特点为:信号方式、接口形式符合有关用户交换机的国家标准;操作方法上符合人们的操作习惯;功能较全、测试速度快、定位准确。 单片机电话测试仪的主要功能为: ·环阻测量:测量用户摘机状态环路接通电阻Ron和挂机状态的漏电流Ioff; ·脉冲拔号测量:包括测量脉冲串的个数、速率、断续比、间隔等参数; ·双音拔号测量:测量译码准确性、持续时间、最小间隔等参数; ·5km仿真功能:模拟话机应用的真实环境,测量话机功能是否正常; ·振铃测试功能; ·内部通话功能。 1 硬件框图及工作原理 硬件框图如
[单片机]
基于LM317和AT89C51数字显示可调稳压电源设计
  1引言   直流稳压电源是能够保证在电网电压波动或负载发生变化时,输出稳定的电压的常用的电子设备。它广泛应用于仪器仪表、工业控制及测量领域中。故设计、制造一个低纹波、高精度的直流稳压电源在电源技术中占有十分重要的地位。   2设计要求   本文设计的稳压电源的要求具有输出电流大、输出电阻小、稳压系数低的特点,并将模拟电压转换为数字信号,通过LED直观的显示出来,使整个电源更加人性化。设计的具体参数要求为:输出电压在1.5伏至30伏连续可调,最大输出电流可至1.5安,稳压系数小于0.01,输出电阻小于0.1欧,显示精度达到0.2级标准。   3系统硬件设计   3.1总体设计   本设计包含主电源和辅助电源模块的设计、电
[单片机]
基于LM317和<font color='red'>AT89C51</font>的<font color='red'>数字</font>显示可调稳压电源设计
基于51单片机的自动温度测量报警系统设计
目前,无论是在工业生产中还是在科研实验中通过对温度测量来进行自动控制的设备越来越普及,应用场合也越来越多。随之而来的问题是,如何能够测得精确的温度以保证自动控制设备能够正确地发出控制指令来控制生产过程。另一方面,如果温度过高可能会对一些设备中的一些半导体元器件造成损坏。因此,对于自动高温报警的需求也在逐渐增加。本文基于以上方面的考虑,研究并设计了一种基于单片机的自动温度测量与报警系统。 1 系统硬件设计 尽管目前市场上单片机的品种多样,功能也越来越多,但是受成本约束,性能优良的8位单片机仍然是工业检测与控制应用领域的首选。 本系统就是以ATMEL公司的AT89C51单片机为中心,通过模数转换器AD7812对温度传感器的输
[单片机]
基于51单片机的自动温度测量报警系统设计
嵌入式频率计的设计
1   引   言      本频率计的设计以AT89C51单片机为核心,利用他内部的定时/计数器完成待测信号周期/频率的测量。单片机AT89C51内部具有2个16位定时/计数器,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出时中断要求的功能。在定时器工作方式下,在被测时间间隔内,每来一个机器周期,计数器自动加1(使用12 MHz时钟时,每1μs加1),这样以机器周期为基准可以用来测量时间间隔。在计数器工作方式下,加至外部引脚的待测信号发生从1到0的跳变时计数器加1,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入在每个机器周期被采样一次,这样检测一次从1到0的跳变至少需要2个机器周期(24个振荡周期),所
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved