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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9561|回復(fù): 8
收起左側(cè)

單片機(jī)數(shù)碼管不能完全顯示問題求助

[復(fù)制鏈接]
ID:398663 發(fā)表于 2018-9-24 10:50 | 顯示全部樓層 |閱讀模式
今天在做用計時器代替delay函數(shù)的數(shù)碼管程序,從99開始倒計時。剛開始的時候99能正常顯示,98開始后面的大多數(shù)都不能正常顯示,偶爾個別數(shù)有可以正常顯示,這是為什么?下面是代碼和proteus仿真圖。順便問一下,做項目的時候幾乎都是拋棄delay函數(shù),用計時器的嗎?那計時器會不夠用的吧?謝謝各位
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint n,time=99;                      //n:50ms計數(shù)變量;time:時間變量
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共陰極數(shù)碼管編碼
uchar table1[]={0xfe,0xfd};   //位選信號
uint index;                            //位選變量

void init(){
        TMOD=0x11;
        TH0=(65536-46080)/256;       //計時器0計時50ms,20個周期為1s
        TL0=(65536-46080)%256;
        TH1=0xfc;                            //計時器1計時1ms,1ms到則顯示下一位數(shù)碼管
        TL1=0x66;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
}

void ledscan(uint time){
         switch(index){                                            //根據(jù)位選變量選擇段選信號
                 case 0:P0=table[time/10];           
                break;
                case 1:P0=table[time%10];
                break;
                default:break;
         }
         P2=table1[index];                                     //根據(jù)位選變量選擇位選信號
         index++;
         if(index>1)                                              //位選只有0,1兩種情況,超過1則清零
                 index=0;
}
void main(){
         init();
        while(1){        
                if(n==20){                                       //20個50ms為1s
                        n=0;
                        time--;
                        if(time==-1)
                                time=99;
                }
        }
}

void timer_0()interrupt 1{
        TH0=(65536-46080)/256;                           //50ms到則50ms計數(shù)變量+1
        TL0=(65536-46080)%256;
        n++;

}
void timer_1()interrupt 3{                                  //1ms到則顯示下一位
        TH1=0xfc;
        TL1=0x66;
        ledscan(time);
}



88正常

88正常

98不正常

98不正常

99正常

99正常
回復(fù)

使用道具 舉報

ID:387733 發(fā)表于 2018-9-24 14:50 | 顯示全部樓層
掃描顯示的一個很關(guān)鍵點沒處理好,一定要先關(guān)閉顯示,再換位,換段碼,再開顯示,否則就顯示錯位了。
可以參考 http://www.zg4o1577.cn/bbs/dpj-135252-1.html  2樓


另外不需要每個延時用一個定時器。整個系統(tǒng)用一個定時器,一般定時1mS。在定時器中斷里面用幾個計數(shù)單元,就可以產(chǎn)生10mS, 500mS,1秒等周期狀態(tài),就像時鐘只用一個秒信號,就能產(chǎn)生時、分、一樣。
再定義幾個延時變量,如:

   u8 delaymS1;
   u8 delaymS2;

  在定時器中斷內(nèi),只需加2段語句:

  if(delaymS1>0) delaymS1--;
  if(delaymS2>0) delaymS2--;

當(dāng)需要延時的時候就給變量賦值:

  delaymS1=10;  
.....
  delaymS2=20;
......
  然后等待變量回“0”

if(delaymS1==0)     // 10mS延時到

.......
if(delaymS2==0)      // 20mS延時到


  

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:290170 發(fā)表于 2018-9-24 15:11 | 顯示全部樓層
在實際項目中,delay是極少使用的,都是使用一個定時器作為一個計數(shù)器,51單片機(jī)中,最少也有兩個定時器,你只要使用其中一個定時器作為產(chǎn)生一秒的中斷,就可以當(dāng)時鐘來用,使用計數(shù)器計數(shù)秒數(shù)的增加,每滿1000就清0;這樣的話,當(dāng)你想在100秒的時候做某樣?xùn)|西就可以判斷這個count計數(shù)器是否==100,這樣就可以計算時間了。而你顯示不正常的原因,我覺得是函數(shù)延時過長,掃描速度不夠,數(shù)碼管是掃描工作的,當(dāng)刷新頻率低于2ms時,人眼分辨不出來變化,就等于一直在顯示

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:388197 發(fā)表于 2018-9-24 15:42 | 顯示全部樓層
PROTEUS模擬動態(tài)LED顯示屏效果不是很好,建議用實物來練習(xí).
一個定時器可以通過設(shè)置多個計數(shù)變量來實現(xiàn)多種用途.或者一個計數(shù)變量通過輪流調(diào)用來實現(xiàn)多種用途.

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:294690 發(fā)表于 2018-9-24 16:26 | 顯示全部樓層
PROTEUS模擬很多時候會因為你的連線問題或者其他一些小細(xì)節(jié)的問題,導(dǎo)致跟實物有很大區(qū)別。建議使用實物來測試

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-9-24 16:57 | 顯示全部樓層
1.顯示不正常是因為數(shù)碼管動態(tài)顯示程序缺少消隱指令。
2.一個定時器中斷只要合理編程可以承擔(dān)N項任務(wù)。
在你的程序基礎(chǔ)上修改好了,你試試。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint n=0; //n:1ms計數(shù)變量
char time=99; //time:時間變量                  
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共陰極數(shù)碼管編碼
uchar table1[]={0xfe,0xfd};   //位選信號
uchar index=0;
bit S=0;//秒標(biāo)志(位變量)
void init()
{
        TMOD=0x10;
//        TH0=(65536-46080)/256;       //計時器0計時50ms,20個周期為1s
//        TL0=(65536-46080)%256;
//        TH1=0xfc;                    //計時器1計時1ms,1ms到則顯示下一位數(shù)碼管
//        TL1=0x66;
        TH1=0xfc;                    //計時器1計時1ms,1ms到則顯示下一位數(shù)碼管
        TL1=0x66;
        EA=1;
//        ET0=1;
        ET1=1;
//        TR0=1;
        TR1=1;
}

