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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機定時器刷新數碼管顯示鬼影,求解決

  [復制鏈接]
跳轉到指定樓層
樓主
ID:389488 發表于 2020-9-22 11:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于郭天祥開發板
#include <STC89C5xRC.H>
#include <intrins.h>

#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long

//sbit ir=P3^2;

sbit ledw=P2^6;
sbit ledd=P2^7;

#define ledduan P0

u8 code ledma []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x58,0x5e,0x79,0x71,0x80,0xff,0x00};//共陰 0-f . 全顯全滅

u8 code ledwma []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//共陰

u8 i,j;
u32 a;

void delay(u16 z)
{
         u16 x;
         u8 y;
        for(x=z;x>0;x--)
        for(y=120;y>0;y--);
}

void timerInit ()
{
        TMOD|=0x01;
        TH0=(65536-3000)/256;  //50MS
        TL0=(65536-3000)%256;
        //TH1=(65536-46080)/256;  //3MS
        //TL1=(65536-46080)%256;
        ET0=1;
        //ET1=1;
        EA=1;
        TR0=1;
//        TR1=1;
}
/*
void timer0init ()
{
        TMOD|=0x01;
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        ET0=1;
        EA=1;
        TR0=1;
}

void display(u32 a)
{
        u8 aa,bb,cc,dd,ee,ff;
        aa=a/100000;
  bb=a%100000/10000;
  cc=a%10000/1000;
        dd=a%1000/100;
        ee=a%100/10;
        ff=a%10;
        
                ledd=1;
          ledduan=ledwma [0];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[aa];
                ledw=0;
        
                delay(5);
        
          ledd=1;
          ledduan=ledwma [1];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[bb];
                ledw=0;
        
                delay(5);
               
                ledd=1;
          ledduan=ledwma [2];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[cc];
                ledw=0;
        
                delay(5);
               
                ledd=1;
          ledduan=ledwma [3];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[dd];
                ledw=0;
        
                delay(5);
               
                ledd=1;
          ledduan=ledwma [4];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[ee];
                ledw=0;
        
                delay(5);
               
                ledd=1;
          ledduan=ledwma [5];
          ledd=0;
        
                 ledw=1;
                ledduan=ledma[ff];
                ledw=0;
        
                delay(5);
}
*/

void main()
{
        u8 aa,bb,cc,dd,ee,ff;
        a=333333;
        
        aa=a/100000;
  bb=a%100000/10000;
  cc=a%10000/1000;
        dd=a%1000/100;
        ee=a%100/10;
        ff=a%10;
        
        timerInit ();
        
        while(1)
  {
                ledduan=0x00;
        switch(j)
        {
                case 0:
                //        ledduan=0x00;
                        ledd=1;
                        ledduan=ledwma [j];
                        ledd=0;
        //ledduan=0x00;
                        ledw=1;
                        ledduan=ledma[aa];
                        ledw=0;
                //ledduan=0x00;
                        break;
                case 1:
        //ledduan=0x00;
                        ledd=1;
                        ledduan=ledwma [j];
                        ledd=0;
        //ledduan=0x00;
                        ledw=1;
                        ledduan=ledma[bb];
                        ledw=0;
        //ledduan=0x00;
                break;
               
                case 2:
                //        ledduan=0x00;
                ledd=1;
          ledduan=ledwma [j];
          ledd=0;
        //ledduan=0x00;
                 ledw=1;
                ledduan=ledma[cc];
                ledw=0;
        //ledduan=0x00;
                break;
                case 3:
                //        ledduan=0x00;
                ledd=1;
          ledduan=ledwma [3];
          ledd=0;
        //ledduan=0x00;
                 ledw=1;
                ledduan=ledma[dd];
                ledw=0;
        //ledduan=0x00;
                break;
                case 4:
                //        ledduan=0x00;
                ledd=1;
          ledduan=ledwma [4];
          ledd=0;
        //ledduan=0x00;
                 ledw=1;
                ledduan=ledma[ee];
                ledw=0;
        //ledduan=0x00;
                break;
                case 5:
                        //ledduan=0x00;
                ledd=1;
          ledduan=ledwma [5];
          ledd=0;
        //ledduan=0x00;
                 ledw=1;
                ledduan=ledma[ff];
                ledw=0;
        //ledduan=0x00;
                break;
          /*if(i>=20)
                {
                        i=0;
                        cnt++;
    }*/
                //display(123456);
                //delay(3000);*
   }
}
}
void timer0isr() interrupt 1
{
        TH0=(65536-3000)/256;
        TL0=(65536-3000)%256;
        j++;
        if(j>=6)
        {
                j=0;
  }
}
/*
void timer1isr() interrupt 3
{
        TH1=(65536-46080)/256;
        TL1=(65536-46080)%256;
        i++;
}*/

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

