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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

編寫的一個8個數(shù)碼管顯示的數(shù)字時鐘 但不能正常運行 求大神幫忙看看

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:125657 發(fā)表于 2016-6-7 15:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
編寫的一個8個數(shù)碼管顯示的數(shù)字時鐘可調(diào)鬧鐘  但不能正常運行   程序還沒編完!!  
#include<reg51.h>
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit LED=P2^2;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char StrTab[8];
unsigned char minute=19,hour=23,second;
void delay(unsigned int cnt)
{
    while(--cnt);
}
void displaypro(void)
{
    StrTab[0]=tab[hour/10];
    StrTab[1]=tab[hour%10];  
    StrTab[2]=0x40;  
    StrTab[3]=tab[minute/10];  
    StrTab[4]=tab[minute%10];  
    StrTab[5]=0x40;  
    StrTab[6]=tab[second/10];  
    StrTab[7]=tab[second%10];  
}
main()
{
    TMOD=0x01;  //定時器0 10ms
    TH0=0xd8; //初始值
    TL0=0xf0;
    ET0=1;
    TR0=1;
    TMOD=0x10; //定時器1 動態(tài)掃描
    TH1=0xf8;
    TL1=0xf0;
    ET1=1;
    TR1=1;
    EA=1;
    displaypro();
    while(1)
    {
    if(!KEY3)
        {
delay(10000);
if(!KEY3)
        {
          hour++;
          if(hour==24)
          hour=0;
          displaypro();
        }
        }
     if(!KEY2)
    {
    delay(10000);
    if(!KEY2)
      {
      minute++;
        if(minute==60)
   minute=0;
   displaypro();
       }
     }
        if(!KEY1)
    {
    delay(10000);
    if(!KEY1)
      {
      second++;
        if(second==60)
   second=0;
   displaypro();

   }
}
}
}
//定時器1中斷//
void time1_isr(void)interrupt 3 using 0
{
    static unsigned char num;
    TH1=0xf8;
    TL1=0xf0;
      switch(num)
      {
        case 0:P3=0xfe;P0=StrTab[num];break;
     case 1:P3=0xfd;P0=StrTab[num];break;
     case 2:P3=0xfb;P0=StrTab[num];break;
     case 3:P3=0xf7;P0=StrTab[num];break;
     case 4:P3=0xef;P0=StrTab[num];break;
     case 5:P3=0xdf;P0=StrTab[num];break;
     case 6:P3=0xbf;P0=StrTab[num];break;
     case 7:P3=0x7f;P0=StrTab[num];break;
     default:break;
      }
      num++;
      if(num==8)
          num=0;
}
//定時器0//
void time(void)interrupt 1 using 1
{
  static unsigned char count;
  TH0=0xd8;
  TL0=0xf0;
  count++;
  switch(count)
  {
    case 0:
    case 20:
    case 40:
    case 60:
    case 80:displaypro();break;
    case 50:P1=~P1;break;   //半秒 LED 閃爍
    default:break;
  }
  if(count==100)
  {
    count=0;
    second++;
    if(second==60)
      {
      second=0;
      minute++;
      if(minute==60)
        {
minute=0;
hour++;
if(hour==24)
   hour=0;
     }
      }
   }
}

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

使用道具 舉報

沙發(fā)
ID:125657 發(fā)表于 2016-6-7 15:25 來自手機 | 只看該作者
正常顯示是12-12-12這樣  但是運行后確實這樣顯示

UC_Photo_001.jpg (44.89 KB, 下載次數(shù): 111)

UC_Photo_001.jpg
回復(fù)

使用道具 舉報

板凳
ID:125657 發(fā)表于 2016-6-7 15:25 來自手機 | 只看該作者
而且也不能正常計時
回復(fù)

使用道具 舉報

地板
ID:123289 發(fā)表于 2016-6-7 16:56 | 只看該作者
圖不清楚
回復(fù)

使用道具 舉報

5#
ID:123289 發(fā)表于 2016-6-7 16:57 | 只看該作者
寫程序習(xí)慣不好,沒有注釋。
回復(fù)