void ledscan()
{
        switch(index)
        {                            //根據(jù)位選變量選擇段選信號
                case 0:
                        P0=0x00;       //消隱   
                        P2=table1[index];
                        P0=table[time/10];
                break;
                case 1:
                        P0=0x00;       //消隱   
                        P2=table1[index];
                        P0=table[time%10];
                break;
                default:break;
        }
//        P2=table1[index];           //根據(jù)位選變量選擇位選信號
        index++;
        if(index>1)                 //位選只有0,1兩種情況,超過1則清零
        index=0;
}
void main()
{
        init();
        while(1)
        {        
                if(S==1)
                {            
                        S=0;                                //1秒標(biāo)志清0
                        time--;
                        if(time==-1)
                        time=99;
                }
        }
}
/*
void timer_0()interrupt 1
{
        TH0=(65536-46080)/256; //50ms到則50ms計數(shù)變量+1
        TL0=(65536-46080)%256;
        n++;

}*/
void timer_1()interrupt 3
{                         //1ms到則顯示下一位
        TH1=0xfc;
        TL1=0x66;
        n++;
        if(n>=1000)
        {
                n=0;
                S=1;                //1秒標(biāo)志
        }
        ledscan();
}

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:7485 發(fā)表于 2018-9-24 17:45 | 顯示全部樓層
一個定時器一直運行,(就想時鐘一樣)足夠控制數(shù)個動作的時序。當(dāng)中斷次數(shù)(或者秒數(shù)、分?jǐn)?shù)、小時數(shù))達(dá)到你預(yù)定的時間IO即可輸出動作,當(dāng)然也可以是倍數(shù)。例如:中斷次數(shù)(時、分、秒一樣)是n倍時。

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:398663 發(fā)表于 2018-9-24 22:17 | 顯示全部樓層
謝謝樓上各位,加了P2=0xff消隱之后確實都正常了

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:923285 發(fā)表于 2021-5-18 14:53 | 顯示全部樓層
#include<reg51.h>
#define LEDData P0
unsigned char code   LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char minit,second,count,count1;
unsigned char set_minit=12,set_second=0;
sbit add1=P1^0;
sbit dec1=P1^1;
sbit exchange=P1^2;
sbit add2=P1^3;
sbit dec2=P1^4;
sbit secondpoint=P0^7;
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^3;
sbit led6=P2^2;
sbit led7=P2^1;
sbit led8=P2^0;
sbit led9=P3^7;
sbit led10=P3^6;
sbit alam=P1^7;
bit  playon=0;
bit  timeover=0;
bit  AorB=0;
bit  halfsecond=0;
unsigned int scoreA;
unsigned int scoreB;
void Delay5ms(void)
{  
unsigned int i;
for(i=100;i>0;i--);
  }
      void display(void)
  {
LEDData=LEDCode[minit/10];
led1=0;
Delay5ms();
led1=1;
LEDData=LEDCode[minit%10];
   led2=0;
Delay5ms();
led2=1;
if(halfsecond==1)  
  LEDData=0x80;  
else  
  LEDData=0x00;
  led2=0;
  Delay5ms();
led2=1;
secondpoint=0;
LEDData=LEDCode[second/10];  
  led3=0;
Delay5ms();
led3=1;  
LEDData=LEDCode[second%10];  
   led4=0;
Delay5ms();
led4=1;
if(AorB==0)
   LEDData=LEDCode[scoreA/100];
  else  
   LEDData=LEDCode[scoreB/100];
   led5=0;
Delay5ms();
led5=1;
if(AorB==0)  
  LEDData=LEDCode[(scoreA%100)/10];  
else  
  LEDData=LEDCode[(scoreB%100)/10];  
led6=0;
Delay5ms();
led6=1;
if(AorB==0)  
  LEDData=LEDCode[scoreA%10];
  else  
  LEDData=LEDCode[scoreB%10];
  led7=0;
Delay5ms();
led7=1;
if(AorB==1)  
  LEDData=LEDCode[scoreA/100];
else
   LEDData=LEDCode[scoreB/100];
  led8=0;
  Delay5ms();  
led8=1;
if(AorB==1)
   LEDData=LEDCode[(scoreA%100)/10];
  else
   LEDData=LEDCode[(scoreB%100)/10];
  led9=0;
Delay5ms();
led9=1;
if(AorB==1)  
  LEDData=LEDCode[scoreA%10];
else  
  LEDData=LEDCode[scoreB%10];  
led10=0;  
Delay5ms();
led10=1;
}
void keyscan(void)
{
if(playon==0)
{
if(add1==0)
{
display();
if(add1==0);
{
if(minit<99)
minit++;
else
minit=99;
}
do
display();
while(add1==0);
}
if(dec1==0)
{
display();
if(dec1==0);
{
if(minit>0)
minit--;
else
minit=0;
}
do
display();
while(dec1==0);
}
if(add2==0)
{
display();
if(add2==0);
{
if(second<59)
second++;
else
second=59;
}
do
display();
while(add2==0);
}
if(dec2==0)
{
if(second>0)
second--;
else
second=0;
}
do
display();
   while(dec2==0);
}
if(exchange==0)
{
   display();
if(exchange==0);
{
   TR1=0;
   alam=1;
   AorB=~AorB;
   minit=set_minit;
   second=0;
}
do
   display();
while(exchange==0);
  }
else
{
if(add1==0)
{
   display();
   if(add1==0);
   {
      if(AorB==0)
      {
         if(scoreA<999)
           scoreA++;
         else
           scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
do
display();
while(add1==0);
}
if(dec1==0)
{
display();
if(dec1==0);
{
if(AorB==0)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
do
display();
while(dec1==0);
}
if(add2==0)
{
display();
if(add2==0);
{
if(AorB==1)
{
if(scoreA<999)
scoreA++;
else
scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
do
display();
while(add2==0);
}
if(dec2==0)
{
display();
if(dec2==0);
{
if(AorB==1)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
do
display();
while(dec2==0);
}
}
}
void main(void)
{
TMOD=0x11;
TL0=0xb0;
TH0=0x3c;
TL1=0xb0;
TH1=0x3c;
minit=set_minit;
second=0;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
EX0=1;
IT0=1;
IT1=1;
EX1=1;
PX0=1;
PX1=1;
PT0=0;
P1=0xFF;
P3=0xFF;
while(1)
  {  
keyscan();
    display();
   }
}
void PxInt0(void) interrupt 0
{
Delay5ms();
  EX0=0;  
alam=1;  
TR1=0;
if(timeover==1)  
   {
  timeover=0;  
}  
  if(playon==0)
   {
  playon=1;  
  TR0=1;  
}  
else
{  
playon=0;   
  TR0=0;   
   }   
EX0=1;   
  }
void  time0_int(void) interrupt 1
  {  
  TL0=0xb0;  
   TH0=0x3c;  
TR0=1;  
   count++;   
   if(count==10)   
   {  
halfsecond=0;  
   }   
  if(count==20)
{  
count=0;   
    halfsecond=1;  
     if(second==0)   
    {  
  if(minit>0)   
{   
second=59;  
   minit--;   
  }
else      
    {   
timeover=1;  
    playon=0;  
   TR0=0;   
    TR1=1;   
    }
}
else
second--;   
}
}
void  time1_int(void) interrupt 3
{  
TL1=0xb0;  
  TH1=0x3c;  
TR1=1;  
count1++;  
   if(count1==10)
  {
alam=0;   
   }   
    if(count1==20)  
     {
count1=0;  
    alam=1;   
  }

我的程序就是中間的那一橫不能顯示 求幫助
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美一区二区三区四区 | 日皮视频免费 | 亚洲精品电影在线观看 | 欧美成年网站 | 国产成人精品午夜视频免费 | 久久精品一区二区视频 | 国产欧美精品一区二区三区 | 中文字幕乱码一区二区三区 | 又黄又爽的网站 | 国产精品久久国产精品 | 日本人麻豆| 在线免费观看一区二区 | 激情欧美一区二区三区中文字幕 | 天天看天天干 | 一区二区精品视频 | 久久精品亚洲精品国产欧美 | 最新中文字幕在线 | 91视频免费在观看 | 中文天堂在线一区 | 色婷婷国产精品综合在线观看 | 三级在线观看 | 日韩一区二区在线免费观看 | 久久91精品国产一区二区三区 | 在线观看第一区 | 久久亚洲欧美日韩精品专区 | 久久亚洲一区二区三区四区 | 成人精品久久 | 狠狠操婷婷 | 欧美成人一级 | 精品国产一级片 | 国产综合久久久 | 伊人网一区| 欧美成人精品欧美一级 | www.久草.com | 91伊人| 日日爱av | 精品国产欧美 | 欧美国产精品一区二区三区 | 国产成人一区二区三区 | 成人黄色电影免费 | 亚洲视频一区二区三区 |