當(dāng)前快播:?jiǎn)纹瑱C(jī)入門(mén)之?dāng)?shù)碼管時(shí)鐘

2023-06-27 15:24:31 來(lái)源:愛(ài)瑞單片機(jī)

在之前的文章中我們學(xué)習(xí)了多位數(shù)碼管的倒計(jì)時(shí),下面我們將對(duì)多位數(shù)碼管對(duì)實(shí)際生活中的時(shí)間來(lái)進(jìn)行顯示,該功能的實(shí)現(xiàn)也并不復(fù)雜,將數(shù)碼管知識(shí)相結(jié)合并運(yùn)用起來(lái),就可以完成一個(gè)屬于自己的時(shí)鐘了。


【資料圖】

一、功能概述

實(shí)現(xiàn)對(duì)時(shí)間的計(jì)數(shù)我們需要用到單片機(jī)中的定時(shí)器模塊,定時(shí)器的本質(zhì)上就是每經(jīng)過(guò)一個(gè)單片機(jī)自己機(jī)械周期就會(huì)加一的寄存器。定時(shí)器也可以是一個(gè)中斷,當(dāng)?shù)竭_(dá)了給定時(shí)時(shí)間后就會(huì)執(zhí)行相對(duì)應(yīng)的程序。

了解了定時(shí)器的原理和使用方法,我們就可以選擇我們需要的多位數(shù)碼管來(lái)進(jìn)行電路的設(shè)計(jì)了。

二、顯示原理

既然我們需要現(xiàn)實(shí)的是時(shí)分秒的時(shí)間,那么我們可以選用六位的數(shù)碼管,每?jī)蓚€(gè)數(shù)碼管分別顯示時(shí)、分、秒。而控制每一個(gè)數(shù)碼管都需要段碼線和選位線來(lái)控制,這樣也節(jié)省了我們所需要使用的單片機(jī)IO口。

三、電路連接

使用Proteus進(jìn)行電路圖仿真

四 、程序設(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; //工作方式 1TH0 = 0x3c;  //高八位賦初值    65536-50000=15536 = 3cb0HTL0 = 0xb0;  //底八位賦初值EA = 1;      //開(kāi)總中斷ET0 = 1;     //開(kāi) 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 0000P0 = num[miao_L];  //秒個(gè)位delay(500);P2 = 0x40; //數(shù)碼管位選 0100 0000P0 = num[miao_H];  //秒十位delay(500);P2 = 0x10; //數(shù)碼管位選 0001 0000P0 = num[fen_L];  //分個(gè)位delay(500);P2 = 0x08; //數(shù)碼管位選 0000 1000P0 = num[fen_H];  //分十位delay(500);P2 = 0x02; //數(shù)碼管位選 0000 0010P0 = num[shi_L];  //分個(gè)位delay(500);P2 = 0x01; //數(shù)碼管位選 0000 0001P0 = 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)志位加 1if(miao == 60){miao = 0;  //滿一分清零fen++;if(fen == 60){fen = 0;  //滿一時(shí)清零shi++;if(shi == 24){shi = 0;  //24小時(shí)制fen = 0;miao = 0;}}}miao_L = miao%10;  //秒個(gè)位miao_H = miao/10;  //秒十位fen_L = fen%10;  //分個(gè)位fen_H = fen/10;  //分十位shi_L = shi%10;  //時(shí)個(gè)位shi_H = shi/10;  //時(shí)十位 } }

五、總結(jié)

本章對(duì)多位數(shù)碼管的使用進(jìn)行了更深一步的研究,更加貼近我們的生活。一個(gè)復(fù)雜的程序都是由簡(jiǎn)單的程序慢慢延伸下去的,都不是一蹴而就的,其實(shí)在我們一步一步的學(xué)習(xí)中,我們已經(jīng)能對(duì)生活中的電子產(chǎn)品進(jìn)行自己的修改了,下一章我們將學(xué)習(xí)如何更為合理的使用定時(shí)器來(lái)對(duì)數(shù)碼管的顯示進(jìn)行控制

標(biāo)簽:

上一篇:單片機(jī)入門(mén)之?dāng)?shù)碼管定時(shí)鬧鐘(1)
下一篇:最后一頁(yè)