帶年月日鬧鐘的時鐘 帶proteus仿真
0.png (30.8 KB, 下載次數: 86)
下載附件
2016-6-3 13:48 上傳
帶proteus仿真圖
0.png (98.15 KB, 下載次數: 92)
下載附件
2016-6-3 13:49 上傳
所有資料下載:
hui2.rar
(64.86 KB, 下載次數: 43)
2016-5-30 20:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define play P0
- sbit LSA=P2^0;
- sbit LSB=P2^1;
- sbit LSC=P2^2;
- sbit led=P2^3; //鬧鐘檢測
- sbit k1=P2^7;//功能切換
- sbit k2=P2^6;//設置加
- sbit k3=P2^5;// 設置減
- sbit k4=P2^4; //設置位選
- sbit beet=P1^5; //蜂鳴器輸出口
- uchar y;//按鍵松開
- uchar kai;//鬧鐘開啟標志
- uchar she;//設置標志
- uchar t;//時間計數
- uchar num;//功能切換
- uchar fen;
- uchar shi;
- uchar miao;
- uchar yue;
- uchar nian;
- uchar ri;
- uchar shijian[8];
- uchar shi1; //鬧鈴時
- uchar fen1; //鬧鈴分
- unsigned char code shuma[12]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //數碼管顯示數組0到9
- 0x7f,0x6f,0x40,0x00};
- uchar brunyue[12]={31,28,31,30,31,30,31,31,30,31,30,31};
- uchar runyue[12]={31,29,31,30,31,30,31,31,30,31,30,31};
- void zhongshe();
- void qishe();
- void naoshe();
- void shezhi();
- void delay10ms(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void naozhong()
- { uint a,m;
- if((shi1==shi)&&(fen1==fen)&&(kai%2))
- { for(m=20;m>0;m--)
- for(a=10;a>0;a--)
- if((k1==0)||(k2==0)||(k3==0)||(k4==0))
- { kai=0;break; }
- else
- beet=~beet;
- }
- }
- void plays() //輸出顯示
- {
- unsigned char i;
- unsigned int j;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- play=shuma[shijian[i]];
- if(t>50)
- { switch(she)
- {
- case(3):
- if((i==0)||(i==1))
- play=0x00; break;
- case(2):
- if((i==3)||(i==4))
- play=0x00; break;
- case(1):
- if((i==6)||(i==7))
- play=0x00; break;
- }
- }
- j=10; //掃描間隔時間設定
- while(j--);
- play=0x00;//消隱
- }
- }
- void nao()//鬧鐘賦值
- { shijian[7]=kai;
- shijian[6]=11;
- shijian[5]=11;
- shijian[4]=fen1%10;
- shijian[3]=fen1/10;
- shijian[2]=10;
- shijian[1]=shi1%10;
- shijian[0]=shi1/10;
- }
- void rili() //日期賦值
- { shijian[7]=ri%10;
- shijian[6]=ri/10;
- shijian[5]=10;
- shijian[4]=yue%10;
- shijian[3]=yue/10;
- shijian[2]=10;
- shijian[1]=nian%10;
- shijian[0]=nian/10;
- }
- void zhong()//電子鐘賦值
- { shijian[7]=miao%10;
- shijian[6]=miao/10;
- shijian[5]=10;
- shijian[4]=fen%10;
- shijian[3]=fen/10;
- shijian[2]=10;
- shijian[1]=shi%10;
- shijian[0]=shi/10;
- }
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void shezhi()//功能設置函數
- { if((she!=0)&&((k2==0)||(k3==0)))
- { delay10ms();
- if((she!=0)&&((k2==0)||(k3==0)))
- {
- switch(num)
- { case(0):
- zhongshe(); break;
- case(1):
- qishe(); break;
- case(2):
- naoshe();break;
- }
- }
- }
- }
- void main()
- {
- num=0;kai=1;she=0;
- fen1=1;shi1=0;
- miao=0;fen=0;shi=0;
- ri=29;yue=5;nian=16;
- InitTimer0();
- while(1)
- {
- if(k1==0)
- {delay10ms();
- if(k1==0)
- {num=(num+4)%3;
- she=0;}
- led=~led;
- while(!k1) ;}
- if(k4==0)
- {delay10ms();
- if(k4==0)
- she=(she+5)%4;
- while(!k4) ;
- }
- shezhi();
- naozhong();
- plays();
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- t++;
- if(t==100)
- { t=0;
- miao++;
- if(miao>59)
- { miao=0;
- fen++;
- if(fen>59)
- {
- fen=0;
- shi++;
- if(shi>23)
- {
- shi=0;
- ri++;
- if(nian%4==0)
- { if(ri>runyue[yue-1])
- { ri=1;
- yue++; }
- if(yue>12)
- { yue=1;
- nian++;}
- }
- else
- {if(ri>brunyue[yue-1])
- {
- ri=0;
- yue++;
- }
- if(yue>12)
- {
- yue=0;
- nian++ ;
- }
- }
- }
- }
- }
- }
- switch(num)
- {
- case(0):
- zhong();break;
- case(1):
- rili();break;
- case(2):
- nao();break;
- default: zhong();
- }
- }
- void zhongshe()
- { switch(she)
- {
- case(1):
- miao=0;InitTimer0();break;
- case(2):
- if(k2==0)
- fen=(fen+61)%60;
- else
- fen=(fen+59)%60;
- break;
- case(3):
- if(k2==0)
- shi=(shi+25)%24;
- else
- shi=(shi+23)%24;
- break;
- }
- while((!k2)||(!k3)) ;
- }
- void naoshe()
- { switch(she)
- {
- case(1):
- if(kai==1)
- kai=0;
- else kai=1; break;
- case(2):
- if(k2==0)
- fen1=(fen1+61)%60;
- else
- fen1=(fen1+59)%60;
- break;
- case(3):
- if(k2==0)
- shi1=(shi1+25)%24;
- else
- shi1=(shi1+23)%24;
- break;
- }
- while((!k2)||(!k3)) ;
- }
- void qishe()
- { switch(she)
- {
- case(1):
- if(k2==0)
- {if(nian%4==0)
- ri=(ri+runyue[yue-1]+2)%(runyue[yue-1]+1) ;
- else
- ri=(ri+brunyue[yue-1]+2)%(brunyue[yue-1]+1);
- }
- else
- { if(nian%4==0)
- ri=(ri+runyue[yue-1])%(runyue[yue-1]+1) ;
- else
- ri=(ri+brunyue[yue-1])%(brunyue[yue-1]+1);
- }
- break;
- case(2):
- if(k2==0)
- yue=(yue+14)%13;
- else
- yue=(yue+12)%13;
- break;
- case(3):
- if(k2==0)
- nian++;
- else
- nian--;
- }
- while((!k2)||(!k3)) ;}
復制代碼
|