|
仿真一個數碼管電子鐘,問題在代碼后面。代碼和原理圖如下:
- #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]的位置換一下就不行了呢?
|
|