數字鐘設計:
(1)硬件部分主要分以下電路模塊:顯示電路用8個共陰數碼管分別顯示
(2)星期(年份),小時、分鐘(月份)和秒(日)
(3)通過動態掃描進行顯示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (14.37 KB, 下載次數: 81)
下載附件
2019-3-19 17:10 上傳
0.png (10.43 KB, 下載次數: 47)
下載附件
2019-3-19 17:10 上傳
單片機源程序如下:
- #include<reg51.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- unsigned char code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示0~F的值
- unsigned char Time; //用來存放定時時間
- //--聲明全局函數--//
- void DigDisplay(); //動態顯示函數
- void DigDisplay1(); //動態顯示函數
- void Timer0Cofig(void);
- void delay(u16 i);
- u8 m,f,s;
- u8 nian=19,yue=3,ri=17;
- sbit K4=P1^3;
- sbit K3=P1^2;
- sbit K2=P1^1;
- sbit K1=P1^0;
- u8 x; //切換顯示界面
- u8 x1; //暫停時間,進入調時
- void main(void)
- {
- P2=0X00;
- Timer0Cofig();
- P1=0XFF;
- while(1)
- {
- if(!K4) //切換顯示界面
- {
- delay(10);
- if(!K4)
- x=!x;
- while(!K4); //等待按鍵松開
- }
- if(!K1)
- {
- delay(10);
- if(!K1)
- {
- TR0=!TR0;
- x1=!x1;
- }
- while(!K1); //等待按鍵松開
- }
- if(!K2&&x1)
- {
- delay(10);
- if(!K2&&x1)
- f++;
- while(!K2&&x1); //等待按鍵松開
- }
- if(!K3&&x1)
- {
- delay(10);
- if(!K3&&x1)
- s++;
- while(!K3&&x1); //等待按鍵松開
- }
- if(m==60) //秒進位
- {
- m=0;
- f++;
- }
- if(f==60) //分鐘進位
- {
- f=0;
- s++;
- }
- if(s==24) //小時進位
- {
- s=0;
- ri++;
- }
- if(!x)
- DigDisplay();
- if(x)
- DigDisplay1();
- }
- }
- void delay(u16 i)
- {
- while(i--);
- }
- void DigDisplay() //顯示秒分時函數
- {
- u16 i,i1; //顯示秒
- i=m%10;
- i1=(m/10)%10;
- P2=0X80;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X40;
- P0=smgduan[i1];
- delay(1); //間隔一段時間掃描
- P2=0X20; //分隔符
- P0=0xBF;
- delay(1);
- //////////////////////////////顯示分鐘
- i=f%10;
- i1=(f/10)%10;
- P2=0X10;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X08;
- P0=smgduan[i1];
- delay(1); //間隔一段時間掃描
- P2=0X04;
- P0=0xBF;
- delay(1);
- //////////////////////////////顯示小時
- i=s%10;
- i1=(s/10)%10;
- P2=0X02;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X01;
- P0=smgduan[i1];
- delay(1);
- ///////////////////////////////
- delay(80); //間隔一段時間掃描
- }
- void DigDisplay1() //顯示年月日函數
- {
- u16 i,i1; //顯示日
- i=ri%10;
- i1=(ri/10)%10;
- P2=0X80;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X40;
- P0=smgduan[i1];
- delay(1); //間隔一段時間掃描
- P2=0X20;
- P0=0xBF;
- delay(1);
- //////////////////////////////顯示月
- i=yue%10;
- i1=(yue/10)%10;
- P2=0X10;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X08;
- P0=smgduan[i1];
- delay(1); //間隔一段時間掃描
- P2=0X04;
- P0=0xBF;
- delay(1);
- //////////////////////////////顯示年
- i=nian%10;
- i1=(nian/10)%10;
- P2=0X02;
- P0=smgduan[i];
- delay(1); //間隔一段時間掃描
- P2=0X01;
- P0=smgduan[i1];
- delay(1);
- ///////////////////////////////
- delay(80); //間隔一段時間掃描
- }
- void Timer0Cofig(void)
- {
- TMOD = 0x01; //定時器0選擇工作方式1
- TH0 = 0x3C; //設置初始值,定時50MS
- TL0 = 0xB0;
- EA = 1; //打開總中斷
- ET0 = 1; //打開定時器0中斷
- TR0 = 1; //啟動定時器0
- }
- void Timer0() interrupt 1
- {
- TH0 = 0x3C; //設置初始值
- TL0 = 0xB0;
- Time++;
- if(Time == 20)
- {
- m++;
- Time = 0;
- }
- }
復制代碼
所有資料51hei提供下載:
數字鐘.zip
(73.9 KB, 下載次數: 118)
2019-3-19 15:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|