文档库 最新最全的文档下载
当前位置:文档库 › 音乐播放用单片机实现

音乐播放用单片机实现

#include
#include
#define time 100
#define uint unsigned int
#define uchar unsigned char
uint t,flag,flag0,flag1,flag2,flag3,flag4,flag5,minute,second=60; //无符16位数据
uchar num,j,i,k=0; //无符8位数据

uchar code table[]="TIME 00:00";
uchar code table0[]="BY ZHANGYONGLI ";
uint code table1[]={64580,64684,64777,64820,64898,64968,65030};

sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit P1_5=P1^5;
sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit led_red=P2^3;
void write_time(uint addr,uint date);
/////////延时函数///////
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///////延时1S////////////
void delay1(void)
{
uchar a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_;
}
////////1602写命令函数//////
void write_com(uchar com)
{
RS=0; //寄存器选择
P0=com; //命令端口

delay(5);
E=1; //使能端(下降沿)
delay(10);
E=0;
}
//////1602写数据函数//////
void write_date(uchar date)
{
RS=1;
P0=date;
delay(5);
E=1;
delay(10);
E=0;
}
//////按键1处理函数///////
void KEY1()
{
while(flag1)
{
if(key2==0)
{
delay(time);
if(key2==0)
{
if(minute<=60)
minute=minute+1;
write_time(7,minute); //7为地址,MINUTE为数据
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
if(minute>0)
minute=minute-1;
write_time(7,minute);
}
}
if(key4==0||key5==0)
{
delay(150);
if(key4==0||key5==0)
{
flag1=0; //开始计时
flag =1;
TR0=1;
}
}
}
}
//////按键2处理函数//////
void KEY2()
{
minute=5;
write_time(7,minute);
while(flag2)
{
if(key5==0)
{
delay(time); //延时去抖动
if(key5==0)
{
flag2=0; //倒计时
flag =1;
TR0=1;
}
}
}
}
//////按键3处理函数//////
void KEY3()
{
minute=10;
write_time(7,minute);
while(flag3)
{
if(key5==0)
{
delay(time);
if(key5==0)
{
flag3=0;
flag =1;
TR0=1;
}
}
}
}
//////按键4处理函数//////
void KEY4()
{
minute=20;
write_time(7,minute);
while(flag4)
{
if(key5==0)
{
delay(150);
if(key5==0)
{
flag4=0;
flag =1;
TR0=1;
}
}
}
}

void write_time(uint addr,uint date)
{
uint ge,shi;
ge=date%10;
shi=date/10;
write_com(0x80+addr); //
write_date(0x30+shi); //
write_date(0x30+ge); //
if(addr==7&&date==0)

j=1;
if(j==1&&addr==10&&date==0)
{
flag0=1;
TR0=0;
TR1=1;
flag5=1;
}

}
//////初始化函数//////
void init()
{
P1=0xff;
RW=0;
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c); //

显示开,关光标
write_com(0x06); //移动光标
write_com(0x80); //清除LCD的显示内容

TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfc;
TL1=0x44;
ET1=1;
ET0=1;
// TR1=1;
// TR0=1;
EA=1;
flag0=1;
for(num=0;num<12;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0xc0); //
for(num=0;num<12;num++)
{
write_date(table0[num]);
delay(20);
}
}

void start()
{
if(key1==0)
{
delay(time);
if(key1==0)
{
flag0=0; //
flag1=1;
KEY1();
}
}
if(key2==0)
{
delay(time);
if(key2==0)
{
flag0=0;
flag2=1;
KEY2();
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
flag0=0;
flag3=1;
KEY3();
}
}
if(key4==0)
{
delay(150);
if(key4==0)
{
flag0=0;
flag4=1;
KEY4();
}
}

}
void write_time0()
{
minute=minute-1;
write_time(7,minute);
write_time(10,59);
flag=0;
}
void counter()
{
if(t==20)
{
led_red=led_red^1;
if(flag==1)
write_time0(); //
t=0;
second=second-1;

write_time(10,second); //
if(k==1&&second==59)
{
if(minute>0)
minute=minute-1;
//如果59秒 那么分钟的时间减一
write_time(7,minute);
}
if(second==0)
{
k=1;
second=60;
}
}
}
int main()
{
init();
while(1)
{
while(flag0)
start();
counter();
while(flag5)
{
delay1();
i++;
if(i>7)
i=0;
}
}
return 0;
}

void inter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}

void initer1() interrupt 3
{
TH1=table1[i]/256;
TL1=table1[i]%256;
P1_5=~P1_5; //蜂鸣器
if(key5==0)
{
delay(100);
if(key5==0)
{
TR1=0;
flag5=0;
k=0;
j=0;
}
}
}

相关文档
相关文档 最新文档