📄 音乐电脑时钟控制器.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 + -