找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)驅(qū)動(dòng)8位數(shù)碼管怎么讓其中2位閃爍,求助大佬

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:884325 發(fā)表于 2021-2-15 20:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
現(xiàn)在情況是只能整體閃爍不知道怎么控制其中2位閃爍
代碼如下
  1. #include  "reg52.h"
  2. sbit  a=P2^2;
  3. sbit  b=P2^3;
  4. sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. sbit  k8=P3^7;

  9.    unsigned  char  i=0;
  10.    unsigned  int   l=0;
  11.    unsigned   int  flag=0;
  12.    unsigned   int  cishu=1;
  13.    unsigned    ssec=0,sec=5,min=0;
  14.    unsigned   DisplayData[8];
  15.    unsigned code  dongtai[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  17.      void  delay(unsigned  int  i)
  18.      {
  19.         while(i--);
  20.      }

  21.             void Timer0Init()
  22.           {
  23.             
  24.                          TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
  25.             TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)10ms
  26.                 TL0=0Xf0;        
  27.                 ET0=1;//打開(kāi)定時(shí)器0中斷允許
  28.                 EA=1;//打開(kāi)總中斷
  29.                 TR0=1;//打開(kāi)定時(shí)器                        
  30.           }

  31.                      void Timer1Init()
  32.             {
  33.                     TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開(kāi)啟動(dòng)。
  34.                     TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  35.                     TL1=0X18;        
  36.                     ET1=1;//打開(kāi)定時(shí)器1中斷允許
  37.                     EA=1;//打開(kāi)總中斷
  38.                     TR1=1;//打開(kāi)定時(shí)器                        
  39.             }

  40.   void  aaa()
  41. {

  42.         DisplayData[4]=dongtai[min/10];
  43.         DisplayData[5]=dongtai[min%10]+0x80;
  44.         DisplayData[6]=dongtai[sec/10];
  45.         DisplayData[7]=dongtai[sec%10];

  46.          
  47.             DisplayData[0]=dongtai[cishu];        
  48.             DisplayData[1]=0x80;
  49.             DisplayData[2]=0x80;
  50.             DisplayData[3]=0x80;
  51.          
  52.          
  53.            if(min==0&&sec==0)
  54.             {
  55.                    DisplayData[4]= 0x3f;
  56.                    DisplayData[5]= 0x3f+0x80;
  57.                    DisplayData[6]= 0x3f;
  58.                    DisplayData[7]= 0x3f;
  59.             }
  60. }
  61.   void  abc()
  62. {
  63.         for(i=0;i<8;i++)
  64.         { switch(i)
  65.           { case(0): a=0;b=0;c=0; break;
  66.             case(1): a=1;b=0;c=0; break;
  67.             case(2): a=0;b=1;c=0; break;
  68.                 case(3): a=1;b=1;c=0; break;
  69.                 case(4): a=0;b=0;c=1; break;
  70.                 case(5): a=1;b=0;c=1; break;
  71.                 case(6): a=0;b=1;c=1; break;
  72.                 case(7): a=1;b=1;c=1; break;
  73.           }
  74.            if(l==1&&(i==0||i==1))
  75.            {
  76.                   Timer1Init();
  77.                            
  78.            }            
  79.           P0=DisplayData[i];
  80.                   
  81.                 delay(100);  
  82.                 P0=0x00;
  83.         
  84.     }                 
  85. }
  86.   void  main()
  87. {
  88.              P0=0x00;
  89.          while(1)
  90.        {  
  91.                    if(k1!=0xFF)
  92.                    delay(1000);
  93.                    if(k1!=0xFF)
  94.                   {                        
  95.                       flag++;
  96.                       if(flag==1)
  97.                         {
  98.                                        
  99.                     }
  100.                    else  if(flag>1)
  101.                   {
  102.                           flag=1;
  103.                           cishu++;
  104.                           if(cishu>=9)
  105.                         {
  106.                             cishu=1;
  107.                     }
  108.                   }
  109.                           Timer0Init();
  110.                                  sec=5;
  111.                             min=0;
  112.                  }  
  113.                  while(!k1);
  114.                              
  115.                   
  116.                    if(k2!=0xFF)
  117.                    delay(30000);
  118.                    if(k2!=0xFF)
  119.                   {                 
  120.                          l++;
  121.                          while(!k2);
  122.                           if(l>=5)
  123.                           {
  124.                            l=0;
  125.                           }
  126.                   }
  127.                   
  128.                   
  129.                   abc();        
  130.                   aaa();
  131.            }                                 
  132. }         

  133.    void Timer0() interrupt 1
  134. {
  135.         TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)10ms
  136.         TL0=0Xf0;
  137.         
  138.         ssec++;
  139.         if(ssec>=100)  //1s
  140.         {
  141.           ssec=0;
  142.           sec--;        
  143.           if(sec<=0)
  144.          {
  145.             if(min>0)
  146.            {
  147.                  sec=60;
  148.              min--;
  149.            }
  150.                 if(min<=0)
  151.            {         
  152.                    if(sec==0)
  153.                   {
  154.                       TR0=0;
  155.                   }
  156.            }
  157.          }
  158.         }
  159. }

  160.   void Timer1() interrupt 3
  161. {
  162.         static unsigned  int  j=0;
  163.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  164.         TL1=0X18;         
  165.         j++;  
  166.         if(j>=500)         
  167.         {
  168.                 j=0;
  169.           P0=0x00;
  170.           delay(20000);
  171.                   
  172.         }        
  173. }   
