找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

各位大神,我又來求助數(shù)碼管了,感謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:232280 發(fā)表于 2017-9-12 21:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
數(shù)碼管的原理我都懂,另外,重點強調(diào),我這個是用138譯碼器控制數(shù)碼管顯示的,不是P1口;謝謝;
準(zhǔn)備用8個數(shù)碼管顯示二進制累加的過程的,結(jié)果程序?qū)懴聛硖崾究刂茢?shù)碼管顯示的代碼沒意義;不知道問題出在哪了。請大家多多指教,萬分感謝;

譯碼器.png (26.94 KB, 下載次數(shù): 54)

譯碼器.png

數(shù)碼管.png (66.92 KB, 下載次數(shù): 55)

數(shù)碼管.png

代碼.png (40.55 KB, 下載次數(shù): 79)

代碼.png

代碼1.png (10.24 KB, 下載次數(shù): 67)

代碼1.png

錯誤.png (7.25 KB, 下載次數(shù): 65)

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

使用道具 舉報

沙發(fā)
ID:232280 發(fā)表于 2017-9-12 21:47 | 只看該作者
中間的代碼,漏發(fā)了;

代碼0.png (51 KB, 下載次數(shù): 70)

代碼0.png
回復(fù)

使用道具 舉報

板凳
ID:89515 發(fā)表于 2017-9-13 01:24 | 只看該作者
#include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit A1=P1^4;
sbit B1=P1^3;
sbit C1=P1^2;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uchar x)
{
  uint i,j;
  for(i=x;i>0;i--)
          for(j=120;j>0;j--);
}
/*void display()
{
     uchar X,Y;
     for(X=0;X<16;X++)
             for(Y=0;Y<100;Y++)
             {
     
                     A1=0;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=1;P2=table[X];delayms(3);
     
             }
} */
void hex()
{
        uchar m,su;
        for(m=0x00;m<0xff;m++)
                for(su=0;su<50;su++)
                {
                        A1=1;B1=1;C1=1;
                                if(m&0x01)P2=table[1];else P2=table[0];delayms(3);
                        A1=1;B1=1;C1=0;
                                if(m&0x02)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=1;
                                if(m&0x04)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=0;
                                 if(m&0x08)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=1;
                                 if(m&0x10)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=0;
                                 if(m&0x20)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=0;C1=1;
                                  if(m&0x40)P2=table[1];else P2=table[0];delayms(3);
                        A1=0;B1=0;C1=0;
                                if(m&0x80)P2=table[1];else P2=table[0];delayms(3);
                }
}
void main()
{
     while(1)
     {   
            // display();
                           hex();
     }            
}
16進制輸出到一個完整的端口用led亮滅直接就可以表示出二進制狀態(tài)。你要用數(shù)碼管0和1表示,只需要判斷哪個數(shù)碼管該顯示什么就行。這個由你的累加數(shù)決定

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:89515 發(fā)表于 2017-9-13 01:25 | 只看該作者
自己改程序匹配你的電路
回復(fù)

使用道具 舉報

5#
ID:89515 發(fā)表于 2017-9-13 01:34 | 只看該作者
注意138的輸入端一定要搞對,這個錯了真值表就不能按次序排列,數(shù)碼管顯示就亂了。細心。。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:193818 發(fā)表于 2017-9-13 08:54 | 只看該作者
我個人建議你先讓數(shù)碼管顯示一個數(shù)字,然后再動態(tài)刷新。循序漸進這樣比較穩(wěn)妥。一次性寫那么多,出錯了你都找不到北。否則也就沒有那么多人說模塊化了。
回復(fù)

使用道具 舉報

7#
ID:232280 發(fā)表于 2017-9-13 15:20 | 只看該作者
mengzhixinheng 發(fā)表于 2017-9-13 01:24
#include
typedef unsigned int uint;
typedef unsigned char uchar;

非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應(yīng)該是該顯示1的時候數(shù)碼管沒點亮?戳四愕拇a才知道我錯在哪了,是每一行的table沒有賦值給P0;顯示才沒有意義,現(xiàn)在已經(jīng)改過來了,并且稍作修改后能正常顯示,待會我會放下面,謝謝你了,你這個比較高端一點,我的代碼就是最簡單的邏輯來寫的
回復(fù)

使用道具 舉報

8#
ID:232280 發(fā)表于 2017-9-13 15:23 | 只看該作者
mengzhixinheng 發(fā)表于 2017-9-13 01:25
自己改程序匹配你的電路

感謝的你幫助,不是電路問題,犯了一個最基本的錯誤
回復(fù)

使用道具 舉報

9#
ID:232280 發(fā)表于 2017-9-13 15:32 | 只看該作者
mengzhixinheng 發(fā)表于 2017-9-13 01:34
注意138的輸入端一定要搞對,這個錯了真值表就不能按次序排列,數(shù)碼管顯示就亂了。細心!。

嗯,多謝提醒。我寫的時候是對照真值表寫的,所以不會出錯
回復(fù)

使用道具 舉報

