從今天開始,我們利用上前幾天學習的定時器和數碼管,一起設計一個簡單的秒計時器
項目工作流程:單片機開機機器自動啟動計時器,計時器從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;//設置好初始值后再復位定時器
}
}
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
單片機
+關注
關注
6078文章
45557瀏覽量
672872 -
寄存器
+關注
關注
31文章
5615瀏覽量
130333 -
數碼管
+關注
關注
32文章
1894瀏覽量
94369 -
定時器
+關注
關注
23文章
3370瀏覽量
124328
發布評論請先 登錄
相關推薦
熱點推薦
通過定時器來控制跑秒時間間隔,數碼管的動態顯示能實現
大大……通過定時器來控制跑秒的時間間隔,然后用其中兩個數碼管來顯示!這個用數碼管的動態顯示能實現嗎?請各位大大們教教小弟……如圖
發表于 05-12 23:40
基于單片機的時鐘計時器系統設計與制作 精選資料分享
基于單片機的時鐘計時器系統設計與制作[摘要]這次課程設計以STC89C51單片機為核心,輔以必要的電路,設計了一個簡易的電子時鐘,它由5V直流電源供電,通過數碼管能夠準確顯示時間,調整時間,從而到達
發表于 07-21 07:47
EDA程序設計之計時器設計
計時器的設計1. 設計任務 設計并制作一臺計時器。2. 設計要求① 用EDA實訓儀的I/O設備和PLD芯片實現計時器的設計。② 計時器能夠顯
發表于 08-22 10:16
?2次下載
用555定時器怎樣實現15秒計時電路?
用555定時器怎樣實現15秒計時電路 555定時器是一種常用的集成電路,它可以將電路中的電壓信號轉換為周期性的脈沖信號或方波信號,是數字電路
使用定時器和數碼管實現簡易秒計時器
評論