復(fù)制代碼
   

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

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2021-2-16 07:50 | 只看該作者
回復(fù)

使用道具 舉報(bào)

板凳
ID:884325 發(fā)表于 2021-2-16 20:12 | 只看該作者
xianfajushi 發(fā)表于 2021-2-16 07:50
可參https://blog.csdn.net/xianfajushi/article/details/94927172

多謝大佬我去看看
回復(fù)

使用道具 舉報(bào)

地板
ID:884325 發(fā)表于 2021-2-16 20:49 | 只看該作者
xianfajushi 發(fā)表于 2021-2-16 07:50
可參https://blog.csdn.net/xianfajushi/article/details/94927172

sbit duan = P2^6;//數(shù)碼段
sbit wei = P2^7;//數(shù)碼位

不太明白為什么一個(gè)引腳就能控制數(shù)碼管的位和段顯示
我寫(xiě)的是8位數(shù)碼管呀
真想不明白
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2021-2-16 22:23 | 只看該作者
你這程序?qū)懙脝?wèn)題不少,難以達(dá)到預(yù)期效果,給你改了,仿真正常。


  1. #include  "reg52.h"
  2. //sbit  a=P2^2;
  3. //sbit  b=P2^3;
  4. //sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. //sbit  k8=P3^7;

  9. unsigned char num,cishu=0;
  10. //unsigned int   l=0;
  11. bit flag=0;
  12. unsigned int ssec=0;
  13. char sec=0,min=0;
  14. bit sign=0;
  15. bit flash;
  16. unsigned char DisplayData[8];
  17. unsigned char code dongtai[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  18.                                                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  19. void  delay(unsigned int i)
  20. {
  21.         while(i--);
  22. }

  23. void Timer0Init()
  24. {
  25.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。      
  26.         TH0 = 0xFC;                //設(shè)置定時(shí)初值定時(shí)1ms
  27.         TL0 = 0x18;                //設(shè)置定時(shí)初值
  28.         ET0=1;//打開(kāi)定時(shí)器0中斷允許
  29.         EA=1;//打開(kāi)總中斷
  30.         TR0=1;//打開(kāi)定時(shí)器                        
  31. }
  32. /*
  33. void Timer1Init()
  34. {
  35.         TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開(kāi)啟動(dòng)。
  36.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  37.         TL1=0X18;        
  38.         ET1=1;//打開(kāi)定時(shí)器1中斷允許
  39.         EA=1;//打開(kāi)總中斷
  40.         TR1=1;//打開(kāi)定時(shí)器                        
  41. }*/

  42. void  aaa()
  43. {
  44.         DisplayData[0]=dongtai[cishu];        
  45.         DisplayData[1]=0x40;
  46.         DisplayData[2]=0x40;
  47.         DisplayData[3]=0x40;
  48.         if(cishu==0)
  49.         {
  50.                 DisplayData[4]=dongtai[min/10];
  51.                 DisplayData[5]=dongtai[min%10]+0x80;
  52.                 DisplayData[6]=dongtai[sec/10];
  53.                 DisplayData[7]=dongtai[sec%10];
  54.         }
  55.         else
  56.         {
  57.                 if(cishu==1&&flash==1)
  58.                         DisplayData[4]=0;
  59.                 else
  60.                         DisplayData[4]=dongtai[min/10];
  61.                 if(cishu==2&&flash==1)
  62.                         DisplayData[5]=0x80;
  63.                 else
  64.                         DisplayData[5]=dongtai[min%10]+0x80;
  65.                 if(cishu==3&&flash==1)
  66.                         DisplayData[6]=0;
  67.                 else
  68.                         DisplayData[6]=dongtai[sec/10];
  69.                 if(cishu==4&&flash==1)
  70.                         DisplayData[7]=0;
  71.                 else
  72.                         DisplayData[7]=dongtai[sec%10];
  73.         }
  74.    /*
  75.         if(min==0&&sec==0)
  76.         {
  77.                 DisplayData[4]= 0x3f;
  78.                 DisplayData[5]= 0x3f+0x80;
  79.                 DisplayData[6]= 0x3f;
  80.                 DisplayData[7]= 0x3f;
  81.         }*/
  82. }

  83. void abc()
  84. {   
  85.         static unsigned char t=0;
  86.         P0=0x00;
  87.         P2&=0xe3;
  88.         P2|=(t<<2);
  89.         P0=DisplayData[t];
  90.         t=++t%8;
  91. }

  92. void  main()
  93. {
  94. //        P0=0x00;
  95.         Timer0Init();
  96.         while(1)
  97.         {  
  98.                 if(!k1||!k2||!k4)
  99.                 {
  100.                         delay(1000);
  101.                         if((!k1||!k2||!k4) && sign==0)
  102.                         {         
  103.                                 sign=1;
  104.                                 if(!k1 && flag==0)
  105.                                         cishu=++cishu%5;
  106.                                 if(!k2 && cishu>0)
  107.                                 {
  108.                                         switch(cishu)
  109.                                         {
  110.                                                 case 1: min+=10;if(min/10>5)min%=10; break;
  111.                                                 case 2: min++;if(min%10==0)min-=10; break;
  112.                                                 case 3: sec+=10;if(sec/10>5)sec%=10; break;
  113.                                                 case 4: sec++;if(sec%10==0)sec-=10; break;
  114.                                         }
  115.                                 }
  116.                                 if(!k4 && cishu==0)
  117.                                         flag=1;
  118.                         }
  119.                 }
  120.                 else sign=0;   
  121.                 aaa();
  122.         }
  123. }         

  124. void Timer0() interrupt 1
  125. {
  126.         TH0 = 0xFC;                //設(shè)置定時(shí)初值
  127.         TL0 = 0x18;                //設(shè)置定時(shí)初值
  128.         if(flag)
  129.         {
  130.                 if(min|sec!=0)
  131.                 {
  132.                         ssec++;
  133.                         if(ssec>=1000)  //1s
  134.                         {
  135.                                 ssec=0;
  136.                                 sec--;        
  137.                                 if(min==0&&sec==0)
  138.                                         flag=0;                       
  139.                                 else if(sec<0)
  140.                                 {
  141.                                         min--;
  142.                                         sec=59;
  143.                                 }
  144.                         }
  145.                 }
  146.                 else flag=0;
  147.         }
  148.         if(++num==200)
  149.         {
  150.                 num=0;
  151.                 flash=~flash;
  152.         }
  153.         abc();
  154. }
  155. /*
  156. void Timer1() interrupt 3
  157. {
  158.         static unsigned  int  j=0;
  159.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  160.         TL1=0X18;         
  161.         j++;  
  162.         if(j>=500)         
  163.         {
  164.                 j=0;
  165.                 P0=0x00;
  166.                 delay(20000);
  167.         }        
  168. }*/   
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

6#
ID:884325 發(fā)表于 2021-2-17 11:14 | 只看該作者
本帖最后由 千年約定 于 2021-2-17 20:29 編輯
wulin 發(fā)表于 2021-2-16 22:23
你這程序?qū)懙脝?wèn)題不少,難以達(dá)到預(yù)期效果,給你改了,仿真正常。

