亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 秒表程序有問題了,求大神幫助 [打印本頁]

作者: 259171    時間: 2018-5-14 10:53
標題: 秒表程序有問題了,求大神幫助
設計了一個三位數的秒表,通過按k3按鍵暫停計數。秒表計數正常,不知為何數碼管平時不顯示數字,按下K3后才會顯示當時的秒數。不知什么原因,求大神解答。
代碼如下:
#include<reg52.h>                 

typedef unsigned int u16;         
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//連接譯碼器,選擇點亮的數碼管
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初始化的函數
{
        TMOD|=0X01;//選擇定時器0模式,工作方式為1,僅用TR0打開
        TH0=0XFC;        //給定時器賦初值,定時1ms
        TL0=0X18;       
        TR0=1;//打開定時器       
}



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



void miaoDisplay()//數碼管動態掃描,循環掃描顯示三位秒表數字
{
        u8 i;
        for(i=4;i<7;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管
                {
                        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]];//發送段碼
                delay(1); //間隔一段時間掃描
                P0=0x00;//消隱
        }
}



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

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

void miao()//顯示秒數
       
{
        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, 下載次數: 62)

1.PNG

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

2.PNG

作者: zhdp    時間: 2018-5-14 15:02
改大delay(i);,時間太短頻率高,顯示不出

作者: 明白    時間: 2018-5-14 15:28
改大delay(i);,不能及時響應按鍵,建議按鍵采用外中斷
作者: HC6800-ES-V2.0    時間: 2018-5-14 16:47
你的程序我簡單看了一下,樓上的幾位都沒說到點子上。
問題在你的dingshi()子函數中。
你這個子函數中,有一個while(n),而n=1,那么,程序執行到此處,就“死”在這里了,死循環,直到你按下k3鍵,出現這條語句n=0;break;才能跳出來,才會有顯示啊。
由于n=0了,所以,dingshi()子函數再也不執行了,所以,就沒法看其它時間了。

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

作者: wulin    時間: 2018-5-14 17:24
//上電待令,按鍵計時開始,再按計時停止,再按清0,周而復始。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//連接譯碼器,選擇點亮的數碼管
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;                                        //暫停標志


/***********定時器初始化程序****************/
void Timer0Init(void)                //2500微秒@12.000MHz
{
        TMOD= 0x01;                //設置定時器模式
        TL0 = 0x3C;                //設置定時初值
        TH0 = 0xF6;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        EA=1;                        //開總中斷
        ET0=1;                //開定時器0中斷
}
/***********按鍵掃描程序****************/
void keyscan()       
{
        static uint count2=0,count1=0;        //計數變量                       
        static bit key_sign=0;                                //按鍵狀態標志
        if(k3==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計數延時消抖
                if((count1>=500)&&(key_sign==0))//檢測按鍵如果為0
                {                       
                        key_sign=1;                //按鍵狀態標志置1,防止重復響應
                        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;                                //計數變量清0
                key_sign=0;                                //按鍵狀態標志清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();                                //按鍵掃描
        }
}
/**************中斷服務程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xF7;                //設置定時初值
        Cntus++;                                        //中斷變量Cntus自+1
        if(Cntus>=40)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暫停/啟動
                        Cnt100ms++;                        //毫秒計數
                if(Cnt100ms>=10)
                {
                        Cnt100ms=0;
                        Cnt1s++;                                //秒計數
                        if(Cnt1s>=60)
                                Cnt1s=0;
                }
        }
        display();                                        //顯示程序
}

作者: HC6800-ES-V2.0    時間: 2018-5-15 08:25
wulin 發表于 2018-5-14 17:24
//上電待令,按鍵計時開始,再按計時停止,再按清0,周而復始。
#include
#define uint unsigned int

程序沒什么大問題。
不過我認為你的顯示函數中,顯示第5位與顯示第7位應該對調一下吧。
不可能100ms顯示在s之前,對不對
作者: wulin    時間: 2018-5-15 14:33
HC6800-ES-V2.0 發表于 2018-5-15 08:25
程序沒什么大問題。
不過我認為你的顯示函數中,顯示第5位與顯示第7位應該對調一下吧。
不可能100ms顯 ...

你沒有看清楚,樓主的程序是在8位數碼管的實驗板上從左至右只使用第5、6、7三個數碼管顯示。
作者: 259171    時間: 2018-5-15 19:41
已解決問題,感謝各位大神的指導
作者: zl2168    時間: 2018-5-15 21:19
本帖最后由 zl2168 于 2018-5-15 21:21 編輯

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

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

作者: zl2168    時間: 2018-5-15 21:22
實例96  能預置初值的倒計時秒表
Proteus仿真一下,確認有效。
實例96 能設置初值的倒計時秒表.rar (40 KB, 下載次數: 2)

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





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