10#
ID:232280 發(fā)表于 2017-9-13 15:35 | 只看該作者
漫步經(jīng)心 發(fā)表于 2017-9-13 08:54
我個人建議你先讓數(shù)碼管顯示一個數(shù)字,然后再動態(tài)刷新。循序漸進這樣比較穩(wěn)妥。一次性寫那么多,出錯了你都 ...

那樣是好一點,不過我前面按照你這種方式寫了一個十進制累加的,發(fā)現(xiàn)其實都一樣的,因為后面是相同的,錯誤都是一樣的,很方便改
回復(fù)

使用道具 舉報

11#
ID:232280 發(fā)表于 2017-9-13 15:41 | 只看該作者
犯了一個基本錯誤。每一行的table沒有賦值給P0端,只是寫出來而已;另外if語句中應(yīng)該是等于2時為真,還有最后一個if語句內(nèi)容也稍作修改,才能加滿后循環(huán),感謝大家的幫助;下面把代碼附上,親測可用;
#include<reg52.h>
sbit A=P2^2;   //定義控制數(shù)碼管管腳
sbit C=P2^3;
sbit D=P2^4;
typedef unsigned char u16;
typedef unsigned int u8;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                                                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
                                                        0x79,0x71,0x00};
void delay(u16 z)           //延時函數(shù)
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}
void main()                //數(shù)碼管顯示二進制累加函數(shù)
{
        u16 k,j,i,g;
        u16 h,f,m,a,l;   //定義變量
        j=0;i=0;g=0;h=0;f=0;m=0;l=0;
        while(1)                //大循環(huán)
         { for(k=0;k<3;k++)         //控制1數(shù)碼管顯示
                {
                        for(a=50;a>0;a--)  //使數(shù)碼管顯示時間足夠人眼識別
                        {       
                                A=0;C=0;D=0;P0=table[k];delay(3);        //1數(shù)碼管顯示0或1
                                if(k==2){j++;k=0;}                                //當(dāng)1數(shù)碼管顯示1后,使二數(shù)碼管顯示1;
                                A=1;C=0;D=0;P0=table[j];delay(3);        //控制2數(shù)碼管顯示0或1;
                                if(j==2){i++;j=0;}                                //以下相同;
                                A=0;C=1;D=0;P0=table[i];delay(3);
                                if(i==2){g++;i=0;}
                                A=1;C=1;D=0;P0=table[g];delay(3);
                                if(g==2){h++;g=0;}
                                A=0;C=0;D=1;P0=table[h];delay(3);
                                if(h==2){f++;h=0;}
                                A=1;C=0;D=1;P0=table[f];delay(3);
                                if(f==2){m++;f=0;}
                                A=0;C=1;D=1;P0=table[m];delay(3);
                                if(m==2){l++;m=0;}
                                A=1;C=1;D=1;P0=table[l];delay(3);
                                if(l==2){k=3;l=0;}                                 //退出循環(huán)
                        }
                }
        }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

12#
ID:232905 發(fā)表于 2017-9-13 16:58 | 只看該作者
不會啊
回復(fù)

使用道具 舉報

13#
ID:232280 發(fā)表于 2017-9-13 18:41 | 只看該作者

我現(xiàn)在會了,代碼發(fā)在上面,有什么不懂的盡管問
回復(fù)

使用道具 舉報

14#
ID:215712 發(fā)表于 2017-9-13 21:00 | 只看該作者
138譯碼器對應(yīng)的程序有問題,數(shù)字顯示錯亂
回復(fù)

使用道具 舉報

15#
ID:232986 發(fā)表于 2017-9-13 22:28 | 只看該作者
看來被人解決了啊
回復(fù)

使用道具 舉報

16#
ID:232280 發(fā)表于 2017-9-13 22:36 | 只看該作者
18707072428 發(fā)表于 2017-9-13 21:00
138譯碼器對應(yīng)的程序有問題,數(shù)字顯示錯亂

沒有問題的!對照真值表寫的。
回復(fù)

使用道具 舉報

17#
ID:89515 發(fā)表于 2017-9-14 00:43 | 只看該作者
GOD丿小男孩 發(fā)表于 2017-9-13 15:20
非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應(yīng)該是該顯示1的時候數(shù)碼管沒點 ...

我仿真了下沒問題呀,很完美。可能仿真電路有些差別
回復(fù)

使用道具 舉報

18#
ID:89515 發(fā)表于 2017-9-14 00:46 | 只看該作者
GOD丿小男孩 發(fā)表于 2017-9-13 15:20
非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應(yīng)該是該顯示1的時候數(shù)碼管沒點 ...

也可能是軟件差別,我用protues8.6,keil3.8a沒問題
回復(fù)

使用道具 舉報

19#
ID:226263 發(fā)表于 2017-9-17 21:05 | 只看該作者
樓主為什么要用delay呢??這樣寫的額程序很容易出問題,特別是對時序要求高的地方,建議用查詢的方法來控制時序動作。
回復(fù)

使用道具 舉報

20#
ID:111634 發(fā)表于 2017-9-18 19:36 | 只看該作者
主要問題是沒理解138譯碼原理,從上述文字來看,現(xiàn)在可能還理解得不夠!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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