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

📄 新建 文本文档.txt

📁 根据此编程方式
💻 TXT
字号:
#include<reg51.h>
#include<intrins.h>
#define FREQ 11059200
#define CTH0 0xee   //保证在11059200的晶振下,溢出时间为50ms
#define CTH1 0x00
#define uchar unsigned char
#define unit unsigned int
sbit mode =P2^0	;	//定义按键	 ,模式,加减, 播放   
sbit  up  =P2^1;
sbit down =P2^2;
sbit ent  =P2^3;
sbit ledb0=P3^4;	//定义位选
sbit ledb1=P3^5;
sbit ledb2 =P3^6;
sbit ledb3=P3^7	 ;
uchar bdata flags=0;
sbit modle =flags^0;
sbit  musicOn=flags^1;
sbit busy =flags^2 ;  //若正在播放,则busy为1
sbit point =flags^3;
uchar dispon =0; //位选计数
uchar timeSec=0;	//定义当前时间
uchar timeMin=0;
uchar timeHour=12;
uchar alrmSec =0;	//定义定时时间
uchar alrmMin=0;
uchar alrmHour=13;
uchar date disp_buffer[4]={0,0,0,0 };  //显示 缓冲	  分别    存 秒 分位,秒十位
//定义0,1,2,3,4,5,6,7,8,9,A,b ,C,d,E,F,P,t,o,n,-,u,r,sp的段码
uchar code duan_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                       0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,078,0x5c,0x54,
                       0x40,0x81,0x88,0x3e,0x70,0x00    };
//音乐编码2——存储定义
//音符格式,D7,D6,D5,D4,/D3,D2,D1,D0
//两只老虎的曲谱
unchar code music_table[]={0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x16,0x14,0x33,0x31      };
uchar code music_1_table[8]={0,1,2,3,4,6,8,16};//节拍延时时间
uchar code music-freq-table[16]={0xff,0xea, 
             255-FREQ/24/1049/256,256-FREQ/24/1049%256,
             255-FREQ/24/1178/256,256-FREQ/24/1178%256,
             255-FREQ/24/1178/256,256-FREQ/24/1322%256,
             255-FREQ/24/1400/256,256-FREQ/24/1400%256,
	     255-FREQ/24/1572/256, 256-FREQ/1572%256,
	     255-FREQ/24/1665/256,256-FREQ/24/1665%256,
             255-FREQ/24/1869/256,256-FREQ/24/1869%256  
                                                    };

uchar temp_TH1;
uchar temp_TL1;
sbit PIN_MSC=P2^7;
void music_delay(uchar n);//延时程序
void music_play(uchar *msc);//播放音乐子程序 
//-----------------------------------------------------------
 void music_int_t1(void) interrupt 3 using 1    //定时器1中断子程序
    {PIN_MSC=~PIN_MSC;
     TH1=temp_TH1;
     TL1=temp_TL1;    
     }
//-----------------------------------------------------------
  void music_delay(uchar n)//延时125毫秒
  {uchar i=125,j;
   do {
    do{
     for(j=0;j<230,j++)
     _nop_();
     }while(i--);
    }while(n--);
   }
//---------------------------------------------------------
void music_play(uchar *msc)
{uchar music_long;//节拍
 uchar music_data=0;//音符数据1,2,3,4,5,6,7
 temp_TH1=0xff;
 temp_TL1=0xea;
 TMOD=0X11;//设置定时器1为1模式(多余)
 TR1=1;//开定时器1中断
 ET1=1;
 while(*msc!=0x00)//   因为0x00为字符数组最后一个元素‘\0‘的标志,即播放完
   { music_data=*msc&0x07;
     music_long=*msc>>4;
     if(music_long!=0)
     {
      temp_TH1=music_freq_table[music_data<<1];
      temp_TL1=music_freq_table[(music_data<<1)+1];
      music_delay(music_1_table[music_long&0x07]    );

     }
     msc++;
             }
  ET1=0;//关中断
  PIN_MSC=1;
 

}

//-----------------------------------------------------------
void main(void)
{
    TMOD=0X11;//设置定时器0,1为1模式
    SCON =0X52;//多余的
    TH0=CTH0;  //开定时器0中断
    TL0=CTL0;
    EA=1;
    ET0=1;
    TR0=1;
    do
    {
    if(timeHour==alrmHour&&timeMin==alrmMin&&!busy      ) 
      { busy=1;
       music_play(music_table);
       busy=0; 
      }
   if(musicOn&&!busy)
  {    
   busy=1;
   music_play(music_table);
   busy=0;
   musicOn=0;

  }
}while(1);
}
//------------------------------------------------------------
  void keyset(void)      //按键处理程序
{  if(up==0)
    {if(!modle)
     {
      if(++timeMin>59)
       { timeMin=0;
         if(++timeHour>23)
          timeHour=0;
        }
      else
       {
         if(++alrmMin>59)
         {
          alrmMin=0;
          if(++alrmHour>23)
           alrmHour=0; 
        }
       }
    }
   }
 else if(down==0)
 { if(!modle)
   { if(!timeMin--)
     {
      timeMin=59;
      if(!timeHour--)
      timeHour=23;
      }
   }
   else
  { if(!alrmMin--)
    {  alrmMin=59;
      if(!alrmHour--) alrmHour=23;
    }
  
   }

 }


 else if(mode==0)
 {   modle=~modle;}
 else if(ent==0&&!busy)
   {musicOn=1;}
}  
//------------------------------------------------------------
  void timeset(void)
  {
   if(++timeSec>59)
     {timeSet=0;
      if(++timeMin>59) 
      { timeMin=0;
     if(++timeHour>23)
       timeHour=0;}- }
  } 
 
//-----------------------------------------------------------
void timer0(void) interrupt 1 using1   //显示定时器刷新显示
{ static uchar mspulse=0;
  static uchar keytime=0;
  TH0=CTH0;
  TL0=CTL0;
  P0=0X00;  //全灭
  P3=P3|0xf0;//位选全为1 
  if(dispon=2&&point)   // 不懂???????????????
 P0=duan_table[disp_buffer[dispon]|0x80];
 else P0= duan_table[disp_buffer[dispon]];
 switch(dispon)           //位选
 {
  case 0: ledb3=0;break;
  case 1: ledb2=0;break;
  case 2: ledb1=0;break;
  case 3: ledb0=0;break;
  default:        break;
 }
 if(++dispon>3) dispon=0;
   if(!modle)   // 时间模式  
   {
    disp_buffer[0]=timeMin%10;
    disp_buffer[1]=timeMin/10;
    disp_buffer[2]=timeHour%10;
    disp_buffer[3]=timeHour/10;
    }
   else 
  {
    disp_buffer[0]=alrmMin%10;
    disp_buffer[1]=alrmMin/10;
    disp_buffer[2]=alrmHour%10;
    disp_buffer[3]=alrmHour/10; }
  if(mode==0||up==0||down==0||ent==0)
  {
   if(++keytime>15)
    {keytime=0;
     keyset();
    }
               
  }
 else keytime=0;
if(mspulse>200)
  {if(!modle)
   point=~point;
   mspulse=0;
   timeset();
   

  }



}























⌨️ 快捷键说明

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