使用道具 舉報

6#
ID:123289 發(fā)表于 2016-6-7 17:40 | 只看該作者
1、取8個RAM單元(編號X0至X7)對應(yīng)存放8個LED的顯示內(nèi)容(譯碼后的LED段顯示值)。
2、取一個單元做計數(shù)器K,從0至7循環(huán)計數(shù),分別對應(yīng)指示顯示8個LED。
3、時間中斷只用一個,考慮到8個LED掃描顯示,中斷時常數(shù)取5ms,中斷后做下列事件:
3.1、處理一下計數(shù)器(屏上顯示的數(shù)字,如時間年月日時分秒,或計數(shù)值等)……
3.2、先關(guān)所有LED顯示,防止切換閃動;
3.3、將K+1(注:當(dāng)K=8時清K=0。),將K所指示的Xn(當(dāng)然需要將對應(yīng)需要顯示的時鐘位,譯成LED碼后再送入Xn)送入顯示數(shù)據(jù)口,再打開K所指定的LED。
要點:每次中斷只顯示一個LED,且先關(guān)后顯示。
回復(fù)

使用道具 舉報

7#
ID:125692 發(fā)表于 2016-6-7 17:55 | 只看該作者
重點需要強調(diào)出來, 別人能夠很容易看懂
回復(fù)

使用道具 舉報

8#
ID:125657 發(fā)表于 2016-6-8 08:12 來自手機 | 只看該作者
yzwzfyz 發(fā)表于 2016-6-7 17:40
1、取8個RAM單元(編號X0至X7)對應(yīng)存放8個LED的顯示內(nèi)容(譯碼后的LED段顯示值)。
2、取一個單元做計數(shù) ...

能不能幫我修改下程序   看哪里錯了  
回復(fù)

使用道具 舉報

9#
ID:123289 發(fā)表于 2016-6-8 10:03 | 只看該作者
先將各行的注釋加上去,讓別人知道你的目的,再看你錯在哪里。
也許:當(dāng)你完成注釋時,自己就已經(jīng)明白了。
回復(fù)

使用道具 舉報

10#
ID:123289 發(fā)表于 2016-6-8 10:14 | 只看該作者
要點:每次中斷只顯示一個LED,且先關(guān)后顯示!!!
回復(fù)

使用道具 舉報

11#
ID:123289 發(fā)表于 2016-6-8 10:50 | 只看該作者
     case 0:P3=0xfe;P0=StrTab[num];break;
     case 1:P3=0xfd;P0=StrTab[num];break;
     case 2:P3=0xfb;P0=StrTab[num];break;
     case 3:P3=0xf7;P0=StrTab[num];break;
     case 4:P3=0xef;P0=StrTab[num];break;
     case 5:P3=0xdf;P0=StrTab[num];break;
     case 6:P3=0xbf;P0=StrTab[num];break;
     case 7:P3=0x7f;P0=StrTab[num];break;
這是T1中斷所做的事,雖然每次切換了LED,但顯示的內(nèi)容卻是相同的StrTab[num],這就必須保證,在每次中斷之前,StrTab[num]已被刷新,僅改變num是不夠的,因為顯示的不是num,而是StrTab[num]!
如果某一次中斷前未刷新,則輪顯示的LED必定是上一輪的LED值,如此就混淆了。
你用兩個時間中斷的目的是什么?能保證正確地刷新LED數(shù)據(jù)么?
回復(fù)

使用道具 舉報

12#
ID:125657 發(fā)表于 2016-6-8 15:20 | 只看該作者
#include<reg51.h>
sbit KEY1=P1^0;        //定義端口參數(shù)
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit LED=P2^2;        //定義指示燈

code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共陰極數(shù)碼管0-9
unsigned char StrTab[8]; //定義緩沖區(qū)
unsigned char minute=19,hour=23,second;        //定義初始化

void delay(unsigned int cnt)
{
    while(--cnt);
}

