電子時鐘+數字秒表設計
- 概述
- 設計任務的基本要求
- 整體方案
- 電路設計原理
- 軟體設計
- 元件清單
- 專案下載地址
概述
電子時鐘是一種利用數字電路來顯示秒、分、時的計時裝置,與傳統的機械鐘相比,它具有走時準確、顯 示直觀、無機械傳動裝置等優點,因而得到廣泛應用,隨著人們生活環境的不斷改善和美化,在許多場合可以看到數字電子時鐘,電子時鐘是一個將“ 時”,“分”,“秒”顯示于人的視覺器官的計時裝置,它的計時周期為24小時,顯示滿刻度為23時59分59秒,具有校時功能和報時功能,因此,一個基本的數字鐘電路主要由譯碼顯示幕、“時”,“分”,“秒”計數器、校時電路、報時電路和振蕩器組成,主電路系統由秒信號發生器、“時、分、秒”計數器、譯碼器及顯示幕、校時電路、整點報時電路組成,秒信號產生器是整個系統的時基信號,它直接決定計時系統的精度,一般用石英晶體振蕩器加分頻器來實作,將標準秒信號送入“秒計數器”,“秒計數器”采用60進制計數器,每累計60秒發出一個“分脈沖”信號,該信號將作為“分計數器”的時鐘脈沖,“分計數器”也采用60進制計數器,每累計60分鐘,發出一個“時脈沖”信號,該信號將被送到“時計數器”,“時計數器”采用24進制計時器,可實作對一天24小時的累計,譯碼顯示電路將“時”、“分”、“秒”計數器的輸出狀態用七段顯示譯碼器譯碼,通過七段顯示幕顯示出來,整點報時電路時根據計時系統的輸出狀態產生一脈沖信號,然后去觸發一音頻發生器實作報時,校時電路時用來對“時”、“分”、“秒”顯示數字進行校對調整,
數字秒表是一種較先進的電子計時器,目前國產的數字秒表一般都是利用石英振蕩器的振蕩頻率作為時間基準,采用6位液晶數字顯示時間,
設計任務的基本要求
設計任務:
利用AT89C51單片機實作電子時鐘和秒表計時的功能,電子時鐘可以通過液晶屏顯示時間,日期等資訊,數字秒表要通過LCD顯示當前計時資訊,開始/結束,清零功能
設計要求:
基于單片機的電子時鐘+數字秒表設計要求:
(1)顯示當前時間;
(2)顯示當前日期
(3)按鍵實作電子時鐘和數字秒表的功能切換
(4)按鍵實作秒表停止計時
(5)按鍵實作秒表復位

整體方案
此次設計主要是應用單片機來設計電子時鐘,硬體部分主要分以下電路模塊:顯示電路用8個共陰數碼管分別顯示,小時、分鐘和秒,通過動態掃描進行顯示,從而避免了譯碼器的使用,同時節約了I/0埠,使電路更加簡單,單片機采用AT89C51系列,這種單片機應用簡單,適合電子鐘設計,

圖1.整體設計框圖
3.1輸入部分:
在本實驗中主要用用P3口輸入按鍵信號,還用到了特殊的P0口,對于P0口,由于其存在高阻狀態,為了實作開關功能,給其添加上拉電阻,具體如下圖所示:


3.2輸出部分:
本電路的輸出信號為7段數碼管的位選和段選信號,鬧鈴脈沖信號,提示燈信號,本實驗的數碼管是共陰的,為了防止段選信號不能驅動數碼管,故在P1口連接上拉電阻后,再送段選信號,以提高驅動,位選信號直接從P2口接入,

3.3晶振與復位電路:
本實驗單片機時鐘用內部時鐘,復位電路為手動復位構成,模塊如下:

電路設計原理
首先選用8051單片機為主控芯片,74LS245為六位共陰數碼管的驅動芯片用于數碼管顯示驅動,以12MHz晶振與兩個10k電阻組成該硬體系統時鐘信號發生器,并選用四個按鍵實作功能的切換和顯示控制,
資料傳輸采用總線模式P0埠通過上拉電阻連接74LS245芯片,為數碼管驅動端,P1埠為數碼管資料端,負責單片機程式輸出資料傳送至數碼管,
12MHz晶振通過兩個10uf電容輸出一毫秒延遲傳入單片機主程式,用于時鐘和秒表程式的毫秒回應
K1按鍵連接P3.1介面輸入TX0中斷,呼叫切換顯示程式請求,軟體部分通過埠監聽實作功能的切換,K2按鍵連接P3.2介面輸入INT0中斷,實作調時和計時開始功能,K3按鍵連接P3.3介面接入INT1中斷,通過秒表清零消隱子程式實作秒表清零和時鐘選位調節,

