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

📄 音乐电脑时钟控制器.c

📁 根据此编程方式
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define FREQ 11059200
#define CTH0 0xee   //保证在11059200的晶振下,溢出时间为50ms
#define CTL0 0x00
#define uchar unsigned char
#define unit unsigned int
sbit mode =P2^0	;	//定义按键	 ,模式,加减, 播放   
sbit  up  =P2^1;
sbit define=P1^0;
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 data 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,0x78,0x5c,0x54,0x40,0x81,0x88,0x3e,0x70,0x00};
//音乐编码2——存储定义
//音符格式,D7,D6,D5,D4,/D3,D2,D1,D0
                             //两只老虎的曲谱
uchar 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[]={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 x);//延时程序
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;		  
  while(--n){

    do{
        for(j=0;j<230;j++)
     _nop_();
     }while(--i);	  	
    }  
   }
//---------------------------------------------------------
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;
 ET1=1;	 
 //while(*msc!=0x00)//   因为0x00为字符数组最后一个元素‘\0‘的标志,即播放完
  while (*msc!=0x00)
   { 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;			 // 关输出
  define=0;

}

//-----------------------------------------------------------
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)
     {timeSec=0;
      if(++timeMin>59) 
      { timeMin=0;
     if(++timeHour>23)
       timeHour=0;}}
  } 
 
//-----------------------------------------------------------
void timer0(void) interrupt 1 using 1       //显示定时器刷新显示
{ static uchar mspulse=0;
  static uchar keytime=0;					   //INT0,T0,INT1,T1,RX,分别为0,1,2,3,4,
  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]];
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>40)
    {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 + -