数码管一闪一闪的,按钮除了复位和K5能按,其它都按不了,而且也没啥反应····
单片机源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit SPK=P1^5;
- sbit K1=P2^0;
- sbit K2=P2^1;
- sbit K3=P2^2;
- sbit K4=P2^3;
- sbit K5=P2^4;
- sbit A1=P1^0;
- sbit A2=P1^1;
- sbit A3=P1^2;
- sbit A4=P1^3;
- uchar miao_g,miao_d,fen_g,fen_d;
- uchar code Num[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar num1;
- uchar code song[]={0x58,0x84,0xA8,0x84,0x68,0x82,0x62,0x5C,0xA4,0xA4,0xA4,0xA4,0x93,0x81,0x9C,0x9C,0xC8,0xC4,0xC8,0xD2,0xC2,0xA8,0x92,0x82,0x6B,0xC4,0xC4,0xC4,0xA8,0x94,0x8C,0xFF};
- //音律部分,前四位为音阶,后四位为节拍,其中以1/4节拍为单位节拍;
- uchar m;
- uchar code yinjie[]={0xff,0xff,0xFC,0x4A,0xFC,0xAE,0xFD,0x08,0xFD,0x30,0xFD,0x80,0xFD,0xC6,0xFE,0x02,0xFE,0x2A,0xFE,0x5C,0xFE,0x84,0xFE,0x98,0xFE,0xC0,0xFE,0xE8,0xFF,0x06};
- //音阶所对应的计时器初值,前两位是占位,中间14位是中音1~7,后面14位是高音1~7,晶振为12MHz;
- uchar ding;
- void delay_1();//1/4节拍函数声明;
- void delay(uint k);//计数器延时函数声明;
- void display(uint fen_g,uint fen_d,uint miao_g,uint miao_d);//数码管显示函数声明;
- void music();//音乐函数声明;
- void delayxiaodou(int n);//消抖函数声明,用于主函数K5;
- //数码管部分
- void delay(uint k) //延时函数,用于计时器计算1s部分和数码管延时显示部分
- { uint x,y;
- for(x=k;x>0;x--)
- for(y=125;y>0;y--);
- }
- void delayxiaodou(int n)
- {
- while(n--);
- }
- void display(uint fen_g,uint fen_d,uint miao_g,uint miao_d) //数码管显示时间
- {
-
- P0=0xFF; //消隐;
- A1=1;A2=0;A3=0;A4=0;
- P0=Num[fen_g];
- delay(1);
- P0=0xFF;
- A1=0;A2=1;A3=0;A4=0;
- P0=Num[fen_d];
- delay(1);
- A1=0;A2=0;A3=1;A4=0;
- P0=0xFF;
- P0=Num[miao_g];
- delay(1);
- A1=0;A2=0;A3=0;A4=1;
- P0=0xFF;
- P0=Num[miao_d];
- delay(1);
- TR0=0;
-
- }
- //倒计时部分
- void timer()interrupt 1 //定时器0,方式1
- {
- TH0=0x3C; //50ms倒计时
- TL0=0xB0;
- num1++;
- if(num1==20) //50ms*20=1s
- { num1=0;
- miao_d--;
- if(miao_d==-1)
- { miao_d=9;
- miao_g--;
- if(miao_g==-1)
- { miao_g=5;
- fen_d--;
- if(fen_d==-1)
- { fen_d=9;
- fen_g--;
- if(fen_g==-1)
- {
- fen_g=5;}}}}}}
- //音乐部分
- void music()
- { uint data j=0;
- uchar data g;
- uchar data i;
- while (*(song+j)!=0xff)//歌曲的停顿;
- { g=*(song+j)&0x0F;//低4位,节拍;
- m=*(song+j)>>4; //高4位,音阶;
- TH1=yinjie[2*m];
- TL1=yinjie[2*m+1];
- TR1=1;
- if((yinjie[2*m]==0xff)&&(yinjie[2*m+1]==0xff))
- { TR1=0;
- SPK=1;}
- for(i=g;i>0;i--)
- { delay_1();
- TR1=0;
- j++;
- }}}
- void delay_1()//1/4 节拍所需要用的时间,约187ms;
- { uchar m,n,p;
- for(m=100;m>0;m--)
- for(n=20;n>0;n--)
- for(p=15;p>0;p--);
- }
- void timer0() interrupt 3 //半个周期后,SPK处的脉冲反相,得到音阶;
- { TH1=yinjie[2*m];
- TL1=yinjie[2*m+1];
- SPK=!SPK;
- }
- //核心处理模块
- void main()
- {
- TMOD=0x01; //启动定时器,初值为50ms;
- TH0=0x3C;
- TL0=0xB0;
- ET0=1; //定义中断;
- ET1=1;
- EA=1;
- TR0=0; //时钟初始化;
- miao_g=miao_d=fen_g=0;
- fen_d=1;
- ding=0;
- while(1)
- {
- display(fen_g,fen_d,miao_g,miao_d);
- if(K5!=0)
- {
- if(K1==0) //K1按键:在1分钟基础上递增,可自定义计时时间;
- { delayxiaodou(100);
- if(K1==0)
- { miao_g=miao_d=0;
- fen_d++;
- if(fen_d==10)
- { fen_d=0;
- fen_g++;
- if(fen_g==6)
- {fen_d=0;
- }}}}
- while(!K1);
- if(K2==0) //K2按键:初值为5分钟;
- { delayxiaodou(100);
- if(K2==0)
- {
- miao_g=miao_d=0;
- fen_d=5;
- fen_g=0;
-
- }
- }
- while(!K2);
- if(K3==0) //K3按键:初值为15分钟;
- { delayxiaodou(100);
- if(K3==0)
- { miao_g=miao_d=0;
- fen_d=5;
- fen_g=1;
-
- }
- }
- while(!K3);
- if(K4==0) //K4按键:初值为20分钟;
- { delayxiaodou(100);
- if(K4==0)
- { miao_g=miao_d=0;
- fen_d=0;
- fen_g=2;
-
- }
- }
- while(!K4);
- }
- if(K5==0) //K5按键:初值设定好后,启动倒计时;
- { delayxiaodou(1);
- if(K5==0)
- { ding++;
- if(ding==2)
- { ding=5;}
- }}
- while(!K5);
- if(ding==5)
- TR0=1;
- //倒计时结束;
- display(fen_g,fen_d,miao_g,miao_d);
- if(fen_g==0&&fen_d==0&&miao_g==0&&miao_d==0)
- music();
- }
- }
复制代码
|