標(biāo)題: c51 24秒倒計(jì)時(shí) 求助大神 [打印本頁]

作者: 奈何橋見    時(shí)間: 2018-6-7 12:28
標(biāo)題: c51 24秒倒計(jì)時(shí) 求助大神
倒計(jì)時(shí)部分  有問題  求助大神指點(diǎn)

4.jpg (449.32 KB, 下載次數(shù): 35)

4.jpg

3.png (23.48 KB, 下載次數(shù): 34)

3.png

1.png (10.17 KB, 下載次數(shù): 45)

1.png

2.jpg (25.06 KB, 下載次數(shù): 39)

2.jpg

作者: wulin    時(shí)間: 2018-6-7 15:51
#include <AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P2^0;
sbit key2=P2^1;       
uchar code table[]={                //共陽數(shù)碼管段碼"0~f-."
                0xc0,0xf9,0xa4,0xb0,
                0x99,0x92,0x82,0xf8,
                0x80,0x90,0x88,0x83,
                0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
uchar Cnt50ms = 0;
uchar Cnt1s = 24;

void display()//顯示程序
{
        static uchar count=0;        //計(jì)數(shù)變量
        static uchar count1=0;
        count1++;                                        //動態(tài)顯示計(jì)數(shù)延時(shí)
        if(count1>=50)
        {
                count1=0;
                P1=0xff;                                        //消隱
                switch(count)
                {
                        case 0:
                           P3=0x01;                        //秒十位位碼
                           P1=table[Cnt1s/10];//秒十位段碼
                           count=1;
                        break;
                        case 1:                               
                           P3=0x02;                        //秒個(gè)位位碼
                           P1=table[Cnt1s%10];//秒個(gè)位段碼
                           count=0;
                        break;
                }
        }
}

void Timer0Init()                //50毫秒@12.000MHz
{
        TMOD= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0xB0;                //設(shè)置定時(shí)初值
        TH0 = 0x3C;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
//        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
        EA=1;                                                        //開總中斷
        ET0=1;                                                //開定時(shí)器0中斷
}
void keyscan()                                //按鍵掃描
{
        static uchar count1=0,count2=0;        //計(jì)數(shù)變量                       
        static bit key_sign1=0,key_sign2=0;        //按鍵狀態(tài)標(biāo)志

        if(key1==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計(jì)數(shù)延時(shí)消抖
                if((count1>=250)&&(key_sign1==0))
                {                       
                        key_sign1=1;                //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng)
                        TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
                }
        }
        else                                                         //按鍵抬起
        {
                count1=0;                                //計(jì)數(shù)變量清0
                key_sign1=0;                        //按鍵狀態(tài)標(biāo)志清0
        }
        if(key2==0)                                //檢測輸入如果為0
        {
                count2++;                                        //計(jì)數(shù)延時(shí)消抖
                if((count2>=250)&&(key_sign2==0))
                {                       
                        key_sign2=1;                //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng)
                        Cnt1s=24;
                        TR0 = 0;                                //定時(shí)器0停止計(jì)時(shí)
                }
        }
        else                                                         //按鍵抬起
        {
                count2=0;                                //計(jì)數(shù)變量清0
                key_sign2=0;                        //按鍵狀態(tài)標(biāo)志清0
        }
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定時(shí)器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
                display();                                //顯示程序
        }
}
/**************中斷服務(wù)程序*****************/
void timer0() interrupt        1
{
        TL0 = 0xB0;                //設(shè)置定時(shí)初值
        TH0 = 0x3C;                //設(shè)置定時(shí)初值
        Cnt50ms++;
        if(Cnt50ms>=20)                                //1s
        {
                Cnt50ms=0;
                Cnt1s--;
                if(Cnt1s==0)
                {
                        Cnt1s=0;
                        TR0 = 0;                        //定時(shí)器0停止計(jì)時(shí)
                }
        }
}
作者: 奈何橋見    時(shí)間: 2018-6-7 16:02
這個(gè)論壇沒人的嗎
作者: liyongan_1985    時(shí)間: 2018-6-7 18:09
啥問題也沒有說明白。再說這是你的全部程序嗎?如果是,你的程序計(jì)時(shí)是不會對的,因?yàn)槟愕亩〞r(shí)器在初始化的時(shí)候就已經(jīng)開始計(jì)數(shù)了,會產(chǎn)生計(jì)時(shí)不準(zhǔn)確的。
作者: zl2168    時(shí)間: 2018-6-7 20:47
本帖最后由 zl2168 于 2018-6-7 20:49 編輯

介紹你一個(gè)參考案例
實(shí)例96  能預(yù)置初值的倒計(jì)時(shí)秒表
實(shí)例96 能設(shè)置初值的倒計(jì)時(shí)秒表.rar (40 KB, 下載次數(shù): 31)
Proteus仿真一下,確認(rèn)有效。
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,書中電路和程序設(shè)計(jì)有詳細(xì)說明,電路與程序真實(shí)可靠可信可行,程序語句條條有注解。

作者: 奈何橋見    時(shí)間: 2018-6-8 16:45
liyongan_1985 發(fā)表于 2018-6-7 18:09
啥問題也沒有說明白。再說這是你的全部程序嗎?如果是,你的程序計(jì)時(shí)是不會對的,因?yàn)槟愕亩〞r(shí)器在初始化的 ...

額  第一次發(fā)帖見諒見諒  謝謝大佬的幫助
作者: 奈何橋見    時(shí)間: 2018-6-8 16:48
wulin 發(fā)表于 2018-6-7 15:51
#include
#define uchar unsigned char
#define uint  unsigned int

大神  你這是直接幫我寫出了嗎 辛苦了  還打好了備注  作為一個(gè)初學(xué)者  非常感謝
作者: 奈何橋見    時(shí)間: 2018-6-8 16:49
zl2168 發(fā)表于 2018-6-7 20:47
介紹你一個(gè)參考案例
實(shí)例96  能預(yù)置初值的倒計(jì)時(shí)秒表
先Proteus仿真一下,確認(rèn)有效。

謝謝幫助




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1