void displaypro(void)
{
    StrTab[0]=tab[hour/10];         //顯示小時
    StrTab[1]=tab[hour%10];  
    StrTab[2]=0x40;                   //顯示-
    StrTab[3]=tab[minute/10];  //顯示分鐘
    StrTab[4]=tab[minute%10];  
    StrTab[5]=0x40;                          //顯示-
    StrTab[6]=tab[second/10];          //顯示秒
    StrTab[7]=tab[second%10];  
}
main()
{
    TMOD |=0x01;  //定時器0 10ms 用于計時
    TH0=0xd8;        //初始值
    TL0=0xf0;
    ET0=1;
    TR0=1;

    TMOD |=0x10;        //定時器1 動態(tài)掃描
    TH1=0xf8;
    TL1=0xf0;
    ET1=1;
    TR1=1;
    EA=1;
    displaypro();  //調(diào)用顯示處理函數(shù)

    while(1)
    {
    if(!KEY3)
        {
        delay(10000);
        if(!KEY3)          //按鍵3去抖以及動作
               {
                 hour++;
                 if(hour==24)
                 hour=0;
                 displaypro();
               }
        }

     if(!KEY2)           //按鍵2去抖以及動作
    {
    delay(10000);
    if(!KEY2)
      {
      minute++;
        if(minute==60)
          minute=0;
          displaypro();
       }
     }

               if(!KEY1)
    {
    delay(10000);
    if(!KEY1)           //按鍵1去抖以及動作
      {
      second++;
        if(second==60)
          second=0;
          displaypro();


   }
}
}
}

//定時器1中斷//
void time1_isr(void)interrupt 3 using 0          //定時器1動態(tài)掃描
{
    static unsigned char num;
    TH1=0xf8;
    TL1=0xf0;
      switch(num)

      {
        case 0:P3=0xfe;P0=StrTab[num];break;  //分別調(diào)用緩沖區(qū)的值進行掃描
            case 1:P3=0xfd;P0=StrTab[num];break;
            case 2:P3=0xfb;P0=StrTab[num];break;
            case 3:P3=0xf7;P0=StrTab[num];break;
            case 4:P3=0xef;P0=StrTab[num];break;
            case 5:P3=0xdf;P0=StrTab[num];break;
            case 6:P3=0xbf;P0=StrTab[num];break;
            case 7:P3=0x7f;P0=StrTab[num];break;
            default:break;
      }

      num++;           //掃描8次,使用8個數(shù)碼管
      if(num==8)
          num=0;
}

//定時器0//
void time(void)interrupt 1 using 1
{
  static unsigned char count;  //定義內(nèi)部局部變量
  TH0=0xd8;
  TL0=0xf0;
  count++;
  switch(count)
  {
    case 0:
    case 20:
    case 40:
    case 60:
    case 80:displaypro();break;                 //隔一定時間調(diào)用顯示處理顯示處理
    case 50:P1=~P1;break;          //半秒 LED 閃爍
    default:break;
  }
  if(count==100)
  {
    count=0;
    second++;
    if(second==60)
      {
      second=0;
      minute++;
      if(minute==60)
        {
        minute=0;
        hour++;
        if(hour==24)
          hour=0;
            }
      }
   }
}

     
回復(fù)

使用道具 舉報

13#
ID:125657 發(fā)表于 2016-6-8 15:22 | 只看該作者



回復(fù)

使用道具 舉報

14#
ID:125657 發(fā)表于 2016-6-8 15:25 | 只看該作者
yzwzfyz 發(fā)表于 2016-6-8 10:50
case 0:P3=0xfe;P0=StrTab[num];break;
     case 1:P3=0xfd;P0=StrTab[num];break;
     case 2:P3 ...

我上傳了標(biāo)注的程序和電路圖了      他上面不是定義了    StrTab[0]=tab[hour/10];
    StrTab[1]=tab[hour%10];  
    StrTab[2]=0x40;  
    StrTab[3]=tab[minute/10];  
    StrTab[4]=tab[minute%10];  
    StrTab[5]=0x40;  
    StrTab[6]=tab[second/10];  
    StrTab[7]=tab[second%10];  

