從今天開始,我們利用上前幾天學(xué)習(xí)的定時(shí)器和數(shù)碼管,一起設(shè)計(jì)一個(gè)簡單的秒計(jì)時(shí)器
項(xiàng)目工作流程:單片機(jī)開機(jī)機(jī)器自動(dòng)啟動(dòng)計(jì)時(shí)器,計(jì)時(shí)器從0開始計(jì)時(shí),每一秒加一,直到9999后自動(dòng)復(fù)位成0000。
這個(gè)項(xiàng)目中我們使用到數(shù)碼管和單片機(jī)C51的Timer0,定時(shí)器每次定時(shí)5ms,每次滿5ms的時(shí)候輸出一次一位的顯示,同時(shí)數(shù)碼管位控為一一位,移到最后一位數(shù)碼管就自動(dòng)回到第一位,累計(jì)計(jì)滿200次5ms(也就是1秒以后),計(jì)時(shí)器+1,直到9999
我們用一個(gè)數(shù)組存下寄存器的數(shù)值,這個(gè)數(shù)組是Time[4],其中Time[0]對應(yīng)個(gè)位,Time[1]對應(yīng)十位,Time[2]對應(yīng)百位,Time[3]對應(yīng)千位
計(jì)算出初始值為60928,換算
TH0 = 0xEE;
TL0 = 0x00;
整個(gè)項(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
//整個(gè)數(shù)碼管取模
unsigned char code Smgbit[] = {0xFE,0XFD,0xFB,0xF7};
現(xiàn)在,為了讓數(shù)碼管配合我們存放時(shí)間的變量Time[],所以我們換了一下數(shù)碼管的位,現(xiàn)在是左邊第一位是第一位
不過這個(gè)大家不用記住,我們的工程用到的時(shí)候要我會跟大家說的,所以本工程中的數(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
//整個(gè)數(shù)碼管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
程序大概流程(畫的有點(diǎn)丑,見諒):
程序框圖:
代碼:
//這個(gè)代碼展示的是一個(gè)0~9999秒的計(jì)時(shí)器
#include< reg52.h >
unsigned char Time[4] = {0,0,0,0};//我們的計(jì)時(shí)器時(shí)間的變量
//這四個(gè)TIME元素分別代表千位(TIME(3))百位(TIME(2))十位(TIME(1))個(gè)位(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ù)碼管位控
//操作的時(shí)候直接用P2 = Smgbit[0~3]對應(yīng)1~4位數(shù)碼管
unsigned char SmgSelect = 0;//數(shù)碼管選位
//這里不得不特別說明
//SmgSelect不僅僅是控制我們的數(shù)碼管位控,還控制著數(shù)碼管顯示時(shí)對描述位置的選位操作
//Smgbit 0 1 2 3
//數(shù)碼管 1 2 3 4 位
//秒數(shù) 個(gè) 十 百 千
//----------------------------------------------------------------
unsigned char TimerCount = 0;//這個(gè)變量記錄定時(shí)器定時(shí)溢出次數(shù)
//(定時(shí)器一次定時(shí)5ms)
//----------------------------------------------------------------
unsigned char a = 0;
//----------這個(gè)是一個(gè)臨時(shí)變量
void main()
{//注意設(shè)置定時(shí)器初始值要在main函數(shù)里面設(shè)置
TMOD = 0x01;
/*設(shè)置定時(shí)器模式寄存器TMOD為 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
標(biāo)準(zhǔn)16位定時(shí)器
*/
//先設(shè)置定時(shí)器初始值,我們一次延遲5ms,計(jì)算得初始值為60928
TL0 = 0x00;//設(shè)置定時(shí)器初始值低位
TH0 = 0xEE;//設(shè)置定時(shí)器初始值高位
TR0 = 1;//記得一定要設(shè)置定時(shí)器開啟
while(1)
{
if (TF0 == 1)
{
P2 = 0xFF;//注意每次寫數(shù)碼管之前都要把所有的數(shù)碼管關(guān)閉
a = Time[SmgSelect];
P0 = Smg[a];
//這個(gè)過程先從Time[]里面取出位數(shù)的數(shù)值
//再把這個(gè)數(shù)值送到Smgbit里面選擇出這位數(shù)對應(yīng)的數(shù)碼管取模
//最后把這個(gè)取模的數(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è)置定時(shí)器初始值低位
TH0 = 0xEE;//設(shè)置定時(shí)器初始值高位
TF0 = 0;//設(shè)置好初始值后再復(fù)位定時(shí)器
}
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631973 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119814 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1873瀏覽量
90865 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114326
發(fā)布評論請先 登錄
相關(guān)推薦
評論