在之前的文章中我們學習了多位數碼管的倒計時,下面我們將對多位數碼管對實際生活中的時間來進行顯示,該功能的實現也并不復雜,將數碼管知識相結合并運用起來,就可以完成一個屬于自己的時鐘了。
一、功能概述
實現對時間的計數我們需要用到單片機中的定時器模塊,定時器的本質上就是每經過一個單片機自己機械周期就會加一的寄存器。定時器也可以是一個中斷,當到達了給定時時間后就會執行相對應的程序。
了解了定時器的原理和使用方法,我們就可以選擇我們需要的多位數碼管來進行電路的設計了。
二、顯示原理
既然我們需要現實的是時分秒的時間,那么我們可以選用六位的數碼管,每兩個數碼管分別顯示時、分、秒。而控制每一個數碼管都需要段碼線和選位線來控制,這樣也節省了我們所需要使用的單片機IO口。
三、電路連接
四 、程序設計
程序代碼:
#include< reg51.h >
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code num[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~9字碼
uchar miao=0, fen=0, shi=0; //進位標志位
uint i=0; //計時
uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H; //時、分、秒的個位(xxx_L)和十位(xxx_H)
void delay(uint x){ //延時函數
while(x--);
}
void T0_init(){ //定時器 0 初始化
TMOD = 0x01; //工作方式 1
TH0 = 0x3c; //高八位賦初值 65536-50000=15536 = 3cb0H
TL0 = 0xb0; //底八位賦初值
EA = 1; //開總中斷
ET0 = 1; //開 T0 中斷
TR0 = 1; //啟動 T0
}
void display(){ //顯示
P2 = 0x20; //秒與分間隔線
P0 = 0xbf;
delay(500);
P2 = 0x04; //分與時間隔線
P0 = 0xbf;
delay(500);
P2 = 0x80; //數碼管位選 1000 0000
P0 = num[miao_L]; //秒個位
delay(500);
P2 = 0x40; //數碼管位選 0100 0000
P0 = num[miao_H]; //秒十位
delay(500);
P2 = 0x10; //數碼管位選 0001 0000
P0 = num[fen_L]; //分個位
delay(500);
P2 = 0x08; //數碼管位選 0000 1000
P0 = num[fen_H]; //分十位
delay(500);
P2 = 0x02; //數碼管位選 0000 0010
P0 = num[shi_L]; //分個位
delay(500);
P2 = 0x01; //數碼管位選 0000 0001
P0 = num[shi_H]; //分十位
delay(500);
}
void main(){
T0_init(); //定時器初始化
while(1){
display(); //顯示
}
}
void timer0_int() interrupt 1{ //中斷服務函數
i++;
if(i == 20){
i = 0; //滿一秒清零
miao++; //i = 100 為一,秒標志位加 1
if(miao == 60){
miao = 0; //滿一分清零
fen++;
if(fen == 60){
fen = 0;