⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex5-4.c

📁 < 嵌入式C语言程序设计>>一书的源代码
💻 C
字号:
/*
标题:范例 5-4
版本:1.0
Target:89S51
程序描述:这个程序利用89S51演奏生日快乐的歌曲 */
/* ***************************************************** */
#include <REGX51.H>
void delay(unsigned char n);     //函数delay()存在 文件delay.c
code unsigned song[]={
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,0x82,0x01,0x81,
0x94,0x84,0xC4,0xB4,0x04, 0x82,0x01,0x81,0xF4,0xD4,0xB4,
0xA4,0x94,0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,0x82,0x01,0x81,
0x94,0x84,0xC4,0xB4,0x04, 0x82,0x01,0x81,0xF4,0xD4,0xB4,
0xA4,0x94,0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x00};
code int note[]={
0x0000,0xFB03,0xFB8E,0xFC0B,0xFC43,0xFCAB,0xFD08,0xFD32,
                                 
0xFD81,0xFDC7,0xFE05,0xFE21,0xFE55,0xFE83,0xFE99,0xFEC0};
unsigned char i=0;
unsigned char hi_note,low_note;
static void timer1_isr(void) interrupt TF1_VECTOR using 2
{
   TR1=0;
   TL1=low_note;
   TH1=hi_note;
   TR1=1;
   P3_7=3_7;
}               
static void timer1_initialize(void)
{
   EA=0;
   TR1=0;
   TMOD = 0X10;
   ET1=1;
   EA=1;
}
void singing()
{
   unsigned char beat,temp;
   i=0;
   do {
       temp=song[i];              // 读出乐谱的一个byte
       if (temp==0) {             // 如果是0就表示音乐结束
           TR1=0;                 // 停止计时计数器1
           return;                // 返回
       }
       beat=temp & 0x0f;          //取出低阶的4位,这是拍子
       temp=(temp >> 4) & 0x0f;   //取出高阶4位当成音符的频率
       if (temp==0) TR1=0;        //如果拍子是0就表示休止符
       else {
        hi_note=note[temp] >> 8;  //根据音符的频率得到Timer1计数值
           low_note=note[temp] & 0x00FF;
              TR1=1;              //启动计时计数器1
       }
       delay(beat);               // 延迟拍子的时间
       i++;
   } while(1); 
}    
void main (void)  {
   timer1_initialize();
   do {
        singing();
   } while (1);                   // 无穷循环
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -