![]() |
發布時間: 2018-5-14 10:53
正文摘要:設計了一個三位數的秒表,通過按k3按鍵暫停計數。秒表計數正常,不知為何數碼管平時不顯示數字,按下K3后才會顯示當時的秒數。不知什么原因,求大神解答。 代碼如下: #include<reg52.h> ... |
實例96 能預置初值的倒計時秒表 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,書中電路和程序設計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。 |
本帖最后由 zl2168 于 2018-5-15 21:21 編輯 實例93 99.9秒秒表 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,書中電路和程序設計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。若需99.99秒,硬件電路增加一位595。軟件程序增加0.01s(10ms)計數器,并修改相應計數顯示程序。 |
已解決問題,感謝各位大神的指導 |
HC6800-ES-V2.0 發表于 2018-5-15 08:25 你沒有看清楚,樓主的程序是在8位數碼管的實驗板上從左至右只使用第5、6、7三個數碼管顯示。 |
wulin 發表于 2018-5-14 17:24 程序沒什么大問題。 不過我認為你的顯示函數中,顯示第5位與顯示第7位應該對調一下吧。 不可能100ms顯示在s之前,對不對 |
//上電待令,按鍵計時開始,再按計時停止,再按清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(); //顯示程序 } |
你的程序我簡單看了一下,樓上的幾位都沒說到點子上。 問題在你的dingshi()子函數中。 你這個子函數中,有一個while(n),而n=1,那么,程序執行到此處,就“死”在這里了,死循環,直到你按下k3鍵,出現這條語句n=0;break;才能跳出來,才會有顯示啊。 由于n=0了,所以,dingshi()子函數再也不執行了,所以,就沒法看其它時間了。 秒表的按鍵,一定要用外部中斷才行的,你的這個程序思路有點不對,所以我沒有幫你改,改不了啊。 |
改大delay(i);,不能及時響應按鍵,建議按鍵采用外中斷 |
改大delay(i);,時間太短頻率高,顯示不出 |