仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit wei=P2^7;
- sbit duan=P2^6;
- sbit P33=P3^3;
- sbit P32=P3^2;
- int count=0;
- uchar smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //數碼管的段碼值,0xbf對應”—“
- uchar weixuan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數碼管的位選信號
- uchar tab[8]={0,0,10,0,0,10,0,0}; //8數碼管顯示值的8個值,10是對用顯示— ;
- void zhuanhuan(uchar shi,uchar fen,uchar miao);
- void delay_ms(uint i) //延時
- {
- uint j;
- for(;i>0;i--)
- for(j=120;j>0;j--);
- }
- void main()
- { uchar i=0,count=0; //count用來計量1S的時間
- uchar moshi=0;
- uchar shi=23,fen=59,miao=55; //定義時、分、秒變量
- bit flag=0; //正常走時,flag=0;調節時分秒時,flag=1;
- while(1)
- {
- zhuanhuan(shi,fen,miao); //從時分秒中分出十位,個位
- for(i=0;i<8;i++) //數碼管動態掃描顯示
- { P0=weixuan[i];wei=1;wei=0;
- P0=~smg[tab[i]];duan=1;duan=0;delay_ms(1);
- }
-
- //時分秒根據時間變化
- if(flag==0) count++; //count記錄while循環的次數,通過指令可以推斷出一次需要多少時間,次數乘以單次時間,以此計算1秒的時間
- if(count==105) {miao++;count=0;} //當count==次時,時間為1秒
- if(miao==60) {fen++;miao=0;} //60秒1分鐘,60分鐘1小時,24小時歸零。
- if(fen ==60) {shi++;fen=0;}
- if(shi==24) {shi=0;}
-
- //按鍵調節時分秒
- if(P32==0) //10ms延時,消抖處理
- {delay_ms(10);
- if(P32==0) {moshi++;flag=1;} //模式1對應調時,模式2對應調分,模式3對應調秒
- }
- if(P33==0) //10ms延時,消抖處理
- {delay_ms(10);
- if((P33==0)&(moshi==1)) shi++; //模式1對應調時。P33按鍵只做加法運算
- if((P33==0)&(moshi==2)) fen++; //模式2對應調分
- if((P33==0)&(moshi==3)) miao++;//模式3對應調秒
- }
- if(moshi==4) {moshi=0;flag=0;}//第四次按下模式鍵,模式歸零
- while((P32==0)|(P33==0)); //等待按鍵釋放
- }
- }
- void zhuanhuan(uchar shi,uchar fen,uchar miao)
- {
- tab[0]=shi/10;
- tab[1]=shi%10;
- tab[3]=fen/10;
- tab[4]=fen%10;
- tab[6]=miao/10;
- tab[7]=miao%10;
- }
復制代碼
所有資料51hei提供下載:
利用數碼管的動態顯示實現時鐘.rar
(85.69 KB, 下載次數: 77)
2020-11-13 16:43 上傳
點擊文件名下載附件
|