久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3403|回復: 19
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
數碼管的原理我都懂,另外,重點強調,我這個是用138譯碼器控制數碼管顯示的,不是P1口;謝謝;
準備用8個數碼管顯示二進制累加的過程的,結果程序寫下來提示控制數碼管顯示的代碼沒意義;不知道問題出在哪了。請大家多多指教,萬分感謝;

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

譯碼器.png

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

數碼管.png

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

代碼.png

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

代碼1.png

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

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

使用道具 舉報

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

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

代碼0.png
回復

使用道具 舉報

板凳
ID:89515 發表于 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亮滅直接就可以表示出二進制狀態。你要用數碼管0和1表示,只需要判斷哪個數碼管該顯示什么就行。這個由你的累加數決定

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

11#
ID:232280 發表于 2017-9-13 15:41 | 只看該作者
犯了一個基本錯誤。每一行的table沒有賦值給P0端,只是寫出來而已;另外if語句中應該是等于2時為真,還有最后一個if語句內容也稍作修改,才能加滿后循環,感謝大家的幫助;下面把代碼附上,親測可用;
#include<reg52.h>
sbit A=P2^2;   //定義控制數碼管管腳
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)           //延時函數
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}
void main()                //數碼管顯示二進制累加函數
{
        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)                //大循環
         { for(k=0;k<3;k++)         //控制1數碼管顯示
                {
                        for(a=50;a>0;a--)  //使數碼管顯示時間足夠人眼識別
                        {       
                                A=0;C=0;D=0;P0=table[k];delay(3);        //1數碼管顯示0或1
                                if(k==2){j++;k=0;}                                //當1數碼管顯示1后,使二數碼管顯示1;
                                A=1;C=0;D=0;P0=table[j];delay(3);        //控制2數碼管顯示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;}                                 //退出循環
                        }
                }
        }
}

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

我現在會了,代碼發在上面,有什么不懂的盡管問
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

沒有問題的!對照真值表寫的。
回復

使用道具 舉報

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

我仿真了下沒問題呀,很完美?赡芊抡骐娐酚行┎顒e
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产三区视频在线观看 | 久久精品国产免费一区二区三区 | 91免费在线视频 | 国产精品一区三区 | 久久1区| av网站在线播放 | 波多野结衣电影一区 | 91免费在线看 | 91在线精品一区二区 | 黄色a三级 | 日本午夜视频 | 亚洲精品一区中文字幕乱码 | 精品综合久久久 | 亚洲精品国产区 | 99精品视频免费观看 | 日韩欧美精品一区 | 午夜资源| 欧美美女二区 | 午夜影院在线观看免费 | www.国产精 | 中文字幕久久精品 | 激情 亚洲 | 日韩视频在线观看 | 日韩精品一区中文字幕 | 国产精品亚洲综合 | 久久精品国产99国产精品 | 国产精品女人久久久 | 激情六月丁香婷婷 | 国产精品九九九 | 国产小u女发育末成年 | 国产一区二区三区在线免费 | 黄色国产 | 久久伊人在| 日韩欧美国产一区二区 | 国产激情一区二区三区 | 国产精品福利在线观看 | 国产在线视频一区 | 一级aaaaaa毛片免费同男同女 | 亚洲精品视频免费观看 | 久久机热 | 成人av一区二区亚洲精 |