從今天開始,我們利用上前幾天學(xué)習(xí)的定時器和數(shù)碼管,一起設(shè)計一個簡單的秒計時器
項目工作流程:單片機開機機器自動啟動計時器,計時器從0開始計時,每一秒加一,直到9999后自動復(fù)位成0000。
這個項目中我們使用到數(shù)碼管和單片機C51的Timer0,定時器每次定時5ms,每次滿5ms的時候輸出一次一位的顯示,同時數(shù)碼管位控為一一位,移到最后一位數(shù)碼管就自動回到第一位,累計計滿200次5ms(也就是1秒以后),計時器+1,直到9999
我們用一個數(shù)組存下寄存器的數(shù)值,這個數(shù)組是Time[4],其中Time[0]對應(yīng)個位,Time[1]對應(yīng)十位,Time[2]對應(yīng)百位,Time[3]對應(yīng)千位
計算出初始值為60928,換算
TH0 = 0xEE;
TL0 = 0x00;
整個項目的電路圖:
這里不得不提醒一下,我們之前設(shè)計的電路圖中,左邊的數(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};
程序大概流程(畫的有點丑,見諒):
程序框圖:
代碼:
//這個代碼展示的是一個0~9999秒的計時器
#include< reg52.h >
unsigned char Time[4] = {0,0,0,0};//我們的計時器時間的變量
//這四個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
標準16位定時器
*/
//先設(shè)置定時器初始值,我們一次延遲5ms,計算得初始值為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ù)位定時器
}
}
}
-
單片機
+關(guān)注
關(guān)注
6043文章
44623瀏覽量
638788 -
寄存器
+關(guān)注
關(guān)注
31文章
5367瀏覽量
121222 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1887瀏覽量
91434 -
定時器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115410
發(fā)布評論請先 登錄
相關(guān)推薦
評論