项目1 认识单片机及其开发环境

1.1 项目提出

1.任务

利用单片机系统播放一段音乐。

2.要求

(1)按照所给电路图连接单片机系统。

(2)将所给单片机程序调试、编译下载至单片机中,运行单片机系统。

3.播放音乐的单片机电路图

用单片机I/O口P1.7扩展蜂鸣器演奏一首曲子。

4.音乐程序

    /* ***********************************
    这是一首 2002年第一场雪的曲子
    * ***********************************/
    #include<reg51.h>       /*8051单片机资源说明*/
    sbit SPK=P1^7;                 //音乐输出口
    void Delayms(unsigned char ms);     //节拍延时
    unsigned int data j;
    unsigned char code song[636]={      //歌曲数组,格式为:频率常数,节拍常数
    0xFF,0xFF,4,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x5B,4,
    0xFD,0x08,2,0xFC,0xAB,2,
    0xFC,0x0B,2,0xFC,0x0B,2,
    0xFF,0xFF,2,0xFC,0x0B,2,
    0xFC,0xAB,2,0xFC,0xAB,2,
    0xFC,0xAB,2,0xFC,0xAB,2,
    0xFC,0xAB,4,0xFC,0xAB,2,
    0xFC,0xAB,2,
    0xFB,0x8F,2,0xFC,0x0B,2,
    0xFC,0x0B,4,0xFF,0xFF,8,
    0xFF,0xFF,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,4,0xFD,0x08,2,
    0xFD,0x08,2,
    0xFD,0x5B,4,0xFD,0x08,2,
    0xFC,0xAB,4,0xFD,0x08,6,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFC,0xAB,4,0xFC,0xAB,2,
    0xFC,0xAB,2,0xFC,0xAB,2,
    0xFC,0x0B,2,0xFC,0x0B,4,
    0xFF,0xFF,4,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,
    0xFD,0x5B,4,0xFD,0x08,2,
    0xFC,0xAB,4,0xFD,0x08,6,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFC,0xAB,4,0xFC,0xAB,2,
    0xFC,0xAB,2,0xFC,0xAB,2,
    0xFC,0x0B,2,0xFC,0x0B,4,
    0xFF,0xFF,4,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,
    0xFD,0x5B,4,0xFD,0x08,2,
    0xFD,0x5B,2,0xFC,0xAB,2,
    0xFC,0x0B,2,0xFC,0x0B,4,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x03,2,
    0xFB,0x8F,4,0xFB,0x8F,2,
    0xFB,0x03,2,
    0xFC,0x0B,4,0xFB,0x8F,2,
    0xFC,0x0B,2,0xFB,0x03,2,
    0xFA,0x14,2,0xFA,0x14,4,
    0xFF,0xFF,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x5B,4,0xFD,0x08,2,
    0xFD,0x5B,2,0xFC,0xAB,2,
    0xFC,0x0B,2,0xFC,0x0B,4,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xfc,0xab,4,0xfc,0xab,2,
    0xfc,0xab,2,0xfb,0x8f,2,
    0xfc,0x0b,2,0xFC,0x0B,4,
    0xFF,0xFF,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,4,
    0xFD,0x08,2,
    0xfD,0x5b,4,0xfD,0x08,2,
    0xfc,0xab,4,0xfc,0x0b,6,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x03,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x03,2,
    0xFC,0x0B,4,0xFB,0x8F,2,
    0xFC,0x0B,2,0xFB,0x03,2,
    0xFA,0x14,2,0xFA,0x14,4,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFB,0x03,2,0xFB,0x03,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFA,0x14,1,0xF9,0x5B,1,
    0xF8,0x2A,2,0xF8,0x2A,4,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFB,0x8F,2,0xFC,0x08,2,
    0xFC,0x08,2,0xFC,0x08,10,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFB,0x03,2,0xFB,0x03,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFA,0x14,1,0xF9,0x5B,1,
    0xF8,0x2A,2,0xF8,0x2A,4,
    0xFF,0xFF,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x8F,2,0xFB,0x8F,2,
    0xFB,0x03,2,0xFA,0x14,2,
    0xFC,0xAB,2,0xFD,0x08,2,
    0xFD,0x08,2,0xFD,0x08,2,
    0xFF,0xFF,4,0xFF,0xFF,4};
    void main()
    { TMOD=0x01;
      IE=0x82;
      while(1)
      { j=0;
        while (j<636)
        { TR0=1;
          if ((song[j]==0xff)&&(song[j+1]==0xff))
          TR0=0;             //休止符用0xff,0xff表示出现休止符时CT0禁止,不发声
          Delayms(song[j+2]);   //每一音符唱多长
            j=j+3;
          }
          }
    }
    /* 音调程序*/
    void timer0()interrupt 1 using 1  //每一音符唱多高
    {   TH0=song[j];
            TL0=song[j+1];
          SPK = !SPK;
    }
    /* 节拍程序*/
    void Delayms(unsigned char ms) //基本延时子程序(1/16拍的时间)
    { unsigned int i;
      while(ms--)
          {for(i=0;i<10300;i++);  //节拍快慢控制
          }
      TR0=0;
    }