|
仿真一个数码管电子钟,问题在代码后面。代码和原理图如下:
- #include<reg51.h>//头文件
- #define uchar unsigned char//宏定义
- #define uint unsigned int
- sbit s1=P1^0;
- sbit s2=P1^1;
- sbit s3=P1^2;//按键123
- sbit fmq=P3^6;
- sbit fmqkg=P3^7;
- uint nian=2015,yue=5,ri=26;//初始化定义2015年5月26日
- signed char shi=16,fen=5,miao=0,xingqi=2,ns=7,nf=30,nm=0;//时分秒23-59-50,星期2,闹时分秒7:30:00
- uchar qiehuan=0,shanshuo=0,tiaojie=0,jishi=0,jishu=0,c[8]; //切换,闪烁,调节,计时,计数。
- uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9“-”“不显示”
- uchar code b[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//P2打开次序
- void yanshi(uchar d) //延时
- {
- uchar e,f;
- for(e=d;e>0;e--)
- for(f=120;f>0;f--);
- }
- void shijianxianshi() //时间显示
- {
- uchar g,h;
- for(g=0;g<8;g++)
- {
- P2=0; //关P2,不关也没事。关了放心点。
- h=c[g];
- P0=a[h];
- h=b[g];
- if(shanshuo)
- {
- if(tiaojie==1&(g==0|g==1))h=0; //若调节等于1,秒闪烁
- if(tiaojie==2&(g==3|g==4))h=0;//若调节等于2,分闪烁
- if(tiaojie==3&(g==7|g==6))h=0; //若调节等于3,时闪烁
- }
- P2=h;
- yanshi(5);
- P2=0; //消影
- }
- c[7]=shi/10; //分离时分秒
- c[6]=shi%10;
- c[5]=10; //“显示-”
- c[4]=fen/10;
- c[3]=fen%10;
- c[2]=10;
- c[1]=miao/10;
- c[0]=miao%10;
- if(shi<10)c[7]=11;//若小时小于10,0不显示。
- }
- void riqixianshi() //日期 显示
- {
- uchar i,j;
- for(i=0;i<8;i++)
- {
- P2=0;
- j=c[ i];
- P0=a[j];
- j=b[ i];
- if(shanshuo)//调节时对应的位置闪烁
- {
- if(tiaojie==4&(i==0|i==1))j=0; //日
- if(tiaojie==5&(i==2|i==3))j=0; //月
- if(tiaojie==6&(i==7|i==6|i==5|i==4))j=0;//年闪烁
- }
- P2=j;
- yanshi(5);
- P2=0;
- }
- c[7]=nian/1000%10;
- c[6]=nian/100%10;
- c[5]=nian/10%10;
- c[4]=nian%10;
- c[3]=yue/10;
- c[2]=yue%10;
- c[1]=ri/10;
- c[0]=ri%10;
- }
- void xingqixianshi() //星期显示
- {
- P2=0x40; //01000000
- P0=0X3F; //00111111 显示“.”“-”
- yanshi(5);
- P2=0;
- P2=0x20; //00100000
- P0=a[xingqi]; //星期显示位置
- yanshi(5);
- P2=0;
- P2=0x10; //00010000
- P0=0XbF; // 显示“-”
- yanshi(5);
- P2=0;
- P2=0x08; //00001000
- P0=0X7F; //显示“.”
- yanshi(5);
- P2=0;
- }
- void fengmingqi() //蜂鸣器
- {
- if(fen==0&&miao==0)//整点报时
- fmq=0; //报时1秒
- if(fen!=0||miao!=0)//1秒过后
- fmq=1; //关蜂鸣器
- if(shi==ns&&fen==nf) //闹钟1分钟
- fmq=0;
- if(shi!=ns||fen!=nf) //1分钟过后
- fmq=1; //关蜂鸣器
- }
- void naozhongxianshi() //闹钟显示
- {
- uchar k,l;
- for(k=0;k<8;k++)
- {
- P2=0;
- l=c[k];
- P0=a[l];
- l=b[k];
- if(shanshuo)
- {
- if(tiaojie==7&(k==3|k==4))l=0;
- if(tiaojie==8&(k==7|k==6))l=0;
- }
- P2=l;
- yanshi(5);
- P2=0;
- }
- c[7]=ns/10;
- c[6]=ns%10;
- c[5]=10;
- c[4]=nf/10;
- c[3]=nf%10;
- c[2]=10;
- c[1]=nm/10;
- c[0]=nm%10;
- if(shi<10)c[7]=11;
- }
- void anjian()
- {
- if(s1==0)//若S1按下
- {
- yanshi(10); //延时
- if(s1==0) //确认按下
- {
- while(!s1); //等待放开
- tiaojie++;
- TR0=0; //关定时器0
- TR1=1; //开定时器1
- if(tiaojie==11) //若调节到了11
- {
- tiaojie=0; //置零
- TR1=0; //关计时器1;
- TR0=1; //开计时器0
- }
- }
- }
- /* if(s2==0)
- {
- while(!s2);
- switch(tiaojie)
- {
- case 1:qiehuan=0;miao++;if(miao==60)miao=0;break;
- case 2:qiehuan=0;fen++;if(fen==60)fen=0;break;
- case 3:qiehuan=0;shi++;if(shi==24)shi=0;break;
- case 4:qiehuan=1;ri++;if(yue==2&&(nian%4==0)&&ri==30)ri=1; //年能整除4的2月,29天。
- else if(yue==2&&ri==29)ri=1; //其他的2月28天
- else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1; //小月30天
- else if(ri==32)ri=1;break; //其他的31天
- case 5:qiehuan=1;yue++;if(yue==13)yue=1;break;
- case 6:qiehuan=1;nian++;if(nian==10000)nian=0;break;
- case 7:qiehuan=3;nf++;if(nf==60)nf=0;break;
- case 8:qiehuan=3;ns++;if(ns==24)ns=0;break;
- case 9:qiehuan=2;xingqi++;if(xingqi==8)xingqi=1;break;
- case 10:fmqkg=0;break;
- default:qiehuan=0;
- }
- }
- if(s3==0)
- {
- while(!s3);
- switch(tiaojie)
- {
- case 1:qiehuan=0;miao--;if(miao==-1)miao=59;break;
- case 2:qiehuan=0;fen--;if(fen==-1)fen=59;break;
- case 3:qiehuan=0;shi--;if(shi==-1)shi=23;break;
- case 4:qiehuan=1;ri--;if(yue==2&&(nian%4==0)&&ri==0)ri=30; //年能整除4的2月,29天。
- else if(yue==2&&ri==0)ri=29; //其他的2月28天
- else if((yue==4||yue==6||yue==9||yue==11)&&ri==0)ri=31; //小月30天
- else if(ri==0)ri=31;break; //其他的31天
- case 5:qiehuan=1;yue--;if(yue==0)yue=12;break;
- case 6:qiehuan=1;nian--;if(nian==10000)nian=9999;break;
- case 7:qiehuan=3;nf--;if(nf==-1)nf=59;break;
- case 8:qiehuan=3;ns++;if(ns==-1)ns=23;break;
- case 9:qiehuan=2;xingqi--;if(xingqi==0)xingqi=7;break;
- case 10:fmqkg=0;break;
- }
- }*/
- if(tiaojie==1) //调秒
- {
- qiehuan=0;
- if(s2==0)
- {
- while(!s2);
- miao++;
- if(miao==60)miao=0;
- }
- if(s3==0)
- {
- while(!s3);
- miao--;
- if(miao==-1)miao=59;
- }
- }
- if(tiaojie==2) //调分
- {
- qiehuan=0;
- if(s2==0)
- {
- while(!s2);
- fen++;
- if(fen==60)fen=0;
- }
- if(s3==0)
- {
- while(!s3);
- fen--;
- if(fen==-1)fen=59;
- }
- }
- if(tiaojie==3) //调时
- {
- qiehuan=0;
- if(s2==0)
- {
- while(!s2);
- shi++;
- if(shi==24)shi=0;
- }
- if(s3==0)
- {
- while(!s3);
- shi--;
- if(shi==-1)shi=23;
- }
- }
- if(tiaojie==4)//调日
- {
- qiehuan=1;
- if(s2==0)
- {
- while(!s2);
- ri++;
- if(yue==2&&(nian%4==0)&&ri==30)ri=1; //年能整除4的2月,29天。
- else if(yue==2&&ri==29)ri=1; //其他的2月28天
- else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1; //小月30天
- else if(ri==32)ri=1; //其他的31天
- }
- if(s3==0)
- {
- while(!s3);
- ri--;
- if(yue==2&&(nian%4==0)&&ri==0)ri=30;
- else if(yue==2&&ri==0)ri=29;
- else if((yue==4||yue==6||yue==9||yue==11)&&ri==0)ri=31;
- else if(ri==0)ri=31;
- }
- }
- if(tiaojie==5) //调月
- {
- qiehuan=1;
- if(s2==0)
- {
- while(!s2);
- yue++;
- if(yue==13)yue=1;
- }
- if(s3==0)
- {
- while(!s3);
- yue--;
- if(yue==0)yue=12;
- }
- }
- if(tiaojie==6) //调年
- {
- qiehuan=1;
- if(s2==0)
- {
- while(!s2);
- nian++;
- if(nian==10000)nian=0;
- }
- if(s3==0)
- {
- while(!s3);
- nian--;
- if(nian==10000)shi=9999;
- }
- }
- if(tiaojie==7)//调闹钟分
- {
- qiehuan=3;
- if(s2==0)
- {
- while(!s2);
- nf++;
- if(nf==60)nf=0;
- }
- if(s3==0)
- {
- while(!s3);
- nf--;
- if(nf==-1)nf=59;
- }
- }
- if(tiaojie==8)//调闹钟时
- {
- qiehuan=3;
- if(s2==0)
- {
- while(!s2);
- ns++;
- if(ns==24)ns=0;
- }
- if(s3==0)
- {
- while(!s3);
- ns--;
- if(ns==-1)ns=23;
- }
- }
- if(tiaojie==9)//调星期
- {
- qiehuan=2;
- if(s2==0)
- {
- while(!s2);
- xingqi++;
- if(xingqi==8)xingqi=1;
- }
- if(s3==0)
- {
- while(!s3);
- xingqi--;
- if(xingqi==0)xingqi=7;
- }
- }
- if(tiaojie==10)//开关蜂鸣器
- {
- if(s2==0)
- {
- while(!s2);
- fmqkg=0;
- }
- if(s3==0)
- {
- while(!s3);
- fmqkg=1;
- }
- }
- }
- void main()
- {
- TMOD=0X01; //中断器
- TH0=(65535-49990)/256;
- TL0=(65535-49990)%256;
- ET0=1;
- TR0=1;
- EA=1;
- TH1=(65535-49990)/256;
- TL1=(65535-49990)%256;
- ET1=1;
- TR1=0;
- while(1)
- {
- anjian();
- fengmingqi();
- if(qiehuan==0)
- shijianxianshi();
- if(qiehuan==1)
- riqixianshi();
- if(qiehuan==2)
- xingqixianshi();
- if(qiehuan==3)
- naozhongxianshi();
- }
- }
- void dingshiqi1()interrupt 1
- {
- TH0=(65535-49990)/256;
- TL0=(65535-49990)%256;
- jishi++;
- if(jishi==20)
- {
- jishi=0;
- miao++;
- if(miao>29&&miao<36)qiehuan=2; //5秒显示星期
- if(miao>35&&miao<45)qiehuan=1; //9秒显示日期
- if(miao>44||miao<30)qiehuan=0; //其他的时间全显示时间
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- xingqi++;
- if(xingqi==8)xingqi=1;
- ri++;
- if(yue==2&&(nian%4==0)&&ri==30)ri=1;
- else if(yue==2&&ri==29)ri=1;
- else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1;
- else if(ri==32)ri=1;
- if(ri==1)
- {
- yue++;
- if(yue==13)
- {
- yue=1;
- nian++;
- if(nian==10000)//没地方显示了,不然长整型非得弄成几亿年。
- nian=0; //想多了,人生百年虽然短了点,但是也可以了。
- }
- }
- }
- }
- }
- }
- }
- void dingshiqi2()interrupt 3
- {
- TH1=(65535-49990)/256;
- TL1=(65535-49990)%256;
- jishu++;
- if(jishu==40)
- {
- jishu=0;
- shanshuo=shanshuo^0xff;
- }
- }
复制代码
为什么我把P0的位置和h=b[g],h=c[g]的位置换一下就不行了呢?
|
|