?? 新建 文本文檔.txt
字號(hào):
#include<reg51.h>
#include<intrins.h>
#define FREQ 11059200
#define CTH0 0xee //保證在11059200的晶振下,溢出時(shí)間為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; //位選計(jì)數(shù)
uchar timeSec=0; //定義當(dāng)前時(shí)間
uchar timeMin=0;
uchar timeHour=12;
uchar alrmSec =0; //定義定時(shí)時(shí)間
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 };
//音樂(lè)編碼2——存儲(chǔ)定義
//音符格式,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};//節(jié)拍延時(shí)時(shí)間
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);//延時(shí)程序
void music_play(uchar *msc);//播放音樂(lè)子程序
//-----------------------------------------------------------
void music_int_t1(void) interrupt 3 using 1 //定時(shí)器1中斷子程序
{PIN_MSC=~PIN_MSC;
TH1=temp_TH1;
TL1=temp_TL1;
}
//-----------------------------------------------------------
void music_delay(uchar n)//延時(shí)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;//節(jié)拍
uchar music_data=0;//音符數(shù)據(jù)1,2,3,4,5,6,7
temp_TH1=0xff;
temp_TL1=0xea;
TMOD=0X11;//設(shè)置定時(shí)器1為1模式(多余)
TR1=1;//開(kāi)定時(shí)器1中斷
ET1=1;
while(*msc!=0x00)// 因?yàn)?x00為字符數(shù)組最后一個(gè)元素‘\0‘的標(biāo)志,即播放完
{ 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;//關(guān)中斷
PIN_MSC=1;
}
//-----------------------------------------------------------
void main(void)
{
TMOD=0X11;//設(shè)置定時(shí)器0,1為1模式
SCON =0X52;//多余的
TH0=CTH0; //開(kāi)定時(shí)器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 //顯示定時(shí)器刷新顯示
{ 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) // 時(shí)間模式
{
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();
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -