📄 新建 文本文档.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 + -