改變NUM就好了     
回復(fù)

使用道具 舉報

15#
ID:125657 發(fā)表于 2016-6-8 15:35 | 只看該作者
linlin2222 發(fā)表于 2016-6-7 17:55
重點需要強調(diào)出來, 別人能夠很容易看懂

已經(jīng)標(biāo)注了  大神幫我看看吧
回復(fù)

使用道具 舉報

16#
ID:111634 發(fā)表于 2016-6-8 19:09 | 只看該作者
參考一下樓上的5種電子鐘電路、程序和仿真
回復(fù)

使用道具 舉報

17#
ID:111634 發(fā)表于 2016-6-8 19:09 | 只看該作者
樓上的5種電子鐘摘自張志良編著《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
回復(fù)

使用道具 舉報

18#
ID:111634 發(fā)表于 2016-6-8 19:11 | 只看該作者
讀懂了別人正確有效的電路和程序,才能找出自己電路和程序的錯誤。
回復(fù)

使用道具 舉報

19#
ID:111634 發(fā)表于 2016-6-8 19:12 | 只看該作者
張志良編著《單片機實驗實訓(xùn)100例》每個案例程序均有詳細分析,每條語句均有注釋。
回復(fù)

使用道具 舉報

20#
ID:111634 發(fā)表于 2016-6-8 19:15 | 只看該作者
你的程序沒有定義標(biāo)記和注釋,別人需花多少時間才能讀懂理順,然后再幫你尋找錯誤,可能嗎?
回復(fù)

使用道具 舉報

21#
ID:111634 發(fā)表于 2016-6-8 19:17 | 只看該作者
先Proteus仿真一下




以上摘自張志良編著《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
回復(fù)

使用道具 舉報

22#
ID:123289 發(fā)表于 2016-6-9 11:40 | 只看該作者
上圖的設(shè)計不是很好的:缺點如下:
1、用了6個(U2-U7),不經(jīng)濟。
改進,用一個晶體管陣列(一個IC里集成有7個三極管),驅(qū)動LED的陽極(共陽)。
2、LED的選擇驅(qū)動用了P1,P3兩個口,不利于程序編寫。
改進,只用P1口驅(qū)動,這里軟件編寫方便許多。
3、四個發(fā)光二極管,兩兩串并,一般紅色壓降為1.4V,兩只2.8V,未經(jīng)限流直接接到IO口,使得2.2V電壓(5V-2.8V)加在CPU的芯片上,CPU發(fā)熱大。
改進:設(shè)LED是10mA一只。兩組并為20mA,串入一只電阻[R=(5V-2.8V-0.3V)/20=100歐,0.3V是IO口的壓降]。
回復(fù)

使用道具 舉報

23#
ID:123289 發(fā)表于 2016-6-9 11:44 | 只看該作者
寫書的人不一定認真。
U2-U7驅(qū)動的LED 7個段,都未限流,都是錯誤的做法。
回復(fù)

使用道具 舉報

24#
ID:111634 發(fā)表于 2016-6-9 17:50 | 只看該作者
有人與我討論電路,很高興,首先表示感謝,并希望能交個朋友。有關(guān)問題我的看法如下:
回復(fù)

使用道具 舉報

25#
ID:111634 發(fā)表于 2016-6-9 17:50 | 只看該作者
本電路設(shè)計為靜態(tài)顯示,雖然用了6片595,但595價格低廉。用595的好處是串行傳送,節(jié)省了I/O端口。
回復(fù)

使用道具 舉報

26#
ID:111634 發(fā)表于 2016-6-9 17:51 | 只看該作者
若用動態(tài)顯示,7段加6位位控,需13根I/O端口線。因為不排除剩余端口線還需其他用途。
回復(fù)

使用道具 舉報

27#
ID:111634 發(fā)表于 2016-6-9 17:51 | 只看該作者
本帖最后由 zl2168 于 2016-6-9 18:00 編輯

