0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用定時(shí)器和數(shù)碼管實(shí)現(xiàn)簡易秒計(jì)時(shí)器

CHANBAEK ? 來源: Zi Jin Code ? 作者: 錕醬不是醬 ? 2023-11-02 10:50 ? 次閱讀

從今天開始,我們利用上前幾天學(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í)器
      }
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(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
收藏 人收藏

    評論

    相關(guān)推薦

    4位數(shù)碼管計(jì)時(shí)器

    4位數(shù)碼管計(jì)時(shí)器
    發(fā)表于 04-12 00:33

    定時(shí)器問題

    我用兩個(gè)定時(shí)器到數(shù)計(jì)時(shí),通過數(shù)碼管來顯示,第一個(gè)計(jì)時(shí)器正常計(jì)時(shí),可是第二個(gè)60
    發(fā)表于 11-06 16:20

    通過定時(shí)器來控制跑時(shí)間間隔,數(shù)碼管的動(dòng)態(tài)顯示能實(shí)現(xiàn)

    大大……通過定時(shí)器來控制跑的時(shí)間間隔,然后用其中兩個(gè)數(shù)碼管來顯示!這個(gè)用數(shù)碼管的動(dòng)態(tài)顯示能實(shí)現(xiàn)嗎?請各位大大們教教小弟……如圖
    發(fā)表于 05-12 23:40

    數(shù)碼管10計(jì)時(shí)程序

    數(shù)碼管10計(jì)時(shí)程序,C51單片機(jī)之數(shù)碼管實(shí)現(xiàn)99計(jì)時(shí)
    發(fā)表于 07-14 07:50

    51單片機(jī)如何實(shí)現(xiàn)數(shù)碼管99計(jì)時(shí)

    51單片機(jī)99計(jì)時(shí)C語言源程序51單片機(jī)實(shí)現(xiàn)數(shù)碼管99計(jì)時(shí),其實(shí)很簡單,就是使用
    發(fā)表于 07-15 06:25

    基于單片機(jī)的時(shí)鐘計(jì)時(shí)器系統(tǒng)設(shè)計(jì)與制作 精選資料分享

    基于單片機(jī)的時(shí)鐘計(jì)時(shí)器系統(tǒng)設(shè)計(jì)與制作[摘要]這次課程設(shè)計(jì)以STC89C51單片機(jī)為核心,輔以必要的電路,設(shè)計(jì)了一個(gè)簡易的電子時(shí)鐘,它由5V直流電源供電,通過數(shù)碼管能夠準(zhǔn)確顯示時(shí)間,調(diào)整時(shí)間,從而到達(dá)
    發(fā)表于 07-21 07:47

    請問51單片機(jī)定時(shí)器數(shù)碼管如何實(shí)現(xiàn)9999到0的倒計(jì)時(shí)C語言?

    請問51單片機(jī)定時(shí)器數(shù)碼管如何實(shí)現(xiàn)9999到0的倒計(jì)時(shí)C語言?
    發(fā)表于 10-14 06:02

    基于單片機(jī)的綜合應(yīng)用程序數(shù)碼管【C語言】定時(shí)器控制數(shù)碼管

    基于單片機(jī)的綜合應(yīng)用程序數(shù)碼管【C語言】定時(shí)器控制數(shù)碼管
    發(fā)表于 01-06 13:44 ?27次下載

    基于8051的Proteus仿真-定時(shí)器控制數(shù)碼管動(dòng)顯示

    基于8051的Proteus仿真-定時(shí)器控制數(shù)碼管動(dòng)顯示
    發(fā)表于 09-01 23:33 ?19次下載

    定時(shí)器1計(jì)數(shù),數(shù)碼管顯示0-999程序代碼【下載】

    定時(shí)器1計(jì)數(shù),數(shù)碼管顯示0-999
    發(fā)表于 12-20 14:23 ?18次下載

    51單片機(jī)+4位數(shù)碼管計(jì)時(shí)器按鍵可調(diào)節(jié)

    51單片機(jī)+4位數(shù)碼管計(jì)時(shí)器按鍵可調(diào)節(jié)4位數(shù)碼管計(jì)時(shí),采用定時(shí)器proteus仿真源代碼#in
    發(fā)表于 11-20 10:36 ?29次下載
    51單片機(jī)+4位<b class='flag-5'>數(shù)碼管</b><b class='flag-5'>計(jì)時(shí)器</b>按鍵可調(diào)節(jié)

    51單片機(jī)數(shù)碼管顯示60計(jì)時(shí)(C語言)

    51單片機(jī)數(shù)碼管顯示60計(jì)時(shí)基于普中51單片機(jī)開發(fā)板,運(yùn)用定時(shí)器/計(jì)數(shù)0和1,實(shí)現(xiàn)60
    發(fā)表于 11-21 17:21 ?71次下載
    51單片機(jī)<b class='flag-5'>數(shù)碼管</b>顯示60<b class='flag-5'>秒</b>倒<b class='flag-5'>計(jì)時(shí)</b>(C語言)

    STM32+Proteus仿真實(shí)現(xiàn)滴答定時(shí)器計(jì)時(shí)和數(shù)碼管實(shí)時(shí)顯示功能

    STM32+Proteus仿真實(shí)現(xiàn)滴答定時(shí)器計(jì)時(shí)和數(shù)碼管實(shí)時(shí)顯示功能
    發(fā)表于 11-24 21:06 ?73次下載
    STM32+Proteus仿真<b class='flag-5'>實(shí)現(xiàn)</b>滴答<b class='flag-5'>定時(shí)器</b><b class='flag-5'>計(jì)時(shí)</b><b class='flag-5'>和數(shù)碼管</b>實(shí)時(shí)顯示功能

    EDA程序設(shè)計(jì)之計(jì)時(shí)器設(shè)計(jì)

    計(jì)時(shí)器的設(shè)計(jì)1. 設(shè)計(jì)任務(wù) 設(shè)計(jì)并制作一臺計(jì)時(shí)器。2. 設(shè)計(jì)要求① 用EDA實(shí)訓(xùn)儀的I/O設(shè)備和PLD芯片實(shí)現(xiàn)計(jì)時(shí)器的設(shè)計(jì)。② 計(jì)時(shí)器能夠顯
    發(fā)表于 08-22 10:16 ?2次下載

    用555定時(shí)器怎樣實(shí)現(xiàn)15計(jì)時(shí)電路?

    用555定時(shí)器怎樣實(shí)現(xiàn)15計(jì)時(shí)電路 555定時(shí)器是一種常用的集成電路,它可以將電路中的電壓信號轉(zhuǎn)換為周期性的脈沖信號或方波信號,是數(shù)字電路
    的頭像 發(fā)表于 09-02 16:20 ?4179次閱讀