欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2908|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

秒表程序有問題了,求大神幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:328743 發(fā)表于 2018-5-14 10:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
設(shè)計了一個三位數(shù)的秒表,通過按k3按鍵暫停計數(shù)。秒表計數(shù)正常,不知為何數(shù)碼管平時不顯示數(shù)字,按下K3后才會顯示當(dāng)時的秒數(shù)。不知什么原因,求大神解答。
代碼如下:
#include<reg52.h>                 

typedef unsigned int u16;         
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//連接譯碼器,選擇點亮的數(shù)碼管
sbit k3=P3^2;


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~f
u16 s,n;
u8 sec,mb[7];


void Timer0Init()//使定時器0初始化的函數(shù)
{
        TMOD|=0X01;//選擇定時器0模式,工作方式為1,僅用TR0打開
        TH0=0XFC;        //給定時器賦初值,定時1ms
        TL0=0X18;       
        TR0=1;//打開定時器       
}



void delay(u16 i)//延時函數(shù)
{
        while(i--);       
}



void miaoDisplay()//數(shù)碼管動態(tài)掃描,循環(huán)掃描顯示三位秒表數(shù)字
{
        u8 i;
        for(i=4;i<7;i++)
        {
                switch(i)         //位選,選擇點亮的數(shù)碼管
                {
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第5位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第6位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第7位
                }
                P0=smgduan[mb[i]];//發(fā)送段碼
                delay(1); //間隔一段時間掃描
                P0=0x00;//消隱
        }
}



void dingshi()//設(shè)置一個定時函數(shù)
        {
       
        while(n)
        {
                if(TF0==1)
                {
                        TF0=0;
                        TH0=0XFC;        //定時器賦初值,定時1ms
                        TL0=0X18;
                        s++;
                }
       
                if(k3==0)//檢測到K3按下,n置零,跳出循環(huán)
                {
                        delay(1000);
                  if(k3==0)
                  {
                          n=0;
                                break;
                  }
          }

               
                if(s==985)                 //到達1S時間
                {       
                        s=0;
                        sec++;
                        if(sec==600)sec=0;         //到達600秒,重新開始計數(shù)
                }
        }
}

void miao()//顯示秒數(shù)
       
{
        dingshi();
       
                mb[4]=sec%10;                           //顯示個位
            mb[5]=sec/10-(sec/100)*10;           //顯示十位
                    mb[6]=sec/100;               //顯示百位
                miaoDisplay();
       
        }
       

void main()
{       
Timer0Init();
        n=1;
        while(1)
        {
        miao();
        }
}


1.PNG (23.34 KB, 下載次數(shù): 62)

1.PNG

2.PNG (65.87 KB, 下載次數(shù): 54)

2.PNG

評分

參與人數(shù) 2黑幣 +15 收起 理由
ssvv + 5 共享資料的黑幣獎勵!
cciejs12345 + 10 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:319019 發(fā)表于 2018-5-14 15:02 | 只看該作者
改大delay(i);,時間太短頻率高,顯示不出
回復(fù)

使用道具 舉報

板凳
ID:19715 發(fā)表于 2018-5-14 15:28 | 只看該作者
改大delay(i);,不能及時響應(yīng)按鍵,建議按鍵采用外中斷
回復(fù)

使用道具 舉報

地板
ID:164602 發(fā)表于 2018-5-14 16:47 | 只看該作者
你的程序我簡單看了一下,樓上的幾位都沒說到點子上。
問題在你的dingshi()子函數(shù)中。
你這個子函數(shù)中,有一個while(n),而n=1,那么,程序執(zhí)行到此處,就“死”在這里了,死循環(huán),直到你按下k3鍵,出現(xiàn)這條語句n=0;break;才能跳出來,才會有顯示啊。
由于n=0了,所以,dingshi()子函數(shù)再也不執(zhí)行了,所以,就沒法看其它時間了。

秒表的按鍵,一定要用外部中斷才行的,你的這個程序思路有點不對,所以我沒有幫你改,改不了啊。
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2018-5-14 17:24 | 只看該作者
//上電待令,按鍵計時開始,再按計時停止,再按清0,周而復(fù)始。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//連接譯碼器,選擇點亮的數(shù)碼管
sbit k3=P3^2;
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar Cntus=0,Cnt100ms,Cnt1s=0;//中斷計時變量
bit zantin=0;                                        //暫停標(biāo)志