使用道具 舉報

沙發
ID:821845 發表于 2020-9-22 13:04 | 只看該作者
你這個是什么的代碼
回復

使用道具 舉報

板凳
ID:332444 發表于 2020-9-22 13:44 | 只看該作者
通常數碼管都使用2塊鎖存器,我買的板子數碼管就是,只要使用了鎖存器這種電路通常需要寫消隱才能很好解決問題,一般的做法是先打開位,再打開段顯示一點時間就消隱。
回復

使用道具 舉報

地板
ID:332444 發表于 2020-9-22 13:50 | 只看該作者
回復

使用道具 舉報

5#
ID:821872 發表于 2020-9-22 14:47 | 只看該作者
延遲部分寫太復雜了,鬼影就是延遲部分沒做好,人眼看的時候出現視覺效果,改下延遲時間試一試。
回復

使用道具 舉報

6#
ID:389488 發表于 2020-9-22 15:29 | 只看該作者
13424291824 發表于 2020-9-22 14:47
延遲部分寫太復雜了,鬼影就是延遲部分沒做好,人眼看的時候出現視覺效果,改下延遲時間試一試。

用延時沒問題 我已經注釋掉了 用定時器動態顯示就不行了鬼影也去不掉
回復

使用道具 舉報

7#
ID:389488 發表于 2020-9-22 15:32 | 只看該作者
xianfajushi 發表于 2020-9-22 13:44
通常數碼管都使用2塊鎖存器,我買的板子數碼管就是,只要使用了鎖存器這種電路通常需要寫消隱才能很好解決 ...

是這樣的,你說的非常對。但是我用延時動態顯示的問題已經解決 現在已經把延時注釋掉了,不用延時用定時器動態顯示就是不行,鬼影嚴重。位選前面后面加了0x00也不行。
回復

使用道具 舉報

8#
ID:332444 發表于 2020-9-22 15:40 | 只看該作者
段需要消隱,位無需消隱。數碼管顯示不要放在定時器里面,我的做法是不用定時器延時,也不用嵌套循環的延時,直接使用char n=0;while(!++n);這樣,不知道明白了?若還不能解決我寫個參考給你。
回復

使用道具 舉報

9#
ID:807182 發表于 2020-9-22 16:17 | 只看該作者
共陽極共陰極也需要注意,】
回復

使用道具 舉報

10#
ID:89515 發表于 2020-9-22 17:03 來自手機 | 只看該作者
定時器18ms掃描一位?6位九幀沒問題嗎?思考一下為何要消影。明白了就很簡單了。
回復

使用道具 舉報

11#
ID:750420 發表于 2020-9-22 20:36 | 只看該作者
仿真還是實物,反正的話注意看下是否報告菜譜、
回復

使用道具 舉報

12#
ID:750420 發表于 2020-9-22 20:38 | 只看該作者
仿真還是實物,仿真注意下cpu的負載,是否給你報告不能實時的進行顯示了,實物的話多半是延時函數設置的問題
回復

使用道具 舉報

