標(biāo)題: 單片機(jī)秒表計(jì)數(shù),為什么10位能變化,個(gè)位不動(dòng)呢,在線等,求助 [打印本頁]

作者: figo88130    時(shí)間: 2018-6-17 01:02
標(biāo)題: 單片機(jī)秒表計(jì)數(shù),為什么10位能變化,個(gè)位不動(dòng)呢,在線等,求助
自己按照書上的程序編了一個(gè),也自己花了個(gè)圖,秒表計(jì)數(shù),為什么10位能變化,個(gè)位不動(dòng)呢,可是每10秒10位還發(fā)生變化,在線等哥哥們幫助,哪有問題自己按照書上的程序編了一個(gè),也自己花了個(gè)圖,秒表計(jì)數(shù),為什么10位能變化,個(gè)位不動(dòng)呢,可是每10秒10位還發(fā)生變化,在線等哥哥們幫助,哪有問題



單片機(jī)源程序如下:
  1. #include<reg52.h>

  2. sbit ADDR0=P1^0;
  3. sbit ADDR1=P1^1;
  4. sbit ADDR2=P1^2;
  5. sbit ADDR3=P1^3;
  6. sbit ENLED=P1^4;

  7. unsigned char code Ledchar [16]={
  8.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  9.         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  10. };
  11. unsigned char Ledbuff [6]={
  12.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  13. unsigned int flagls=0;
  14. unsigned int cnt=0;
  15. unsigned int i=0;
  16.       
  17. void main()
  18. {
  19.         unsigned long sec = 0;
  20.   EA  = 1;
  21.         ADDR3=1;
  22. ENLED=0;
  23. TMOD = 0x01;
  24. ET0  = 1;
  25.         TH0 = 0xFC;
  26.         TL0 = 0x67;
  27.   TR0 = 1;
  28.         while(1)
  29.         {
  30.                 if(flagls == 1)
  31.                 {
  32.                         flagls = 0;
  33.                         sec++;
  34.                         Ledbuff[0] = Ledchar[sec%10];
  35.                         Ledbuff[1] = Ledchar[sec/10%10];
  36.                         Ledbuff[2] = Ledchar[sec/100%10];
  37.                         Ledbuff[3] = Ledchar[sec/1000%10];
  38.                         Ledbuff[4] = Ledchar[sec/10000%10];
  39.                         Ledbuff[5] = Ledchar[sec/100000%10];
  40.                        
  41.                 }
  42.         }
  43. }
  44. void InterruptTimer0() interrupt 1
  45.         {
  46.                 TH0=0xFC;
  47.                 TL0=0x67;
  48.                 cnt++;
  49.                 if(cnt >= 1000)
  50.                 {
  51.                         cnt  = 0;
  52.                         flagls = 1;
  53.                 }
  54.                
  55.                 P0=0xFF;
  56.                 switch(i)
  57.                 {      
  58.                   case 0:ADDR0=0;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[0];break;
  59.                   case 1:ADDR0=1;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[1];break;
  60.                   case 2:ADDR0=0;ADDR1=1;ADDR2=0;i++;P0=Ledbuff[2];break;
  61.                   case 3:ADDR0=1;ADDR1=1;ADDR2=0;i++;P0=Ledbuff[3];break;
  62.                   case 4:ADDR0=0;ADDR1=0;ADDR2=1;i++;P0=Ledbuff[4];break;
  63.                   case 5:ADDR0=1;ADDR1=0;ADDR2=1;i=0;P0=Ledbuff[5];break;
  64.                 default: break;
  65.         }
  66. }
復(fù)制代碼




作者: lzts88    時(shí)間: 2018-6-17 13:10
程序沒看出問題呀, 估計(jì)是硬件部分問題, 但這句改下會好點(diǎn)
default: break;  改為 default:  i = 0; break;  // i 異常時(shí)下次會正常

可改這幾句調(diào)試:
                        Ledbuff[0] = 0: //Ledchar[sec%10];
                        Ledbuff[1] = 1; //Ledchar[sec/10%10];
                        Ledbuff[2] = 2; //Ledchar[sec/100%10];
                        Ledbuff[3] = 3; //Ledchar[sec/1000%10];
                        Ledbuff[4] = 4; //Ledchar[sec/10000%10];
                        Ledbuff[5] = 5; //Ledchar[sec/100000%10];
程序正常, 應(yīng)該顯示543210, 顯示正常再看程序, 我估算你電路會串位, 也就是138譯碼不正常, 如是, 試著P1.0 P1.1 P1.2拉個(gè)3K3的上拉電阻, 還有, 138輸出到三極管要接個(gè)幾百到1K歐的電阻. 再不行就換138.

作者: zhb2004xp    時(shí)間: 2018-6-17 16:34
60行“ case 0:ADDR0=0;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[0];break;”你這樣寫沒有數(shù)碼管顯示的,中間應(yīng)該是“ADDR0=1;ADDR1=0;ADDR2=0;”,后面的以此類推

作者: zhb2004xp    時(shí)間: 2018-6-17 16:43
我的不對
作者: figo88130    時(shí)間: 2018-6-17 20:39
lzts88 發(fā)表于 2018-6-17 13:10
程序沒看出問題呀, 估計(jì)是硬件部分問題, 但這句改下會好點(diǎn)
default: break;  改為 default:  i = 0; break ...

,改成這樣了。可是還是不行。這個(gè)2都顯示不正確。怎么辦。。。

作者: lzts88    時(shí)間: 2018-6-17 23:22
figo88130 發(fā)表于 2018-6-17 20:39
,改成這樣了?墒沁是不行。這個(gè)2都顯示不正確。怎么辦。。。

                        Ledbuff[0] = 0: //Ledchar[sec%10];
                        Ledbuff[1] = 1; //Ledchar[sec/10%10];
                        Ledbuff[2] = 2; //Ledchar[sec/100%10];
                        Ledbuff[3] = 3; //Ledchar[sec/1000%10];
                        Ledbuff[4] = 4; //Ledchar[sec/10000%10];
                        Ledbuff[5] = 5; //Ledchar[sec/100000%10];
改這樣呀, 你程序有查表, 會顯示012345的, 我估計(jì)你是串位了. 就是138譯碼不正確. 你幾位顯一樣的看不出

作者: lzts88    時(shí)間: 2018-6-17 23:29
figo88130 發(fā)表于 2018-6-17 20:39
,改成這樣了?墒沁是不行。這個(gè)2都顯示不正確。怎么辦。。。

                        Ledbuff[0] = Ledchar[0];//sec%10];
                        Ledbuff[1] = Ledchar[1];//sec/10%10];
                        Ledbuff[2] = Ledchar[2];//sec/100%10];
                        Ledbuff[3] = Ledchar[3];//sec/1000%10];
                        Ledbuff[4] = Ledchar[4];//sec/10000%10];
                        Ledbuff[5] = Ledchar[5];//sec/100000%10];
沒注意, 這樣才樣顯示012345
作者: lzts88    時(shí)間: 2018-6-17 23:39
figo88130 發(fā)表于 2018-6-17 20:39
,改成這樣了。可是還是不行。這個(gè)2都顯示不正確。怎么辦。。。

2顯示不正常, 0A4, 高電平不顯示, 數(shù)據(jù)有3個(gè)"1", 連小數(shù)點(diǎn)共3個(gè)段不顯, 程序看不出問題, 實(shí)際只有2個(gè)段不顯.估計(jì)還是硬件部分, 給P0口全加3K3的上拉電阻試下.
作者: zl2168    時(shí)間: 2018-6-18 11:05
本帖最后由 zl2168 于 2018-6-18 11:07 編輯

給你介紹一個(gè)正確有效看得懂的案例,自己對照查錯(cuò)吧!
實(shí)例93  99.9秒秒表
實(shí)例95 99.9秒秒表.rar (38.86 KB, 下載次數(shù): 9)

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í)可靠可信可行,程序語句條條有注解。

作者: figo88130    時(shí)間: 2018-6-18 15:32
zl2168 發(fā)表于 2018-6-18 11:05
給你介紹一個(gè)正確有效看得懂的案例,自己對照查錯(cuò)吧!
實(shí)例93  99.9秒秒表
先Proteus仿真一下,確認(rèn)有效 ...

謝謝兄弟,我會認(rèn)真看的,十分感謝





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