單片機(jī)實(shí)現(xiàn)秒表計(jì)時(shí)

要求:

用stc89c51,數(shù)碼管土匀,鎖存器實(shí)現(xiàn)秒表功能

實(shí)驗(yàn)仿真圖:

1.png

加入兩個(gè)鎖存器使單片機(jī)能夠分時(shí)進(jìn)行位選和段選,這樣做的目的是為了節(jié)省單片機(jī)的端口數(shù)量米苹。P0口控制位選和段選公般,實(shí)現(xiàn)動(dòng)態(tài)數(shù)碼管的顯示,P2口連接了矩陣鍵盤择份,可以進(jìn)行功能的拓展扣孟。

注意,關(guān)于鎖存器和數(shù)碼管無(wú)法正常工作的問題荣赶,在圖1中P0口接了8個(gè)上拉電阻凤价,原因是P0口內(nèi)部沒有上拉電阻或電阻不夠,如果不外接一個(gè)上拉電阻拔创,P0口有可能只能輸出低電平和懸空狀態(tài)利诺,無(wú)法輸出高電平,而實(shí)驗(yàn)中所選用的數(shù)碼管是共陰極的數(shù)碼管剩燥,會(huì)導(dǎo)致數(shù)碼管不能工作慢逾,如果有類似問題出現(xiàn),可嘗試接上上拉電阻灭红。

接有鎖存器的動(dòng)態(tài)數(shù)碼管顯示:

動(dòng)態(tài)顯示原理圖.png

動(dòng)態(tài)顯示電路如圖侣滩,共8個(gè)共陰極數(shù)碼管,采用兩片74LS573進(jìn)行驅(qū)動(dòng)变擒,74LS573與74LS373都是8D鎖存器君珠,只是573引腳排列更易于布線。其引腳功能為:D1-D8為數(shù)據(jù)輸入端娇斑;Q1-Q8為數(shù)據(jù)輸出端策添;LE為數(shù)據(jù)輸入鎖存端材部,LE=1數(shù)據(jù)輸入D鎖存器,LE=0數(shù)據(jù)不能輸入D鎖存器唯竹,即LE下降沿鎖存當(dāng)前輸入數(shù)據(jù)乐导;地址輸出允許端,-OE=0輸出鎖存數(shù)據(jù)摩窃,-OE=1輸出高阻兽叮。
電路中,U1輸出段碼a b c d e f g db猾愿,控制顯示的字形與小數(shù)點(diǎn)鹦聪,U2輸出位選碼,控制第幾個(gè)數(shù)碼管顯示蒂秘。單片機(jī)P1.4泽本、P1.5分別連接到U1、U2的LE姻僧,P1.3連接U1和U2的-OE规丽。根據(jù)硬件電路,動(dòng)態(tài)顯示編程時(shí)撇贺,應(yīng):① P1.3=1赌莺,U1、U2輸出高阻松嘶;② P1.4=1艘狭,P0口輸出段碼,P1.4=0翠订,U1鎖存輸入的段碼巢音;③ P1.5=1,P0口輸出位選碼尽超,P1.5=0官撼,U2鎖存輸入的位選碼;④ P1.3=0似谁,U1傲绣、U2同時(shí)輸出段碼和位選碼,進(jìn)行顯示巩踏,經(jīng)過一段時(shí)間后斜筐,再對(duì)另一個(gè)數(shù)碼管做同樣的操作。

矩陣鍵盤

矩陣鍵盤原理圖.png

程序源代碼

