從今天開始,我們利用上前幾天學習的定時器和數碼管,一起設計一個簡單的秒計時器
項目工作流程:單片機開機機器自動啟動計時器,計時器從0開始計時,每一秒加一,直到9999后自動復位成0000。
這個項目中我們使用到數碼管和單片機C51的Timer0,定時器每次定時5ms,每次滿5ms的時候輸出一次一位的顯示,同時數碼管位控為一一位,移到最后一位數碼管就自動回到第一位,累計計滿200次5ms(也就是1秒以后),計時器+1,直到9999
我們用一個數組存下寄存器的數值,這個數組是Time[4],其中Time[0]對應個位,Time[1]對應十位,Time[2]對應百位,Time[3]對應千位
計算出初始值為60928,換算
TH0 = 0xEE;
TL0 = 0x00;
整個項目的電路圖:
這里不得不提醒一下,我們之前設計的電路圖中,左邊的數碼管是第一位
//從左往右數:最左邊第一位數碼管,接下來是二,三,四
sbit Smg_1 = P2^0;//第一位數碼管接在P2.0
sbit Smg_2 = P2^1;//第一位數碼管接在P2.1
sbit Smg_3 = P2^2;//第一位數碼管接在P2.2
sbit Smg_4 = P2^3;//第一位數碼管接在P2.3
//整個數碼管取模
unsigned char code Smgbit[] = {0xFE,0XFD,0xFB,0xF7};
現在,為了讓數碼管配合我們存放時間的變量Time[],所以我們換了一下數碼管的位,現在是左邊第一位是第一位
不過這個大家不用記住,我們的工程用到的時候要我會跟大家說的,所以本工程中的數碼管的位控
//從左往右數:最左邊第一位數碼管,接下來是二,三,四
sbit Smg_1 = P2^3;//第一位數碼管接在P2.0
sbit Smg_2 = P2^2;//第一位數碼管接在P2.1
sbit Smg_3 = P2^1;//第一位數碼管接在P2.2
sbit Smg_4 = P2^0;//第一位數碼管接在P2.3
//整個數碼管取模
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};
//數碼管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
//數碼管位控
//操作的時候直接用P2 = Smgbit[0~3]對應1~4位數碼管
unsigned char SmgSelect = 0;//數碼管選位
//這里不得不特別說明
//SmgSelect不僅僅是控制我們的數碼管位控,還控制著數碼管顯示時對描述位置的選位操作
//Smgbit 0 1 2 3
//數碼管 1 2 3 4 位
//秒數 個 十 百 千
//----------------------------------------------------------------
unsigned char TimerCount = 0;//這個變量記錄定時器定時溢出次數
//(定時器一次定時5ms)
//----------------------------------------------------------------
unsigned char a = 0;
//----------這個是一個臨時變量
void main()
{//注意設置定時器初始值要在main函數里面設置
TMOD = 0x01;
/*設置定時器模式寄存器TMOD為 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
標準16位定時器
*/
//先設置定時器初始值,我們一次延遲5ms,計算得初始值為60928
TL0 = 0x00;//設置定時器初始值低位
TH0 = 0xEE;//設置定時器初始值高位
TR0 = 1;//記得一定要設置定時器開啟
while(1)
{
if (TF0 == 1)
{
P2 = 0xFF;//注意每次寫數碼管之前都要把所有的數碼管關閉
a = Time[SmgSelect];
P0 = Smg[a];
//這個過程先從Time[]里面取出位數的數值
//再把這個數值送到Smgbit里面選擇出這位數對應的數碼管取模
//最后把這個取模的數據送給P0 IO組,顯示
P2 = Smgbit[SmgSelect];
//選擇數碼管位置
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;//設置定時器初始值低位
TH0 = 0xEE;//設置定時器初始值高位
TF0 = 0;//設置好初始值后再復位定時器
}
}
}
-
單片機
+關注
關注
6037文章
44569瀏覽量
636195 -
寄存器
+關注
關注
31文章
5357瀏覽量
120587 -
數碼管
+關注
關注
32文章
1882瀏覽量
91208 -
定時器
+關注
關注
23文章
3251瀏覽量
114959
發布評論請先 登錄
相關推薦
評論