13#
ID:213173 發表于 2020-9-22 21:27 | 只看該作者
適合郭天祥TX-1C開發板,樓主消隱沒有處理好。
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>

  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long

  6. sbit ledw=P2^6;
  7. sbit ledd=P2^7;

  8. #define ledduan P0

  9. u8 code ledma[]={
  10.                 0x3f,0x06,0x5b,0x4f,
  11.                 0x66,0x6d,0x7d,0x07,
  12.                 0x7f,0x6f,0x77,0x7c,
  13.                 0x39,0x5e,0x79,0x71,
  14.                 0x40,0x80,0xff,0x00};//共陰 0-f . 全顯全滅

  15. u8 code ledwma[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//共陰

  16. u8 i;
  17. u32 a;

  18. void delay(u16 z)
  19. {
  20.         u16 x,y;
  21.         for(x=z;x>0;x--)
  22.                 for(y=120;y>0;y--);
  23. }

  24. void main()
  25. {
  26.         u8 aa[6];
  27.         a=333333;       
  28.         aa[0]=a/100000;
  29.         aa[1]=a%100000/10000;
  30.         aa[2]=a%10000/1000;
  31.         aa[3]=a%1000/100;
  32.         aa[4]=a%100/10;
  33.         aa[5]=a%10;

  34.         while(1)
  35.         {
  36.                 ledduan=0x00;         ledw=1;ledw=0;//消隱
  37.                 ledduan=ledwma[i];    ledd=1;ledd=0;//送位碼
  38.                 ledduan=ledma[aa[i]]; ledw=1;ledw=0;//送段碼
  39.                 delay(1);
  40.                 i++;i%=6;
  41.         }
  42. }
復制代碼
回復

使用道具 舉報

14#
ID:389488 發表于 2020-9-23 08:20 | 只看該作者
xianfajushi 發表于 2020-9-22 15:40
段需要消隱,位無需消隱。數碼管顯示不要放在定時器里面,我的做法是不用定時器延時,也不用嵌套循環的延時 ...

感謝回復,理解你的寫法。但是我現在需要解決的問題是用定時器時間切換位選
回復

使用道具 舉報

15#
ID:89515 發表于 2020-9-23 09:19 來自手機 | 只看該作者
j>=6對嗎?
回復

使用道具 舉報

16#
ID:332444 發表于 2020-9-23 11:01 | 只看該作者
看注釋目前定時器設定50毫秒,也就是說每50毫秒換一位數碼管顯示,似乎時間有點長了,通常是每位數碼管20毫秒刷新,如果位數多了還要減少刷新時間,這暫且不論,使用鎖存器電路通常處理的辦法就是打開位送段延時段消隱就是消除幻影的辦法,至少理論是這樣,一般位是不用消隱的因為無論打開哪位段都是消隱的因此就沒影響,不知道我說清楚了沒,不知道試過沒?
回復

使用道具 舉報

17#
ID:285863 發表于 2020-9-23 11:14 | 只看該作者
加快刷新速率 每位數碼管10毫秒刷新 就沒有鬼影
回復

使用道具 舉報

18#
ID:89515 發表于 2020-9-23 13:03 來自手機 | 只看該作者
j>=6?
回復

使用道具 舉報

19#
ID:389488 發表于 2020-9-23 13:17 | 只看該作者
謝謝各位熱心的朋友,已解決 不用延時,用定時器計數時間切換。主要問題出來數字切換的時間上
#include <STC89C5xRC.H>
#include <intrins.h>

#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long


sbit ledd=P2^6;
sbit ledw=P2^7;

#define ledsmg P0


u8 code ledma []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x58,0x5e,0x79,0x71,0x80,0xff,0x00};//共陰 0-f . 全顯全滅

u8 code ledwma []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//共陰

u8 i;
u32 a=456123;

u8 aa,bb,cc,dd,ee,ff;

  

void timer0init()
{
        TMOD|=0x01;
        TH0=(65536-2765)/256;//3ms
        TL0=(65536-2765)%256;
        ET0=1;
        EA=1;
        TR0=1;
}




void main()
{
        aa=a/100000;
  bb=a%100000/10000;
  cc=a%10000/1000;
        dd=a%1000/100;
        ee=a%100/10;
        ff=a%10;
         
                  timer0init();
         
         while(1)
          {
                 
                }       
                 
}


void timerIsr() interrupt 1
{
         TH0=(65536-2765)/256;
         TL0=(65536-2765)%256;

          i++;
         if(i>=6)
                 {
                         i=0;
     }
                 switch(i)
                                {
                                        case 0:
                                                     ledw=1;
                                                     ledsmg=ledwma [0];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[aa];
                                               ledd=0;
                             break;
                                        case 1:
                                                     ledw=1;
                                                     ledsmg=ledwma [1];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[bb];
                                               ledd=0;
                                               break;
                                        case 2:
                                                     ledw=1;
                                                     ledsmg=ledwma [2];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[cc];
                                                ledd=0;
                                                break;
                                        case 3:
                                                     ledw=1;
                                                     ledsmg=ledwma [3];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[dd];
                                               ledd=0;
                                               break;
                                        case 4:
                                                     ledw=1;
                                                     ledsmg=ledwma [4];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[ee];
                                               ledd=0;
                                               break;
                                        case 5:
                                                     ledw=1;
                                                     ledsmg=ledwma [5];
                       ledw=0;
       
                             ledd=1;
                             ledsmg=ledma[ff];
                                               ledd=0;
                                               break;
         }
}
回復