用6片595的另一好處是,便于修正時鐘參數(shù)。而且修正位是快速閃爍(每秒亮暗各5次),修正期間時鐘繼續(xù)正常運行 。你Proteus仿真一下,試試效果。
回復(fù)

使用道具 舉報

28#
ID:111634 發(fā)表于 2016-6-9 17:52 | 只看該作者
本帖最后由 zl2168 于 2016-6-9 17:58 編輯

"驅(qū)動用了P1,P3兩個口,不利于程序編寫",完全沒有這個問題,看你程序怎么編寫。P3口是串行傳送數(shù)據(jù),P1口是位控加修正位快速閃爍。
回復(fù)

使用道具 舉報

29#
ID:111634 發(fā)表于 2016-6-9 17:53 | 只看該作者
至于沒有限流電阻,那是為了電路圖面簡潔,連晶振和復(fù)位電路都沒畫。
回復(fù)

使用道具 舉報

30#
ID:111634 發(fā)表于 2016-6-9 17:53 | 只看該作者
實際電路應(yīng)該加限流電阻,不過無論是595、還是80C51,實際流不出很大電流的,長期工作也不會使芯片過熱。
回復(fù)

使用道具 舉報

31#
ID:111634 發(fā)表于 2016-6-9 17:55 | 只看該作者
若僅僅是6位時鐘,沒有修正及修正位快速閃爍功能,電路可簡單的多。
回復(fù)

使用道具 舉報

32#
ID:111634 發(fā)表于 2016-6-9 18:03 | 只看該作者
時鐘動態(tài)顯示電路,并保留時鐘修正及修正位快速閃爍功能,我下一次編一個。
回復(fù)

使用道具 舉報

33#
ID:96682 發(fā)表于 2016-6-10 00:58 | 只看該作者
你的仿真圖只能使用采用的數(shù)碼管段碼。
回復(fù)

使用道具 舉報

34#
ID:111634 發(fā)表于 2016-6-10 19:32 | 只看該作者
yzwzfyz 發(fā)表于 2016-6-9 11:40
上圖的設(shè)計不是很好的:缺點如下:
1、用了6個(U2-U7),不經(jīng)濟。
改進,用一個晶體管陣列(一個IC里集 ...

請看一下我的回復(fù)。
回復(fù)

使用道具 舉報

35#
ID:111634 發(fā)表于 2016-6-10 22:51 | 只看該作者
wc86110 發(fā)表于 2016-6-10 00:58
你的仿真圖只能使用采用的數(shù)碼管段碼。

這個當(dāng)然!電路與程序是相配的,程序是根據(jù)電路和功能編寫的,任何案例都是如此。
回復(fù)

使用道具 舉報

36#
ID:194701 發(fā)表于 2017-5-7 15:06 | 只看該作者
讀懂了別人正確有效的電路和程序,才能找出自己電路和程序的錯誤
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线成人网 | 久久久久久久久久久久久9999 | 久久小视频| 久久的色 | 好好的日在线视频 | 亚洲成人精品国产 | 污污的网站在线观看 | 久草在线在线精品观看 | 日日夜夜免费精品视频 | 中文字幕在线视频观看 | 一二三区av | 亚洲一区二区 | 在线观看免费av网 | 毛片一级片 | 亚洲成人网在线观看 | 精品中文字幕一区二区 | 国产区在线免费观看 | 午夜网 | www.av在线| 亚洲视频中文 | 日本黄色免费大片 | 亚洲电影一区 | 午夜电影网站 | 国产女人精品视频 | 久久久久久久网 | 日韩毛片中文字幕 | 综合久| 精品电影 | 国产成人精品免费视频大全最热 | 国产综合精品一区二区三区 | 午夜视频在线播放 | 欧美一区二区三区四区在线 | 欧美综合一区二区三区 | 日日操夜夜操天天操 | 欧美精品一二三 | 久久亚洲国产 | 欧美日韩中文国产一区发布 | 精国产品一区二区三区 | 欧美一区二区免费 | 亚洲成人一区 | 中文字幕在线播放第一页 |