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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用51單片機做日歷時鐘設計,數碼管顯示不穩定一直在跳動

  [復制鏈接]
跳轉到指定樓層
樓主
數碼管有些不顯示,有些一直在跳動

}~E~4]BSMT9Q[7D6K7Y0IM1.png (52.27 KB, 下載次數: 26)

日期顯示不對,輸入的是19年7月9日,但顯示1的數碼管不亮

日期顯示不對,輸入的是19年7月9日,但顯示1的數碼管不亮

EHD0@9VF8EHMOIHV}$4`[}R.png (54.61 KB, 下載次數: 28)

顯示時間的有時候是正常的

顯示時間的有時候是正常的

O38J%3@9E82EV2UKW\\86N.png (56.27 KB, 下載次數: 29)

秒的顯示錯誤

秒的顯示錯誤

U2EQEWGDSH[90}BKP%0NGZX.png (53.9 KB, 下載次數: 31)

顯示1的數碼管不亮

顯示1的數碼管不亮
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:580447 發表于 2019-7-10 09:52 | 只看該作者
附上C語言程序,大神幫我看看哪里出錯了:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^1;
sbit wela=P3^2;
uint bb=0;
sbit led1=P3^3;
uint x=0,t0=0;
uchar num,temp,ch=1;
uchar shi=17,fen=13,miao=25,shi1,shi2,fen1,fen2,miao1,miao2;
uint nian=2019,yue=7,ri=9,nian1,nian2,yue1,yue2,ri1,ri2,year=00,month=00,day=00,year1,year2,month1,month2,day1,day2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};

void delay(uint z)
{
        uint t1,y;
        for(t1=z;t1>0;t1--)
                for(y=110;y>0;y--);
}


void display(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
{
        
        wela=1;
        P2=0xfe;
        wela=0;
        
        dula=1;
        P2=table[shi1];
        delay(5);
        dula=0;

        wela=1;
        P2=0xfd;
        wela=0;

        dula=1;
        P2=table[shi2];
        delay(5);
        dula=0;

        wela=1;
        P2=0xfb;
        wela=0;

        dula=1;
        P2=table[fen1];
        delay(5);
        dula=0;

        wela=1;
        P2=0xf7;
        wela=0;

        dula=1;
        P2=table[fen2];
        delay(5);
        dula=0;

        wela=1;
        P2=0xef;
        wela=0;

        dula=1;
        P2=table[miao1];
        delay(5);
        dula=0;

        wela=1;
        P2=0xdf;
        wela=0;

        dula=1;
        P2=table[miao2];
        delay(5);
        dula=0;
}

void init()
{
        TMOD=0x11;
        TH0=(65536-50000)/256;  //定時器初始化
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        ET1=1;
        TR1=1;

}

uchar keyscan()
{
        P3=0xfe;//檢測第一行
        temp=P3;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {

                switch(temp)
                        {
                                case 0xe0:num=1;
                                        break;
                                case 0xd0:num=2;
                                        break;
                                case 0xb0:num=3;
                                        break;
                                case 0x70:num=4;
                                        break;
                        }
                while(temp!=0xf0)
                        {
              temp=P3;
              temp=temp&0xf0;
         }
      }
  }                  
   return shi,fen;
}

void jisuan()
{
if(num==1)
{
ch++;
if(ch==4)
ch=1;
num=0;
}
if(num==2)
{
if(ch==1)
shi++;
if(ch==2)
nian++;
if(ch==3)
year++;
num=0;
}
if(num==3)
{
if(ch==1)
fen++;
if(ch==2)
yue++;
if(ch==3)
month++;
num=0;
}
if(num==4)
{
if(ch==1)
miao++;
if(ch==2)
ri++;
if(ch==3)
day++;
num=0;
}
}
void shijian()
{
    shi1=shi/10;
        shi2=shi%10;
        fen1=fen/10;
        fen2=fen%10;
        miao1=miao/10;
        miao2=miao%10;
        
        if(fen==0&miao==0)/*
        當時間為整時時燈滅,否則燈亮
        
        */
        {
                led1=0;
                }else{
                        led1=1;
                        
                }   
               
        if(shi==24)
        {
                shi=0;
                ri++;        
        }
        if(fen==60)
        {
                fen=0;
                shi++;
        }
        if(miao==60)
        {
                miao=0;
                fen++;
        }
}
void riqi()            
{
         nian1=nian/10;
        nian2=nian%10;
        yue1=yue/10;
        yue2=yue%10;
        ri1=ri/10;
        ri2=ri%10;
        if(yue==12)
        {
        nian++;
        yue=1;
        }
        switch(yue)//判斷月份大小
        {
        case 1:case 3:case 5:case 7:case 8:case 10:case 12:
        if(ri==32)
        {
        ri=1;
        yue++;
        }
        break;
        case 4:case 6:case 9:case 11:
        if(ri==31)
        {
        ri=1;
        yue++;
        }
        break;
        case 2:        //判斷閏年
        if((nian%4==0&nian%100!=0)||nian%400==0)
        {
        yue++;
        ri=1;
        }
        else if(nian%400!=0&ri==29)
        {
        yue++;
        ri=1;
        }
        break;
        }         
}
void naozhong()    //鬧鐘
{
         year1=year/10;
        year2=year%10;
        month1=month/10;
        month2=month%10;
        day1=day/10;
        day2=day%10;
        if(year==24)
        {
                year=0;        
        }
        if(month==60)
        {
                month=0;
                year++;
        }
        if(day==60)
        {
                day=0;
                month++;
        }
}
void main()  //shi代表當前時間 year代表鬧鐘時間
{
        init();        
        P1=0x00;              //P1四個燈 初始化為滅
        while(1)
        {        
        jisuan();
        keyscan();
        shijian();
        riqi();
        naozhong();
        if(shi==year&fen==month&miao==day)
        TR0=1;
        if(ch==1)
        display(shi1, shi2, fen1, fen2, miao1, miao2);
    if(ch==2)
        display(nian1,nian2,yue1,yue2,ri1,ri2);
         if(ch==3)
        display(year1,year2,month1,month2,day1,day2);
        }
}
void time1() interrupt 3
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        x++;
        if(x==20)
        {
        x=0;
        miao++;
        if(miao==60)
        {
        miao=0;
        fen++;
        if(fen==60)
        {
        fen=0;
        shi++;
        if(shi==24)
        {
        shi=0;
        }
        }
        }
        }

}
void timer0() interrupt 1   //定時器0中斷
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0++;
        
        if(t0<1200)
        {
                          
                          
                         bb++;                                                //增加_b 拖延時間增加閃爍時間
                          if(bb<15){
                                P1=0xff;
                          }
                                
                                if(bb>15){
                                P1=0xf0;
                                       
                                        if(bb>30){bb=0;}
                                
                                }         
                        
        if(t0==1200)
        {
                TR0=0;                                 //60秒后關閉定時器0,關閉燈
                P1=0x00;
         
        }
                 
    }
}
回復

使用道具 舉報

板凳
ID:123289 發表于 2019-7-11 10:27 | 只看該作者
學會畫出流程圖并走通流程圖。
回復

使用道具 舉報

地板
ID:212797 發表于 2019-7-11 18:14 | 只看該作者
我看你顯示代碼里面沒有消影,看看是不是這個原因
回復

使用道具 舉報

5#
ID:575964 發表于 2019-7-11 20:43 | 只看該作者
可能是管子的消隱沒做好或者軟件顯示問題?我三年前好像也出過這個問題,記不太清了。。。
回復

使用道具 舉報

6#
ID:457495 發表于 2019-7-12 09:14 | 只看該作者
消影做完之后,可以先嘗試一下調一下延時函數的時間。
回復

使用道具 舉報

7#
ID:462827 發表于 2019-7-12 09:54 | 只看該作者
直接用一個8位數碼管不好嗎,這樣一位一位來而且又是亂排看得尷尬病都犯了
回復

使用道具 舉報

8#
ID:582773 發表于 2019-7-12 10:43 | 只看該作者
和時間有關,太快了,肉眼是看不到的
回復

使用道具 舉報

9#
ID:582773 發表于 2019-7-12 10:43 | 只看該作者
檢查下顯示時間,位選和段選
回復

使用道具 舉報

10#
ID:93224 發表于 2019-7-12 21:22 | 只看該作者
減少每個數碼管之間的延時
回復

使用道具 舉報

11#
ID:199811 發表于 2019-7-13 12:07 | 只看該作者
是軟件問題,建議使用實物制作比較好。加上延時程序看看嫩嗯不能減小
回復

使用道具 舉報

12#
ID:421308 發表于 2019-7-13 18:41 | 只看該作者
函數不對啊
回復

使用道具 舉報

13#
ID:583390 發表于 2019-7-13 20:07 | 只看該作者
/********************************************************************* * 實 驗 名:超聲波測距控制步進電機實驗 *********************************************************************/  #include "reg52.h" #include <intrins.h>  sbit RX=P2^1; sbit TX=P2^0;          //t,e定義超聲波管教 unsignedint  time=0; unsignedint  timer=0; unsigned long S=0; bit      flag =0; //測量標志 bit                srFlag                = 1; unsignedint a=100; unsignedint b=600; unsignedinta_o=100; unsignedintb_o=600; unsignedint mid; unsigned char        iSW        = 0; unsigned char uMode                                = 1;  #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char disbuff[8] ={0,0,0,0,0,0,0,0}; //電機IO #define GPIO_MOTOR P1 sbit F1 = P1^0; sbit F2 = P1^1; sbit F3 = P1^2; sbit F4 = P1^3; //按鍵IO sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3; unsigned char        keyEx        = 0;  unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉順序 unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉順序  unsigned char Direction,Speed; void Delay(unsigned int t); void  Motor(); voidDigDisplay();  void Delay1ms()   //?? 0us { unsigned char a,b,c; for(c=2;c>0;c--) for(b=38;b>0;b--) for(a=13;a>0;a--);                                  }  voidDigDisplay() {         unsigned char i;         unsignedint j;         for(i=0;i<8;i++)         {                 switch(i)         //位選,選擇點亮的數碼管,                 {                         case(0):                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位                         case(1):                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位                         case(2):                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位                         case(3):                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位                         case(4):                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位                         case(5):                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位                         case(6):                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位                         case(7):                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位  //勢能端                         }                  GPIO_DIG=disbuff[i];//發送段碼                                          j=10;                                                 //掃描間隔時間設定                         while(j--);                                            //延時                 GPIO_DIG=0x00;//消隱         } }  unsigned char scanKey(void) { // 如果此前沒有按鍵         if(keyEx == 0 )         {                 if( K1 == 0 )                 {                         keyEx        = 1;        // 有鍵按下                         return 1;                // 鍵值1表示閾值ab切換                 }                 if( K2 == 0 )                 {                         keyEx        = 1;        // 有鍵按下                         return 2;                // 鍵值2表示'+'                 }                 if( K3 == 0 )                 {                         keyEx        = 1;        // 有鍵按下                         return 3;                // 鍵值3表示'-'                 }                 if( K4 == 0 )                 {                         keyEx        = 1;        // 有鍵按下                         return 4;                // 鍵值4表示數位切換                 }                                 return 0;         }         else         {                 if( K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1 )                 {                         keyEx        = 0;        // 等待沒有按鍵后,按鍵保護值清0                 }         }         return 0; } /********************************************************************* * 函 數 名:Motor * 函數功能:電機旋轉函數 *********************************************************************/ void  Motor() {          unsigned char i;         for(i=0;i<8;i++)         {                 if(Direction==1)                          GPIO_MOTOR = FFW[i]&0x1f;  //???                 if(Direction==2)                          GPIO_MOTOR = FFZ[i]&0x1f;                 Delay(Speed);        //????                 }         }  void  zd3()  interrupt 3                  //T1中斷用來掃描數碼管和計800MS啟動模塊 {         TH1=0xf8;         TL1=0x30;         DigDisplay();         timer++;         if(srFlag||timer>=100) //200ms 中斷一次         {                 srFlag = 0;                 timer=0;                 TX=1;        //至高點平                                //800MS  啟動一次模塊                 _nop_();                  _nop_();                  _nop_();                  _nop_();                  _nop_();                         _nop_();                  _nop_();                  _nop_();                  _nop_();                  _nop_();                          _nop_();                  _nop_();                  _nop_();                  _nop_();                  _nop_();                         _nop_();                  _nop_();                 _nop_();                  _nop_();                  _nop_();                  //20us高電平                                 TX=0;         }  }  /********************************************************************* * 函 數 名:main * 函數功能:主函數 *********************************************************************/ void main(void)  {          unsigned char i;         Speed=15;         TMOD=0x11;                   //設T0為方式1,GATE=1;         TH0=0;         TL0=0;                   //清0                  TH1=0xf8;                   //2MS定時         TL1=0x30;         ET0=1;             //允許T0中斷         ET1=1;                           //允許T1中斷         TR1                = 0;         EA                = 0;         while(scanKey() == 0 )         {                 disbuff[0]        = DIG_CODE[4];                 disbuff[1]        = DIG_CODE[5];                 disbuff[2]        = DIG_CODE[0];                 disbuff[3]        = DIG_CODE[1];                 disbuff[4]        = DIG_CODE[0];                 disbuff[5]        = DIG_CODE[3];                 disbuff[6]        = DIG_CODE[1];                 disbuff[7]        = DIG_CODE[1];                 DigDisplay();         }         for(i=0;i<100;i++)         {                 Delay1ms();                 }         if(uMode == 1 )         {                 TR1                = 1;                 EA                = 1;         }         while(1)         {                 if(uMode == 0 )                 {                         disbuff[0]        = DIG_CODE[a% 10];                         disbuff[1]        = DIG_CODE[(a / 10) % 10];                         disbuff[2]        = DIG_CODE[(a / 100) % 10];                         disbuff[3]        = DIG_CODE[(a / 1000) % 10];                         disbuff[4]        = DIG_CODE[b% 10];                         disbuff[5]        = DIG_CODE[(b / 10) % 10];                         disbuff[6]        = DIG_CODE[(b / 100) % 10];                         disbuff[7]        = DIG_CODE[(b / 1000) % 10];                         DigDisplay();                         switch(scanKey() )                         {                         // 如果按下了模式切換鍵                                 case 1:                                         uMode        = 1;                                         TR1                = 1;                                         EA                = 1;                                         break;                                                                 // 如果按下了'+'鍵                                 case 2:                                         switch(iSW )                                         {                                                 case 0:                                                 mid = a;                                                 if( mid        + 100 <= 3000 )                                                 mid        += 100;                                                 a = mid;                                                 break;                                                                                                         case 1:                                                 mid = b;                                                 if( mid        + 100 <= 3000 )                                                 mid        += 100;                                                 b = mid;                                                 break;                                                                                                                                                 default:                                                 break;                                         }                                         break;                                                                 // 如果按下了'-'鍵                                 case 3:                                         switch(iSW )                                         {                                                 case 0:                                                 mid = a;                                                 if( mid        - 100 > 0 )                                                 mid        -= 100;                                                 a = mid;                                                 break;                                                                                                         case 1:                                                 mid = b;                                                 if( mid        - 100 > 0 )                                                 mid        -= 100;                                                 b = mid;                                                                                                 default:                                                 break;                                         }                                         break;                                                                 // 如果按下了換位鍵                                 case 4:                                         iSW++;                                         if(iSW>= 2 )                                                 iSW        = 0;                                         break;                                                                                 default:                                         break;                                 }                         if (a>=b)                         {                                 a = a_o;                                 b + b_o;                         }                 }                         else                 {                         TH0                 = 0;                // 計數清0,等待測距計數                         TL0                 = 0;                                                 // 我們假定工作模式=1代表超聲波測距                         while( !RX &&scanKey() != 1 );                                                 // 如果有echo信號或者有SET按鍵                         TR0        = 1;                                                 if( !RX &&keyEx )                // 如果是有按鍵而沒有echo,則返回參數設置                         {                                 // 如果有SET按鍵                                 uMode        = 0;                                 TR0                = 0;                                 TR1                = 0;                                 EA                = 0;                                 continue;                         }                                                 // 如果有echo信號,則一直等待echo信號結束                         while(RX );                         // echo信號結束,停止計數                         TR0                        = 0;                         time        = TH0 * 256 + TL0;                         S= (long)(time*0.17);                         disbuff[3]=DIG_CODE[S%10000/1000];                         disbuff[2]=DIG_CODE[S%1000/100];                         disbuff[1]=DIG_CODE[S%100/10];                         disbuff[0]=DIG_CODE[S%10/1];                         disbuff[4]        = 0;                         disbuff[5]        = 0;                         disbuff[6]        = 0;                         disbuff[7]        = 0;                         DigDisplay();                         if(S>=a)                         {                                         if(S>=b)                                 {                                         Direction=1;                                         Speed = 1;                                 }                                 else                                 {                                         Direction=1;                                         Speed = 20;                                 }                         }                         else                         {                                 Direction=1;                                 Speed = 100;                         }                         Motor();                                                                         // 此次測距結束,可以啟動下一次了                         srFlag        = 1;                                         }         } }  /********************************************************************* * 函 數 名:Delay * 函數功能:延時 *********************************************************************/ void Delay(unsigned int t) {                                    unsignedint k;         while(t--)         {                 for(k=0; k<20; k++)                 { }         } }
回復

使用道具 舉報

14#
ID:583390 發表于 2019-7-13 20:08 | 只看該作者
/*********************************************************************
* 實 驗 名:超聲波測距控制步進電機實驗
*********************************************************************/
#include "reg52.h"
#include <intrins.h>

sbit RX=P2^1;
sbit TX=P2^0;          //t,e定義超聲波管教
unsignedint  time=0;
unsignedint  timer=0;
unsigned long S=0;
bit      flag =0; //測量標志
bit                srFlag                = 1;
unsignedint a=100;
unsignedint b=600;
unsignedinta_o=100;
unsignedintb_o=600;
unsignedint mid;
unsigned char        iSW        = 0;
unsigned char uMode                                = 1;

#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char disbuff[8] ={0,0,0,0,0,0,0,0};
//電機IO
#define GPIO_MOTOR P1
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
//按鍵IO
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
unsigned char        keyEx        = 0;

unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉順序
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉順序

unsigned char Direction,Speed;
void Delay(unsigned int t);
void  Motor();
voidDigDisplay();

void Delay1ms()   //?? 0us
{
unsigned char a,b,c;
for(c=2;c>0;c--)
for(b=38;b>0;b--)
for(a=13;a>0;a--);       
                       
}

voidDigDisplay()
{
        unsigned char i;
        unsignedint j;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位  //勢能端       
                }
                 GPIO_DIG=disbuff[i];//發送段碼
                       
                j=10;                                                 //掃描間隔時間設定       
                while(j--);                                            //延時
                GPIO_DIG=0x00;//消隱
        }
}

unsigned char scanKey(void)
{
// 如果此前沒有按鍵
        if(keyEx == 0 )
        {
                if( K1 == 0 )
                {
                        keyEx        = 1;        // 有鍵按下
                        return 1;                // 鍵值1表示閾值ab切換
                }
                if( K2 == 0 )
                {
                        keyEx        = 1;        // 有鍵按下
                        return 2;                // 鍵值2表示'+'
                }
                if( K3 == 0 )
                {
                        keyEx        = 1;        // 有鍵按下
                        return 3;                // 鍵值3表示'-'
                }
                if( K4 == 0 )
                {
                        keyEx        = 1;        // 有鍵按下
                        return 4;                // 鍵值4表示數位切換
                }               
                return 0;
        }
        else
        {
                if( K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1 )
                {
                        keyEx        = 0;        // 等待沒有按鍵后,按鍵保護值清0
                }
        }
        return 0;
}
/*********************************************************************
* 函 數 名:Motor
* 函數功能:電機旋轉函數
*********************************************************************/
void  Motor()
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                if(Direction==1)
                        GPIO_MOTOR = FFW[i]&0x1f;  //???
                if(Direction==2)
                        GPIO_MOTOR = FFZ[i]&0x1f;
                Delay(Speed);        //????       
        }       
}

void  zd3()  interrupt 3                  //T1中斷用來掃描數碼管和計800MS啟動模塊
{
        TH1=0xf8;
        TL1=0x30;
        DigDisplay();
        timer++;
        if(srFlag||timer>=100)
//200ms 中斷一次
        {
                srFlag = 0;
                timer=0;
                TX=1;        //至高點平                                //800MS  啟動一次模塊
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();       
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();        
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();       
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                //20us高電平               
                TX=0;
        }
}

/*********************************************************************
* 函 數 名:main
* 函數功能:主函數
*********************************************************************/
void main(void)
{
        unsigned char i;
        Speed=15;
        TMOD=0x11;                   //設T0為方式1,GATE=1;
        TH0=0;
        TL0=0;         
        //清0
       
        TH1=0xf8;                   //2MS定時
        TL1=0x30;
        ET0=1;             //允許T0中斷
        ET1=1;                           //允許T1中斷
        TR1                = 0;
        EA                = 0;
        while(scanKey() == 0 )
        {
                disbuff[0]        = DIG_CODE[4];
                disbuff[1]        = DIG_CODE[5];
                disbuff[2]        = DIG_CODE[0];
                disbuff[3]        = DIG_CODE[1];
                disbuff[4]        = DIG_CODE[0];
                disbuff[5]        = DIG_CODE[3];
                disbuff[6]        = DIG_CODE[1];
                disbuff[7]        = DIG_CODE[1];
                DigDisplay();
        }
        for(i=0;i<100;i++)
        {
                Delay1ms();       
        }
        if(uMode == 1 )
        {
                TR1                = 1;
                EA                = 1;
        }
        while(1)
        {
                if(uMode == 0 )
                {
                        disbuff[0]        = DIG_CODE[a% 10];
                        disbuff[1]        = DIG_CODE[(a / 10) % 10];
                        disbuff[2]        = DIG_CODE[(a / 100) % 10];
                        disbuff[3]        = DIG_CODE[(a / 1000) % 10];
                        disbuff[4]        = DIG_CODE[b% 10];
                        disbuff[5]        = DIG_CODE[(b / 10) % 10];
                        disbuff[6]        = DIG_CODE[(b / 100) % 10];
                        disbuff[7]        = DIG_CODE[(b / 1000) % 10];
                        DigDisplay();
                        switch(scanKey() )
                        {
                        // 如果按下了模式切換鍵
                                case 1:
                                        uMode        = 1;
                                        TR1                = 1;
                                        EA                = 1;
                                        break;                               
                                // 如果按下了'+'鍵
                                case 2:
                                        switch(iSW )
                                        {
                                                case 0:
                                                mid = a;
                                                if( mid        + 100 <= 3000 )
                                                mid        += 100;
                                                a = mid;
                                                break;                                                       
                                                case 1:
                                                mid = b;
                                                if( mid        + 100 <= 3000 )
                                                mid        += 100;
                                                b = mid;
                                                break;                                                                                               
                                                default:
                                                break;
                                        }
                                        break;                               
                                // 如果按下了'-'鍵
                                case 3:
                                        switch(iSW )
                                        {
                                                case 0:
                                                mid = a;
                                                if( mid        - 100 > 0 )
                                                mid        -= 100;
                                                a = mid;
                                                break;                                                       
                                                case 1:
                                                mid = b;
                                                if( mid        - 100 > 0 )
                                                mid        -= 100;
                                                b = mid;                                               
                                                default:
                                                break;
                                        }
                                        break;                               
                                // 如果按下了換位鍵
                                case 4:
                                        iSW++;
                                        if(iSW>= 2 )
                                                iSW        = 0;
                                        break;                                       
                                        default:
                                        break;       
                        }
                        if (a>=b)
                        {
                                a = a_o;
                                b + b_o;
                        }
                }
                        else
                {
                        TH0                 = 0;                // 計數清0,等待測距計數
                        TL0                 = 0;                       
                        // 我們假定工作模式=1代表超聲波測距
                        while( !RX &&scanKey() != 1 );                       
                        // 如果有echo信號或者有SET按鍵
                        TR0        = 1;                       
                        if( !RX &&keyEx )                // 如果是有按鍵而沒有echo,則返回參數設置
                        {
                                // 如果有SET按鍵
                                uMode        = 0;
                                TR0                = 0;
                                TR1                = 0;
                                EA                = 0;
                                continue;
                        }                       
                        // 如果有echo信號,則一直等待echo信號結束
                        while(RX );
                        // echo信號結束,停止計數
                        TR0                        = 0;
                        time        = TH0 * 256 + TL0;
                        S= (long)(time*0.17);
                        disbuff[3]=DIG_CODE[S%10000/1000];
                        disbuff[2]=DIG_CODE[S%1000/100];
                        disbuff[1]=DIG_CODE[S%100/10];
                        disbuff[0]=DIG_CODE[S%10/1];
                        disbuff[4]        = 0;
                        disbuff[5]        = 0;
                        disbuff[6]        = 0;
                        disbuff[7]        = 0;
                        DigDisplay();
                        if(S>=a)
                        {       
                                if(S>=b)
                                {
                                        Direction=1;
                                        Speed = 1;
                                }
                                else
                                {
                                        Direction=1;
                                        Speed = 20;
                                }
                        }
                        else
                        {
                                Direction=1;
                                Speed = 100;
                        }
                        Motor();                                               
                        // 此次測距結束,可以啟動下一次了
                        srFlag        = 1;                       
                }
        }
}

/*********************************************************************
* 函 數 名:Delay
* 函數功能:延時
*********************************************************************/
void Delay(unsigned int t)
{                           
        unsignedint k;
        while(t--)
        {
                for(k=0; k<20; k++)
                { }
        }
}
回復

使用道具 舉報

15#
ID:583390 發表于 2019-7-13 20:09 | 只看該作者


sbit RX=P2^1;
sbit TX=P2^0;          //t,e定義超聲波管教
unsignedint  time=0;
unsignedint  timer=0;
unsigned long S=0;
bit      flag =0; //測量標志
bit                srFlag                = 1;
unsignedint a=100;
unsignedint b=600;
unsignedinta_o=100;
unsignedintb_o=600;
unsignedint mid;
unsigned char        iSW        = 0;
unsigned char uMode                                = 1;

#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char disbuff[8] ={0,0,0,0,0,0,0,0};
//電機IO
#define GPIO_MOTOR P1
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
//按鍵IO
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
unsigned char        keyEx        = 0;

unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉順序
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉順序

unsigned char Direction,Speed;
void Delay(unsigned int t);
void  Motor();
voidDigDisplay();

void Delay1ms()   //?? 0us
{
unsigned char a,b,c;
for(c=2;c>0;c--)
for(b=38;b>0;b--)
for(a=13;a>0;a--);       
                       
}

voidDigDisplay()
{
        unsigned char i;
        unsignedint j;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位

}
回復

使用道具 舉報

16#
ID:584083 發表于 2019-7-15 00:21 來自觸屏版 | 只看該作者
數碼管延時時間太長了。
回復

使用道具 舉報

17#
ID:484491 發表于 2020-1-20 20:00 來自觸屏版 | 只看該作者
那個void display中改成這樣:P2=0xfe;wela=1;wela=0;P2=0xff;P2=table[shi1];dula=1;dula=0;delay(2):其他類似同樣改
回復

使用道具 舉報

18#
ID:679425 發表于 2020-1-21 08:50 | 只看該作者
消隱和延時,更改下試試
回復

使用道具 舉報

19#
ID:420836 發表于 2020-1-21 09:00 | 只看該作者
我認為閃爍是刷新太慢的結果。 你需要以至少100Hz的頻率刷新每個LED數位。 有時,你可以使用某種技巧來以相對較低的刷新率幫助減少嚴重的閃爍。 例如,我們可以選擇一個順序來刷新LED位數,例如同時刷新1、3和5,然后稍后再進行2、4和6。 這非常類似于電視隔行掃描方法。
回復

使用道具 舉報

20#
ID:93224 發表于 2020-1-21 17:11 | 只看該作者
有可能是鬼影,或者你兩個數碼管之間的延時太高造成的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线国产精品 | 国产粉嫩尤物极品99综合精品 | 午夜精品一区二区三区在线观看 | 国产成人综合在线 | 欧美aaaaaaaaaa | 日本a v在线播放 | 天天插天天射天天干 | 久久久精品日本 | 美女视频一区二区三区 | 亚洲国产成人精品女人久久久 | 精一区二区 | 欧美日韩在线不卡 | 91国在线| 日韩成人影院 | 91精品国产综合久久小仙女图片 | 亚洲国产视频一区二区 | 成人久久久 | 亚洲一区视频 | 午夜视频免费在线 | 在线观看国产www | 精区3d动漫一品二品精区 | 一级爱爱片 | 日韩欧美网 | 亚洲欧美在线观看 | 久久国产精品视频 | 久久大| 亚洲精品国产综合区久久久久久久 | 高清国产午夜精品久久久久久 | 色.com| 日韩国产精品一区二区三区 | 亚洲小视频在线观看 | 国产成人免费 | 精品国产黄色片 | 亚洲精品一区二区三区蜜桃久 | 精品成人一区二区 | 色婷婷综合久久久中文字幕 | 中文在线一区二区 | 精品三区| 日日摸夜夜添夜夜添特色大片 | 国产精品伦一区二区三级视频 | 国产美女特级嫩嫩嫩bbb片 |