大佬很感謝您認(rèn)真看了我的程序并且花了很多時(shí)間進(jìn)行了修改
很抱歉沒(méi)在問(wèn)題上說(shuō)清楚我的程序具體功能。功能是數(shù)碼管前兩位用來(lái)計(jì)數(shù)倒計(jì)時(shí)的次數(shù)的,最后四位用來(lái)做倒計(jì)時(shí)的時(shí)鐘,當(dāng)我按K1按鍵的時(shí)候開(kāi)始倒計(jì)時(shí),當(dāng)我長(zhǎng)按K2按鍵的時(shí)候能夠修改次數(shù),分鐘,秒鐘,修改的時(shí)候?qū)?yīng)的數(shù)碼管能夠閃爍顯示,其他數(shù)碼管正常顯示,K4和K8用來(lái)對(duì)其加減

將您的程序略作修改后終于實(shí)現(xiàn)了2位閃爍功能
非常感謝

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2021-2-17 20:45 | 只看該作者
一位或多位數(shù)碼管閃爍原理時(shí)一樣的,按你的意圖修改并詳細(xì)注釋?zhuān)瑧?yīng)該可以看得懂。
1秒至99分59秒倒計(jì)時(shí)程序數(shù)碼管閃爍示例 仿真.zip (124.42 KB, 下載次數(shù): 9)