#include"reg51.h"
#include"intrins.h"
#define uchar unsigned  char
#define uint unsigned int
sbit OE = P1^3;
sbit LE1 = P1^4;
sbit LE2 = P1^5;
data uchar h,m,i,s;
uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code reg[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void show();
void delay(uint t){
    uchar i;
    while(t--)
        for(i=0;i<200;i++);
}

void main(){

while(1){
    TMOD=0x01;                  // 設(shè)置定時(shí)器T0為方式1定時(shí)
    TH0=(65536-50000)/256;      // 給T0裝入初值
    TL0=(65536-50000)%256;      // 給T0裝入初值
    ET0=1;                      // 允許T0中斷
    TR0=1;
    EA=1;
    show();
}                       //CPU開中斷        
}
void  T0_int(void)  interrupt 1 
  { 
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    i++;
    if(i==20)                       //1s時(shí)間
    { i=0;
      s++; 
    }
    if(s==60)                       //1s時(shí)間
    { s=0;
      m++; 
    }
    if(m==60)                       //1s時(shí)間
    { m=0;
      h++; 
    }
  }


void show()
{
    uint i;

    for(i=0;i<8;i++)
    {   
           OE = 1;
           LE2 = 1;
           OE = 0;
            P0=~reg[i];
           LE2 = 0;
           OE=1;
           LE1 = 1;
           OE = 0;
            //OE =0;    
        if(i==2||i==5)
        {
        P0=0x40;//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    

        }
        if(h<10)
        {
           if(i==7) 
        {
        P0=dis_code[0];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    

        }
         if(i==6) 
        {
        P0=dis_code[h];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    
    
        }

        }
        if(m<10)
        {
           if(i==4) 
        {
        P0=dis_code[0];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    

        }
         if(i==3) 
        {
        P0=dis_code[m];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    
    
        }

        }
        if(s<10)
        {
            if(i==1) 
        {
        P0=dis_code[0];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    
    
        }
         if(i==0) 
        {
        P0=dis_code[s];//發(fā)送段碼
        delay(4); //間隔一段時(shí)間掃描    
    
        }
        }
        if(h>=10)
            {
               if(i==7) 
            {
            P0=dis_code[h/10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    
    
            }
             if(i==6) 
            {
            P0=dis_code[h%10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    
        
            }
            if(h>=24)h=0;
            }
    if(m>=10)
            {
            if(i==4) 
            {
            P0=dis_code[m/10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    
    
            }
            if(i==3) 
            {
            P0=dis_code[m%10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    
    
            }
            if(m>60)m=1;
            }
    if(s>=10)
            {
            if(i==1) 
            {
            P0=dis_code[s/10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    

            }
            if(i==0) 
            {
            P0=dis_code[s%10];//發(fā)送段碼
            delay(4); //間隔一段時(shí)間掃描    

            }
            if(s>60)s=1;
            }
        //  delay(100);
            OE=0;
        }
    }

注意:如果在仿真實(shí)驗(yàn)中數(shù)碼管無(wú)法一起點(diǎn)亮蛀缝,可能是延時(shí)需要改進(jìn),延時(shí)的總數(shù)在300-400之間合適目代,比如本實(shí)驗(yàn)的延時(shí)函數(shù)中是100個(gè)數(shù)屈梁,那么在外層自定義的數(shù)就定在4嗤练,共延時(shí)400個(gè)數(shù),延時(shí)函數(shù)需要根據(jù)實(shí)驗(yàn)的不同進(jìn)行調(diào)整在讶。

程序相對(duì)簡(jiǎn)易煞抬,沒有使用算法,主要思想就是將時(shí)构哺、分革答、秒作為全局變量,在定時(shí)器中計(jì)時(shí)曙强,通過單獨(dú)的顯示函數(shù)來(lái)顯示残拐,主函數(shù)只進(jìn)行中斷開關(guān)和調(diào)用顯示函數(shù),所以代碼相對(duì)易懂碟嘴,需要注意的是溪食,在定時(shí)的過程中,當(dāng)時(shí)間到達(dá)最大時(shí)需要及時(shí)歸零娜扇,比如計(jì)時(shí)到達(dá)60s是要將秒的全局變量歸零错沃,另外,想要做鬧鐘或者定時(shí)器的朋友可以沿用本實(shí)驗(yàn)電路和代碼雀瓢,矩陣鍵盤已連接枢析,只需在代碼加入矩陣鍵盤的操作就能實(shí)現(xiàn)想要的功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刃麸,一起剝皮案震驚了整個(gè)濱河市醒叁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫌蚤,老刑警劉巖辐益,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脱吱,居然都是意外死亡智政,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門箱蝠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)续捂,“玉大人,你說我怎么就攤上這事宦搬⊙榔埃” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵间校,是天一觀的道長(zhǎng)矾克。 經(jīng)常有香客問我,道長(zhǎng)憔足,這世上最難降的妖魔是什么胁附? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任酒繁,我火速辦了婚禮,結(jié)果婚禮上控妻,老公的妹妹穿的比我還像新娘州袒。我一直安慰自己,他們只是感情好弓候,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布郎哭。 她就那樣靜靜地躺著,像睡著了一般菇存。 火紅的嫁衣襯著肌膚如雪夸研。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天撰筷,我揣著相機(jī)與錄音陈惰,去河邊找鬼。 笑死毕籽,一個(gè)胖子當(dāng)著我的面吹牛抬闯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播关筒,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼溶握,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蒸播?” 一聲冷哼從身側(cè)響起睡榆,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍榆,沒想到半個(gè)月后胀屿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包雀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年宿崭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片才写。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葡兑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赞草,到底是詐尸還是另有隱情讹堤,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布厨疙,位于F島的核電站洲守,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岖沛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一暑始、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婴削,春花似錦、人聲如沸牙肝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)配椭。三九已至虫溜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間股缸,已是汗流浹背衡楞。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敦姻,地道東北人瘾境。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镰惦,于是被迫代替她去往敵國(guó)和親迷守。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容