看看抽屜的材料,就想做做東西玩玩。本來想做99碼表的,結果按鍵開關不夠,就改成了時鐘。話不多說,直接上圖。
最小系統
最小系統
顯示模塊
顯示模塊
最后效果
最后效果
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- /*********************************************************************************
- *實驗名 :數碼管動態顯示
- *實驗效果 :8位數碼管顯示數字12345678
- *注意 : 每位數碼管顯示之間延遲時間小于3ms可看見8位數碼管同時點亮
- *
- *********************************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- uint k=0;
- uint second=0;//秒
- uint min =0;//分
- uint hour=1;//時
- sbit we1=P3^3; //位選
- sbit we2=P3^1;
- sbit we3=P3^2;
- sbit we4=P3^0;
- sbit L0=P2^0;
- uchar code sz[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
- 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
- 0x5e , 0x79 , 0x71 , 0x00}; //0-9&A-F&“不顯示” 字型碼
- void delay(uint xms) //xms等于幾就延遲幾毫秒
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=112;j>0;j--);
- }
- void Init_timer0(void)
- {
- TMOD |= 0X01; //工作方式1 內部寄存器控制的定時功能
- TH0=0X3c; //高八位的初值
- TL0=0Xb0; //第八位初值
- EA=1; //開啟整體中斷允許
- ET0=1; //開啟定時器0中斷允許
- TR0=1; //開始計數
- }
- void Timer0_isr(void)interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0;
- k++;
- }
- void main()
- {
- Init_timer0();
- while(1)
- {
- if(k==20) //20次1秒
- {
- second++;
- k=0;
- if(second==60)
- {
- second =0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==13)
- {
- hour=1;
- }
- }
- }
-
- }
- P1=sz[min%10]; //分顯示
- we4 =0;
- delay(5);
- we4=1;
-
- P1=sz[min/10];
- we3=0;
- delay(5);
- we3=1;
-
- P1=sz[hour%10]; //時顯示
- we2=0;
- delay(5);
- we2=1;
-
- P1=sz[hour/10];
- we1=0;
- delay(5);
- we1=1;
-
- /*P1=sz[0]; //顯示0
- we1=0;
- delay(10);
- we1=1;
-
- P1=sz[1]; //顯示1
- we2=0;
- delay(10);
- we2=1;
-
- P1=sz[2]; //顯示2
- we3=0;
- delay(10);
- we3=1;
-
- P1=sz[3]; //顯示3
- we4=0;
- delay(10);
- we4=1;*/
- }
- }
- …………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
時鐘.rar
(992.79 KB, 下載次數: 209)
2018-6-18 19:27 上傳
點擊文件名下載附件
時鐘
仿真和程序附件里都有,歡迎大家批評指正。
|