/***********定時器初始化程序****************/
void Timer0Init(void)                //2500微秒@12.000MHz
{
        TMOD= 0x01;                //設(shè)置定時器模式
        TL0 = 0x3C;                //設(shè)置定時初值
        TH0 = 0xF6;                //設(shè)置定時初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時器0開始計時
        EA=1;                        //開總中斷
        ET0=1;                //開定時器0中斷
}
/***********按鍵掃描程序****************/
void keyscan()       
{
        static uint count2=0,count1=0;        //計數(shù)變量                       
        static bit key_sign=0;                                //按鍵狀態(tài)標(biāo)志
        if(k3==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計數(shù)延時消抖
                if((count1>=500)&&(key_sign==0))//檢測按鍵如果為0
                {                       
                        key_sign=1;                //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng)
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                Cnt100ms=0;
                                                Cnt1s=0;        break;//清0
                                case 1:        zantin=1;   break;//計時
                                case 2:        zantin=0;        break;//暫停
                        }               
                }
        }
        else
        {
                count1=0;                                //計數(shù)變量清0
                key_sign=0;                                //按鍵狀態(tài)標(biāo)志清0
        }
}
void display()//顯示程序
{
        static uchar  i=0;
        P0=0x00;//消隱
        switch(i)
        {
                case(0):
                LSA=0;LSB=0;LSC=1;P0=table[Cnt1s/10];i++; break;//顯示第5位
                case(1):
                LSA=1;LSB=0;LSC=1;P0=table[Cnt1s%10]|0x80;i++; break;//顯示第6位
                case(2):
                LSA=0;LSB=1;LSC=1;P0=table[Cnt100ms];i=0; break;//顯示第7位
        }
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定時器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
        }
}
/**************中斷服務(wù)程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //設(shè)置定時初值
        TH0 = 0xF7;                //設(shè)置定時初值
        Cntus++;                                        //中斷變量Cntus自+1
        if(Cntus>=40)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暫停/啟動
                        Cnt100ms++;                        //毫秒計數(shù)
                if(Cnt100ms>=10)
                {
                        Cnt100ms=0;
                        Cnt1s++;                                //秒計數(shù)
                        if(Cnt1s>=60)
                                Cnt1s=0;
                }
        }
        display();                                        //顯示程序
}
回復(fù)

使用道具 舉報

6#
ID:164602 發(fā)表于 2018-5-15 08:25 | 只看該作者
wulin 發(fā)表于 2018-5-14 17:24
//上電待令,按鍵計時開始,再按計時停止,再按清0,周而復(fù)始。
#include
#define uint unsigned int

程序沒什么大問題。
不過我認為你的顯示函數(shù)中,顯示第5位與顯示第7位應(yīng)該對調(diào)一下吧。
不可能100ms顯示在s之前,對不對
回復(fù)

使用道具 舉報

7#
ID:213173 發(fā)表于 2018-5-15 14:33 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-5-15 08:25
程序沒什么大問題。
不過我認為你的顯示函數(shù)中,顯示第5位與顯示第7位應(yīng)該對調(diào)一下吧。
不可能100ms顯 ...

你沒有看清楚,樓主的程序是在8位數(shù)碼管的實驗板上從左至右只使用第5、6、7三個數(shù)碼管顯示。
回復(fù)

使用道具 舉報

8#
ID:328743 發(fā)表于 2018-5-15 19:41 | 只看該作者
已解決問題,感謝各位大神的指導(dǎo)
回復(fù)

使用道具 舉報

9#
ID:111634 發(fā)表于 2018-5-15 21:19 | 只看該作者
本帖最后由 zl2168 于 2018-5-15 21:21 編輯

實例93  99.9秒秒表
Proteus仿真一下,確認有效。
實例95 99.9秒秒表.rar (38.86 KB, 下載次數(shù): 4)

以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機應(yīng)用100案例,用于仿真實驗操作,書中電路和程序設(shè)計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。若需99.99秒,硬件電路增加一位595。軟件程序增加0.01s10ms計數(shù)器,并修改相應(yīng)計數(shù)顯示程序。
回復(fù)

使用道具 舉報

10#
ID:111634 發(fā)表于 2018-5-15 21:22 | 只看該作者
實例96  能預(yù)置初值的倒計時秒表
Proteus仿真一下,確認有效。
實例96 能設(shè)置初值的倒計時秒表.rar (40 KB, 下載次數(shù): 2)

以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機應(yīng)用100案例,用于仿真實驗操作,書中電路和程序設(shè)計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表