回復(fù)

使用道具 舉報(bào)

8#
ID:884325 發(fā)表于 2021-2-17 23:06 | 只看該作者
wulin 發(fā)表于 2021-2-17 20:45
一位或多位數(shù)碼管閃爍原理時(shí)一樣的,按你的意圖修改并詳細(xì)注釋?zhuān)瑧?yīng)該可以看得懂。

多謝大佬我去好好看看
回復(fù)

使用道具 舉報(bào)

9#
ID:440403 發(fā)表于 2021-2-18 00:29 | 只看該作者
為什么一個(gè)位和段能控制顯示,因?yàn)橐粋(gè)單純的七段數(shù)碼管就要七個(gè)引腳去控制,如果8位的話,就需要56個(gè)腳,所以通過(guò)位選來(lái)選擇哪一位顯示,節(jié)省引腳。因此只能顯示一位,但是它顯示的很快,肉眼是看不出來(lái)的,也就等同于都亮了,你要亮哪個(gè),選哪個(gè)就好了。


不用過(guò)多糾結(jié),都是電路來(lái)的。

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:884325 發(fā)表于 2021-2-18 09:49 | 只看該作者
兩儀式 發(fā)表于 2021-2-18 00:29
為什么一個(gè)位和段能控制顯示,因?yàn)橐粋(gè)單純的七段數(shù)碼管就要七個(gè)引腳去控制,如果8位的話,就需要56個(gè)腳, ...

多謝大佬解釋
回復(fù)

使用道具 舉報(bào)

11#
ID:556632 發(fā)表于 2021-2-19 09:14 | 只看該作者
給高低電平并延時(shí)
回復(fù)

使用道具 舉報(bào)

12#
ID:275826 發(fā)表于 2021-2-20 15:24 | 只看該作者
樓主問(wèn)題解決了嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:884325 發(fā)表于 2021-3-1 11:47 | 只看該作者
tyrl800 發(fā)表于 2021-2-20 15:24
樓主問(wèn)題解決了嗎?

解決了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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