|
這是單片機(jī)數(shù)字鐘課程設(shè)計(jì),用了一個(gè)星期的時(shí)間,附件里面包含數(shù)字鐘的單片機(jī)源代碼,proteus仿真工程文件都是自己原創(chuàng)的,請(qǐng)大家多多指教。
會(huì)切換顯示年月日,星期鬧鐘顯示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.3 KB, 下載次數(shù): 47)
下載附件
2019-6-25 03:55 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- unsigned char code dis_tab[16]=
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽(yáng)極0-916進(jìn)制編碼
- unsigned char data dis_data1,dis_data2,bit_data1,bit_data2,a1,a2,a11,a22,b1,b2,b11,b22,nian=16,yue=2,ri=27,miao=5,fen=0,shi=0,xq=0;
- unsigned char int_cnt=0;
- unsigned char num;
- unsigned char a;
- unsigned char b;sbit K0=P0^0;
- sbit K1=P0^1;
- sbit K2=P0^2;
- sbit K3=P0^3;
-
- void mDelay(unsigned int Delay) //延時(shí)函數(shù)
- { unsigned int i;
- for(;Delay>0;Delay--)
- { for(i=0;i<114;i++) {;}}}
- void T0_int() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- int_cnt++;
- if(int_cnt==16)
- {num++;int_cnt=0;
- }
- if(num==60)
- {num=0;int_cnt=0;
- a++; }
- if(a==60)
- {a=0;b++; b<=24;
- if(b==24)
- b=0; if(b==0)
- {ri++;}
- }
- if(ri==7)
- {xq++;}
-
- if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
- {ri<=31;
- if(ri==32){ri=1; yue++;}
- }
- if (yue==4||yue==6||yue==9||yue==11)
- {ri<=31;
- if(ri==31){ri=1;yue++;
- } }
- if(yue==2&&((nian+2000)%4==0&&(nian+2000)%100!=0)||(nian+2000)%400==0)
- {ri<=30;if(ri==30){ri=1;yue++;}}
- else if (yue==2)
- {ri<=29;if(ri==29){ri=1;yue++;}}
-
- if(yue==13)
- {yue=1;if(yue==1)
- {nian++;}}
- if(K1==1) //K0按鍵是否按下
- { mDelay(5); //延時(shí)消抖
- if(K1==1)
- {P2=0x00;
- mDelay(10);
- a++;
- mDelay(2);}}
- if(K0==1&&K1==1)
- {mDelay(5);
- if(K0==1&&K1==1)
- { P2=0x00;
- mDelay(10);
- ri++;
- a--;
- mDelay(2);
- }}
- if(K0==1&&K2==1) //K0按鍵是否按下
- { mDelay(5); //延時(shí)消抖
- if(K0==1&&K2==1)
- {P2=0x00;
- mDelay(10);
- yue++;
- mDelay(2);}}
- if(K0==1&&K3==1) //K0按鍵是否按下
- { mDelay(5); //延時(shí)消抖
- if(K0==1&&K3==1)
- {P2=0x00;
- mDelay(10);
- nian++;
- b--;
- mDelay(2);}}
- if(K3==1)
- {mDelay(5);
- {if(K3==1);
- b++;
- }
- }
- if(K2==1)
- {mDelay(5);
- if(K2==1)
- { mDelay(5);
-
- bit_data1=0x01;
- bit_data2=0x02;
- P2 = 0x00;
- dis_data2=miao/10;
- dis_data1=miao%10;
- P1= dis_tab[dis_data1]; //將顯示的個(gè)位的段碼送段碼口
- P2 = bit_data1; //將位選碼送位選碼口
- mDelay(5);
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[dis_data2]; //將顯示的十位的段碼送段碼口
- P2 =bit_data2;
- mDelay(10);
- a1=0x04;
- a2=0x08;
- P2 = 0x00;
- a22=fen/10;
- a11=fen%10;
- P1= dis_tab[a11]; //將顯示的個(gè)位的段碼送段碼口
- P2 = a1;
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[a22]; //將顯示的十位的段碼送段碼口
- P2 =a2;
- mDelay(10);
- b1=0x10;
- b2=0x20;
- P2 = 0x00;
-
- b22=shi/10;
- b11=shi%10;
- P1= dis_tab[b11]; //將顯示的個(gè)位的段碼送段碼口
- P2 =b1; //將位選碼送位選碼口
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[b22]; //將顯示的十位的段碼送段碼口
- P2 =b2;
- mDelay(10); }
- while(K2==0){break;}
- }
- if(K2==1&&K3==1)
- { mDelay(5);
- if(K2==1&&K3==1)
- {
- mDelay(10);
- fen++;
- b--;
- }}
- if(K2==1&&K1==1)
- {mDelay(5);
- if(K2==1&&K1==1)
- {
- mDelay(10);
- a--;
- mDelay(5) ;
- shi++;
- }
- }
-
- if(num==miao&&a==fen&&b==shi)
- {
-
- P3=0x00;
- mDelay(27);
-
-
- }
- if(K0==1&&K1==1&&K2==1)
- { shi--;
- yue--;
-
-
-
-
- bit_data1=0x01;
- bit_data2=0x02;
- P2 = 0x00;
- dis_data2=xq/10;
- dis_data1=xq%10;
- P1= dis_tab[dis_data1]; //將顯示的個(gè)位的段碼送段碼口
- P2 = bit_data1; //將位選碼送位選碼口
- mDelay(5);
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[dis_data2]; //將顯示的十位的段碼送段碼口
- P2 =bit_data2;
- mDelay(10);
-
- }
-
-
-
- }
- void display()
- {
-
-
-
-
-
- if(K0==0){
- bit_data1=0x01;
- bit_data2=0x02;
- P2 = 0x00;
- dis_data2=num/10;
- dis_data1=num%10;
- P1= dis_tab[dis_data1]; //將顯示的個(gè)位的段碼送段碼口
- P2 = bit_data1; //將位選碼送位選碼口
- mDelay(5);
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[dis_data2]; //將顯示的十位的段碼送段碼口
- P2 =bit_data2;
- mDelay(10);
- a1=0x04;
- a2=0x08;
- P2 = 0x00;
- a22=a/10;
- a11=a%10;
- P1= dis_tab[a11]; //將顯示的個(gè)位的段碼送段碼口
- P2 = a1;
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[a22]; //將顯示的十位的段碼送段碼口
- P2 =a2;
- mDelay(10);
- b1=0x10;
- b2=0x20;
- P2 = 0x00;
-
- b22=b/10;
- b11=b%10;
- P1= dis_tab[b11]; //將顯示的個(gè)位的段碼送段碼口
- P2 =b1; //將位選碼送位選碼口
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[b22]; //將顯示的十位的段碼送段碼口
- P2 =b2;
- mDelay(10);
- }
- else
- {
- bit_data1=0x01;
- bit_data2=0x02;
- P2=0x00;
- dis_data2=ri/10;
- dis_data1=ri%10;
- P1= dis_tab[dis_data1]; //將顯示的個(gè)位的段碼送段碼口
- P2 = bit_data1; //將位選碼送位選碼口
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[dis_data2]; //將顯示的十位的段碼送段碼口
- P2 =bit_data2;
- mDelay(10);
-
- a1=0x04;
- a2=0x08;
- P2 = 0x00;
-
- a22=yue/10;
- a11=yue%10;
- P1= dis_tab[a11]; //將顯示的個(gè)位的段碼送段碼口
- P2 = a1;
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[a22]; //將顯示的十位的段碼送段碼口
- P2 =a2;
-
- mDelay(10);
- b1=0x10;
- b2=0x20;
- P2 = 0x00;
- b22=nian/10;
- b11=nian%10;
- P1= dis_tab[b11]; //將顯示的個(gè)位的段碼送段碼口
- P2 =b1; //將位選碼送位選碼口
- mDelay(5 );
- P2 = 0x00; //熄滅數(shù)碼管
- P1 = dis_tab[b22]; //將顯示的十位的段碼送段碼口
- P2 =b2;
- mDelay(10);
- while(!K0){break;} //等待K0按鍵釋放
- }
-
-
-
- }
-
-
- void main()
- {
- TMOD=0X01; /*中斷初始化*/
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1; //中斷總開(kāi)關(guān)
- ET0=1; //請(qǐng)求中斷
- TR0=1; //允許中斷
- int_cnt=0;
-
- while(1)
- { //關(guān)閉其他位
- display(); //調(diào)用函數(shù)
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
數(shù)字鐘.zip
(91.31 KB, 下載次數(shù): 44)
2019-6-24 17:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|