軟體設計
Delay函式模塊,提供晶振時鐘信號介面,用于時間和秒表的數字定時顯示;
Time0,Time1為定時器函式模塊,用于提供時鐘和秒表的定時器介面;
Display0時間顯示模塊,實作六位數碼管的數字位選消隱和延時;
Display1時間顯示模塊,實作六位數碼管的數字位選消隱和延時;
Display2時間設定模塊,通過if陳述句嵌套,判斷對應介面按鍵
KEY_Time_Set為時間設定按鍵監聽函式,當按下對應按鍵執行各位加減操作;
KEY_miaobiao為秒表功能函式,實作秒表開始,暫停,和復位功能
Mode_K1為按鍵模式選擇函式,判斷現階段系統處于那種狀態呼叫相對應的按鍵介面

全部代碼如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Tab0[]= //定義數碼管陣列,沒有小數點
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar code Tab1[]= //定義數碼管陣列,有小數點
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
};
sbit K1=P3^2; //模式選擇鍵,本程式三種模式,分別是時間顯示、秒表、時間設定
sbit K2=P3^3; //設定時間時加一/開始(暫停)秒表按鍵
sbit K3=P3^4; //切換設定位/清零秒表按鍵
void Delay(uchar x); //延時函式
void Display0(); //時間顯示函式
void Display1(); //秒表顯示函式
void Display2(); //時間設定顯示函式
void Init(); //中斷初始化函式
void Mode_K1(); //模式切換函式
void KEY_MiaoBiao(); //檢測秒表操作按鍵
void KEY_Time_Set(); //檢測時間設定按鍵
uchar Hours=23,Minutes=56,seconds=55; //分別定義三個變數表示時、分、秒
uchar Time0_bit=0; //用于定時器0的溢位標志
bit Set_Time=0; //設定時 閃爍時長的標志位
bit Set0=0; //設定時間標志,確定是設定‘分’還設定‘時’
uchar K1_bit=0; //用于模式切換的標志
uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4; //用于秒表的變數
void main()
{
Init(); //中斷初始化
while(1) //死回圈
{
Mode_K1(); //模式掃描
switch(K1_bit) //模式選擇
{
case 0:
{
Display0(); //顯示時間
break;
}
case 1:
{
Display1(); //顯示秒表
KEY_MiaoBiao(); //掃描秒表操作
break;
}
case 2:
{
Display2(); //設定時間時的顯示程式,可閃爍定位
KEY_Time_Set(); //掃描按鍵
break;
}
}
}
}
void KEY_Time_Set() //設定時間時的按鍵掃描函式
{
if(K1_bit==2) //判斷是否為時間設定模式
{
if(K2==0) //K2有按下(下同)
{
Delay(10); //延時消抖(下同)
if(K2==0) //再次檢測是否為誤按
{
if(Set0==0) //檢測是設定‘時’還是分,Set0為0時設定‘分’,Set0為1時設定‘時’
{
Minutes++; //‘分’加1
if(Minutes==60) //當'分'加到60時,重新賦值0
Minutes=0;
}
else
{
Hours++; //‘時’加1
if(Hours==24) //當'時'加到24時,重新賦值0
Hours=0;
}
while(!K2); //按鍵松開檢測,消除松開按鍵時的抖動干擾
}
}
if(K3==0)
{
Delay(10);
if(K3==0)
{
Set0=~Set0; //K3每按一次Set0取反,以確定是設定‘時’還是設定‘分’,Set0為0時設定‘分’,Set0為1時設定‘時’
while(!K3);
}
}
}
}
void KEY_MiaoBiao() //檢測秒表按鍵操作
{
if(K1_bit==1) //判斷是否為秒表模式
{
if(K2==0)
{
Delay(10);
if(K2==0)
{
TR1=~TR1; //K2每按一次TR1取反,暫停或開始定時器1,達到暫停或開始秒表的目的
while(!K2);
}
}
if(K3==0)
{
Delay(10);
if(K3==0) //當K3按下時秒表所有資料清零,并停止定時器1
{
TR1=0; //停止定時器1
Miao_Biao0=0; //清零資料
Miao_Biao1=0;
Miao_Biao2=0;
Miao_Biao3=0;
Miao_Biao4=0;
while(!K3);
}
}
}
}
void Mode_K1() //模式選擇鍵,本程式三種模式,分別是時間顯示、秒表、時間設定
{
if(K1==0)
{
Delay(10);
if(K1==0)
{
K1_bit++;
if(K1_bit==3)
{
K1_bit=0;
}
while(!K1);
/***********************************************************************
*************當K1_bit為0時顯示時鐘,為1時進入秒表,*********************
*******************為2時進入時間設定模式********************************
***********************************************************************/
}
}
}
void Time1() interrupt 3 //定時器1函式
{
TH1=(65536-50000)/256; //重裝初值
TL1=(65536-50000)%256;
Miao_Biao0++;
if(Miao_Biao0==2) //以下為秒表資料處理
{
Miao_Biao0=0;
Miao_Biao1++; //Miao_Biao1每加1次為100ms,
if(Miao_Biao1==10)
{
Miao_Biao1=0;
Miao_Biao2++;
if(Miao_Biao2==60)
{
Miao_Biao2=0;
Miao_Biao3++;
if(Miao_Biao3==60)
{
Miao_Biao3=0;
Miao_Biao4++;
if(Miao_Biao4==10)
Miao_Biao4=0;
}
}
}
}
}
void Time0() interrupt 1 //定時器0函式
{
TH0=(65536-50000)/256; //重裝初值
TL0=(65536-50000)%256;
Time0_bit++;
if((Time0_bit%10)==0) //每溢位10次Time0_bit取反一次
Set_Time=~Set_Time; //0.5秒閃爍一次
if(Time0_bit==20) //以下為時間資料處理
{
Time0_bit=0;
seconds++;
if(seconds==60)
{
seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
}
void Init() //中斷初始化函式
{
EA=1; //開總中斷
TMOD=0X11; //定時器作業方式選擇,定時器0和定時器1都選擇第1種作業方式
TH0=(65536-50000)/256; //定時器0裝初值,定時50ms
TL0=(65536-50000)%256;
ET0=1; //開定時器0開關
TR0=1; //開定時器0小開關
TH1=(65536-50000)/256; //定時器1裝初值,定時50ms
TL1=(65536-50000)%256;
ET1=1; //開定時器1開關
TR1=0; //關定時器1小開關
}
void Display2() //時間設定時的顯示函式
{
if(Set0==0) //判斷是否為設定‘時’還是‘分’
{
P0=Tab0[seconds%10]; //顯示秒的個位
P1=0xdf; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[seconds/10]; //顯示秒的十位
P1=0xef; //段選
Delay(10); //延時
P0=0X00; //消隱
if(Set_Time) //這個if陳述句實作分鐘以0.5秒的頻率閃爍
{
P0=Tab1[Minutes%10]; //顯示分的個位,需要加上小數點做分隔符
P1=0xf7; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Minutes/10]; //顯示分的十位
P1=0xfb; //段選
Delay(10); //延時
P0=0X00; //消隱
}
else
{
P0=0x00; //顯示分的個位,需要加上小數點做分隔符
P1=0xf7; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=0x00; //顯示分的十位
P1=0xfb; //段選
Delay(10); //延時
P0=0X00; //消隱
}
P0=Tab1[Hours%10]; //顯示時的個位,需要加上小數點做分隔符
P1=0xfd; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Hours/10]; //顯示時的十位
P1=0xfe; //段選
Delay(10); //延時
P0=0X00; //消隱
}
else //‘時’鐘閃爍
{
P0=Tab0[seconds%10]; //顯示秒的個位
P1=0xdf; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[seconds/10]; //顯示秒的十位
P1=0xef; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Minutes%10]; //顯示分的個位,需要加上小數點做分隔符
P1=0xf7; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Minutes/10]; //顯示分的十位
P1=0xfb; //段選
Delay(10); //延時
P0=0X00; //消隱
if(Set_Time) //這個if陳述句實作‘時’鐘以0.5秒的頻率閃爍
{
P0=Tab1[Hours%10]; //顯示時的個位,需要加上小數點做分隔符
P1=0xfd; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Hours/10]; //顯示時的十位
P1=0xfe; //段選
Delay(10); //延時
P0=0X00; //消隱
}
else
{
P0=0x00; //顯示時的個位,需要加上小數點做分隔符
P1=0xFF; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=0X00; //顯示時的十位
P1=0xFF; //段選
Delay(10); //延時
P0=0X00; //消隱
}
}
}
void Display1() //顯示秒表
{
P0=Tab0[Miao_Biao1%10]; //顯示1/10秒的個位
P1=0xdf; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Miao_Biao2%10]; //顯示秒的個位,需要加上小數點做分隔符
P1=0xef; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Miao_Biao2/10]; //顯示秒的十位
P1=0xf7; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Miao_Biao3%10]; //顯示分的個位,需要加上小數點做分隔符
P1=0xfb; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Miao_Biao3/10]; //顯示分的十位
P1=0xfd; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Miao_Biao4%10]; //顯示時的個位,需要加上小數點做分隔符
P1=0xfe; //段選
Delay(10); //延時
P0=0X00; //消隱
}
void Display0() //顯示時鐘
{
P0=Tab0[seconds%10]; //顯示秒的個位
P1=0xdf; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[seconds/10]; //顯示秒的十位
P1=0xef; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Minutes%10]; //顯示分的個位,需要加上小數點做分隔符
P1=0xf7; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Minutes/10]; //顯示分的十位
P1=0xfb; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab1[Hours%10]; //顯示時的個位,需要加上小數點做分隔符
P1=0xfd; //段選
Delay(10); //延時
P0=0X00; //消隱
P0=Tab0[Hours/10]; //顯示時的十位
P1=0xfe; //段選
Delay(10); //延時
P0=0X00; //消隱
}
void Delay(uchar x) //延時
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
元件清單
元件清單:
| 器件名稱 | 數量 |
|---|---|
| 按鍵SPST Push Button | 4 |
| 12MHz 晶振 | 1 |
| 10uf電容 | 9 |
| 74LS245單片機 | 1 |
| 7SEG-MPX6-CA-BLUE六位共陰極數碼管 | 1 |
| 8051單片機 | 1 |
專案下載地址
鏈接: 下載地址.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388013.html
標籤:其他
下一篇:井字棋(棋子可消去(拿走))