使用道具 舉報

20#
ID:389488 發表于 2020-9-23 13:18 | 只看該作者
xianfajushi 發表于 2020-9-23 11:01
看注釋目前定時器設定50毫秒,也就是說每50毫秒換一位數碼管顯示,似乎時間有點長了,通常是每位數碼管20毫 ...

實際是3ms  50ms備注沒修改。
回復

使用道具 舉報

21#
ID:389488 發表于 2020-9-23 13:25 | 只看該作者
2894989833 發表于 2020-9-22 13:04
你這個是什么的代碼

定時器切換數碼管顯示
回復

使用道具 舉報

22#
ID:389488 發表于 2020-9-24 08:15 | 只看該作者
wulin 發表于 2020-9-22 21:27
適合郭天祥TX-1C開發板,樓主消隱沒有處理好。

贊一個
回復

使用道具 舉報

23#
ID:389488 發表于 2020-9-24 08:45 | 只看該作者
更新后的簡化程序如下,正常顯示
#include <STC89C5xRC.H>
#include <intrins.h>

#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long


sbit ledd=P2^6;
sbit ledw=P2^7;

#define ledsmg P0


u8 code ledma []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x58,0x5e,0x79,0x71,0x80,0xff,0x00};//共陰 0-f . 全顯全滅

u8 code ledwma []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//共陰

u8 i,j;
u32 a=654321;

u8 aa[6];

  

void timerinit()
{
        TMOD|=0x01;
        TH0=(65536-2765)/256;//3ms
        TL0=(65536-2765)%256;
        ET0=1;
        EA=1;
       
        TR0=1;
       
}




void main()
{
  aa[0]=a/100000;
  aa[1]=a%100000/10000;
  aa[2]=a%10000/1000;
  aa[3]=a%1000/100;
  aa[4]=a%100/10;
  aa[5]=a%10;
                  timerinit();
         
         while(1)
          {
                       
                 ledw=1;
                 ledsmg=ledwma [i];
                 ledw=0;
                       
                 }       
                 
}


void timer0Isr() interrupt 1
{
         TH0=(65536-2765)/256;
         TL0=(65536-2765)%256;

          i++;            
         if(i>=6)
          i=0;
                             ledd=1;
                             ledsmg=ledma[aa[i]];
                             ledd=0;
}

回復

使用道具 舉報

24#
ID:389488 發表于 2020-9-24 08:45 | 只看該作者

這樣是沒有問題的
回復

使用道具 舉報

25#
ID:822669 發表于 2020-9-24 09:33 | 只看該作者
所謂鬼影就是多次顯示的重疊,每次顯示完都清除一次就可以了
回復

使用道具 舉報

26#
ID:822755 發表于 2020-9-24 12:00 | 只看該作者
更新數據前,先關閉所有數碼管
回復

使用道具 舉報

27#
ID:825447 發表于 2020-10-4 12:37 | 只看該作者
你在每次段選結束后下次位選前加上P0=0xff;  //消影
這樣應該就可以解決了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 有码一区| 毛片一级黄色 | 日本天堂视频在线观看 | 国产高清在线观看 | 1级毛片 | 日本精品视频一区二区 | 99精品国自产在线观看 | 免费在线观看一区二区三区 | 国产欧美久久一区二区三区 | 免费在线黄| 手机看片1| 色在线免费 | 女人毛片a毛片久久人人 | 久久噜噜噜精品国产亚洲综合 | 久久99精品久久久久久 | 国产成人精品一区二区三区在线 | 久久精品国产亚洲 | 99re视频这里只有精品 | 国产91在线 | 亚洲 | 久久国产区 | 麻豆久久久久久久久久 | 日日干夜夜操 | 久久成人精品视频 | 亚洲欧美bt | 久久日韩精品一区二区三区 | 97在线观视频免费观看 | www国产亚洲精品久久网站 | 亚洲精品视频免费观看 | 亚洲午夜一区二区 | 免费一级淫片aaa片毛片a级 | 欧美一级片在线播放 | 青青草视频网站 | 成人h动漫精品一区二区器材 | 国产黄色小视频在线观看 | 自拍偷拍中文字幕 | 午夜影院免费体验区 | 国产99久久久国产精品 | 毛片一区 | caoporn地址 | 在线成人一区 | 成人免费视屏 |