從今天開始,我們利用上前幾天學(xué)習(xí)的定時器和數(shù)碼管,一起設(shè)計(jì)一個簡單的秒計(jì)時器
項(xiàng)目工作流程:單片機(jī)開機(jī)機(jī)器自動啟動計(jì)時器,計(jì)時器從0開始計(jì)時,每一秒加一,直到9999后自動復(fù)位成0000。
這個項(xiàng)目中我們使用到數(shù)碼管和單片機(jī)C51的Timer0,定時器每次定時5ms,每次滿5ms的時候輸出一次一位的顯示,同時數(shù)碼管位控為一一位,移到最后一位數(shù)碼管就自動回到第一位,累計(jì)計(jì)滿200次5ms(也就是1秒以后),計(jì)時器+1,直到9999
我們用一個數(shù)組存下寄存器的數(shù)值,這個數(shù)組是Time[4],其中Time[0]對應(yīng)個位,Time[1]對應(yīng)十位,Time[2]對應(yīng)百位,Time[3]對應(yīng)千位
計(jì)算出初始值為60928,換算
TH0 = 0xEE;
TL0 = 0x00;
整個項(xiàng)目的電路圖:

這里不得不提醒一下,我們之前設(shè)計(jì)的電路圖中,左邊的數(shù)碼管是第一位

//從左往右數(shù):最左邊第一位數(shù)碼管,接下來是二,三,四
sbit Smg_1 = P2^0;//第一位數(shù)碼管接在P2.0
sbit Smg_2 = P2^1;//第一位數(shù)碼管接在P2.1
sbit Smg_3 = P2^2;//第一位數(shù)碼管接在P2.2
sbit Smg_4 = P2^3;//第一位數(shù)碼管接在P2.3
//整個數(shù)碼管取模
unsigned char code Smgbit[] = {0xFE,0XFD,0xFB,0xF7};
現(xiàn)在,為了讓數(shù)碼管配合我們存放時間的變量Time[],所以我們換了一下數(shù)碼管的位,現(xiàn)在是左邊第一位是第一位

不過這個大家不用記住,我們的工程用到的時候要我會跟大家說的,所以本工程中的數(shù)碼管的位控
//從左往右數(shù):最左邊第一位數(shù)碼管,接下來是二,三,四
sbit Smg_1 = P2^3;//第一位數(shù)碼管接在P2.0
sbit Smg_2 = P2^2;//第一位數(shù)碼管接在P2.1
sbit Smg_3 = P2^1;//第一位數(shù)碼管接在P2.2
sbit Smg_4 = P2^0;//第一位數(shù)碼管接在P2.3
//整個數(shù)碼管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
程序大概流程(畫的有點(diǎn)丑,見諒):

程序框圖:

代碼:
//這個代碼展示的是一個0~9999秒的計(jì)時器
#include< reg52.h >
unsigned char Time[4] = {0,0,0,0};//我們的計(jì)時器時間的變量
//這四個TIME元素分別代表千位(TIME(3))百位(TIME(2))十位(TIME(1))個位(TIME(0))
//----------------------------------------------------------------
//----------------------------------------------------------------
unsigned char code Smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數(shù)碼管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
//數(shù)碼管位控
//操作的時候直接用P2 = Smgbit[0~3]對應(yīng)1~4位數(shù)碼管
unsigned char SmgSelect = 0;//數(shù)碼管選位
//這里不得不特別說明
//SmgSelect不僅僅是控制我們的數(shù)碼管位控,還控制著數(shù)碼管顯示時對描述位置的選位操作
//Smgbit 0 1 2 3
//數(shù)碼管 1 2 3 4 位
//秒數(shù) 個 十 百 千
//----------------------------------------------------------------
unsigned char TimerCount = 0;//這個變量記錄定時器定時溢出次數(shù)
//(定時器一次定時5ms)
//----------------------------------------------------------------
unsigned char a = 0;
//----------這個是一個臨時變量
void main()
{//注意設(shè)置定時器初始值要在main函數(shù)里面設(shè)置
TMOD = 0x01;
/*設(shè)置定時器模式寄存器TMOD為 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
標(biāo)準(zhǔn)16位定時器
*/
//先設(shè)置定時器初始值,我們一次延遲5ms,計(jì)算得初始值為60928
TL0 = 0x00;//設(shè)置定時器初始值低位
TH0 = 0xEE;//設(shè)置定時器初始值高位
TR0 = 1;//記得一定要設(shè)置定時器開啟
while(1)
{
if (TF0 == 1)
{
P2 = 0xFF;//注意每次寫數(shù)碼管之前都要把所有的數(shù)碼管關(guān)閉
a = Time[SmgSelect];
P0 = Smg[a];
//這個過程先從Time[]里面取出位數(shù)的數(shù)值
//再把這個數(shù)值送到Smgbit里面選擇出這位數(shù)對應(yīng)的數(shù)碼管取模
//最后把這個取模的數(shù)據(jù)送給P0 IO組,顯示
P2 = Smgbit[SmgSelect];
//選擇數(shù)碼管位置
SmgSelect++;
if (SmgSelect >3){SmgSelect = 0;}//如果選位變量超過3,歸零
TimerCount++;
if(TimerCount > 200)
{
Time[0]++;
TimerCount = 0;
//檢測第一位有沒有滿
if(Time[0] >9)
{
Time[0] = 0;
Time[1]++;
}
//檢測第二位有沒有滿
if(Time[1] >9)
{
Time[1] = 0;
Time[2]++;
}
//檢測第三位有沒有滿
if(Time[2] >9)
{
Time[2] = 0;
Time[3]++;
}
//檢測第三位有沒有滿
if(Time[3] >9)
{
Time[3] = 0;
}
}
TL0 = 0x00;//設(shè)置定時器初始值低位
TH0 = 0xEE;//設(shè)置定時器初始值高位
TF0 = 0;//設(shè)置好初始值后再復(fù)位定時器
}
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670376 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129996 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1894瀏覽量
94142 -
定時器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123628
發(fā)布評論請先 登錄
通過定時器來控制跑秒時間間隔,數(shù)碼管的動態(tài)顯示能實(shí)現(xiàn)
數(shù)碼管10秒倒計(jì)時程序
51單片機(jī)如何實(shí)現(xiàn)數(shù)碼管99秒倒計(jì)時
基于單片機(jī)的時鐘計(jì)時器系統(tǒng)設(shè)計(jì)與制作 精選資料分享
請問51單片機(jī)定時器數(shù)碼管如何實(shí)現(xiàn)9999到0的倒計(jì)時C語言?
基于單片機(jī)的綜合應(yīng)用程序數(shù)碼管【C語言】定時器控制數(shù)碼管
定時器1秒計(jì)數(shù),數(shù)碼管顯示0-999程序代碼【下載】
51單片機(jī)+4位數(shù)碼管計(jì)時器按鍵可調(diào)節(jié)
51單片機(jī)數(shù)碼管顯示60秒倒計(jì)時(C語言)
STM32+Proteus仿真實(shí)現(xiàn)滴答定時器計(jì)時和數(shù)碼管實(shí)時顯示功能
使用定時器和數(shù)碼管實(shí)現(xiàn)簡易秒計(jì)時器
評論