在之前的文章中我們學(xué)習(xí)了多位數(shù)碼管的倒計(jì)時(shí),下面我們將對(duì)多位數(shù)碼管對(duì)實(shí)際生活中的時(shí)間來進(jìn)行顯示,該功能的實(shí)現(xiàn)也并不復(fù)雜,將數(shù)碼管知識(shí)相結(jié)合并運(yùn)用起來,就可以完成一個(gè)屬于自己的時(shí)鐘了。
一、功能概述
實(shí)現(xiàn)對(duì)時(shí)間的計(jì)數(shù)我們需要用到單片機(jī)中的定時(shí)器模塊,定時(shí)器的本質(zhì)上就是每經(jīng)過一個(gè)單片機(jī)自己機(jī)械周期就會(huì)加一的寄存器。定時(shí)器也可以是一個(gè)中斷,當(dāng)?shù)竭_(dá)了給定時(shí)時(shí)間后就會(huì)執(zhí)行相對(duì)應(yīng)的程序。
了解了定時(shí)器的原理和使用方法,我們就可以選擇我們需要的多位數(shù)碼管來進(jìn)行電路的設(shè)計(jì)了。
二、顯示原理
既然我們需要現(xiàn)實(shí)的是時(shí)分秒的時(shí)間,那么我們可以選用六位的數(shù)碼管,每?jī)蓚€(gè)數(shù)碼管分別顯示時(shí)、分、秒。而控制每一個(gè)數(shù)碼管都需要段碼線和選位線來控制,這樣也節(jié)省了我們所需要使用的單片機(jī)IO口。
三、電路連接
四 、程序設(shè)計(jì)
程序代碼:
#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; //進(jìn)位標(biāo)志位
uint i=0; //計(jì)時(shí)
uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H; //時(shí)、分、秒的個(gè)位(xxx_L)和十位(xxx_H)
void delay(uint x){ //延時(shí)函數(shù)
while(x--);
}
void T0_init(){ //定時(shí)器 0 初始化
TMOD = 0x01; //工作方式 1
TH0 = 0x3c; //高八位賦初值 65536-50000=15536 = 3cb0H
TL0 = 0xb0; //底八位賦初值
EA = 1; //開總中斷
ET0 = 1; //開 T0 中斷
TR0 = 1; //啟動(dòng) T0
}
void display(){ //顯示
P2 = 0x20; //秒與分間隔線
P0 = 0xbf;
delay(500);
P2 = 0x04; //分與時(shí)間隔線
P0 = 0xbf;
delay(500);
P2 = 0x80; //數(shù)碼管位選 1000 0000
P0 = num[miao_L]; //秒個(gè)位
delay(500);
P2 = 0x40; //數(shù)碼管位選 0100 0000
P0 = num[miao_H]; //秒十位
delay(500);
P2 = 0x10; //數(shù)碼管位選 0001 0000
P0 = num[fen_L]; //分個(gè)位
delay(500);
P2 = 0x08; //數(shù)碼管位選 0000 1000
P0 = num[fen_H]; //分十位
delay(500);
P2 = 0x02; //數(shù)碼管位選 0000 0010
P0 = num[shi_L]; //分個(gè)位
delay(500);
P2 = 0x01; //數(shù)碼管位選 0000 0001
P0 = num[shi_H]; //分十位
delay(500);
}
void main(){
T0_init(); //定時(shí)器初始化
while(1){
display(); //顯示
}
}
void timer0_int() interrupt 1{ //中斷服務(wù)函數(shù)
i++;
if(i == 20){
i = 0; //滿一秒清零
miao++; //i = 100 為一,秒標(biāo)志位加 1
if(miao == 60){
miao = 0; //滿一分清零
fen++;
if(fen == 60){
fen = 0;