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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1857|回復: 9
收起左側

步進電機轉動數碼管滅掉,而電機停止了數碼又亮起,幫一下這程序什么改數碼管才不...

[復制鏈接]
ID:516928 發表于 2022-4-6 23:40 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
#include<reg52.h>
sbit K2 = P2^0;         
unsigned char werbg = 0;
unsigned char werbg2 = 0;
unsigned int Num ;
unsigned char shan,cutnum,addnum,startnum,setnum,time;

sbit SMG3 = P3^6;                                       
sbit SMG4 = P3^7;                                       
unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x71};           
unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};
unsigned char code BeatCodf[8] = { 0x6, 0x7, 0x3, 0xB, 0x9, 0xD, 0xC, 0xE};
unsigned char t0_ct;

unsigned char Buff[4];
void delayms(xms);
void Display(void);
void delay(unsigned int cnt)
{
    while (cnt--);
}
void delayms(xms)
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--);
}

void TrunMotor(unsigned long angle)
{
    unsigned char buf;
    unsigned char step = 0;
    unsigned long beats = 0;   
                beats = (angle * 1100) / 20;
          if(werbg == 1)
             {
          while (beats--)
             {
                  buf  = P1 & 0xF0;      
                  buf |= BeatCode[step];  
                  P1   = buf;            
                  step++;        
                  step &= 0x07;  
                  delay(200);   
             }
          P1 = 0x00;
                      werbg = 0;
                                        TR0 = 1;         
       }

    if(werbg2==1)
                   {
          while (beats--)
            {
                buf  = P1 & 0xF0;      
                buf |= BeatCodf[step];  
                P1   = buf;            
                step++;        
                step &= 0x07;  
                delay(200);   
            }
         P1 = 0x00;
                     werbg2 = 0;
                         }
}
void KeyScan(void)
{
        if(K2==0)               
        {
                 delay(10);
                if(K2==0)                  
                {
                        while(!K2);  
                        werbg = 1;         
                                               
                }      
        }
}
void T0_Init()
{
        TMOD = 0x01;
        TH0 = (65535-100)/256;  
        TL0 = (65535-100)%256;
        EA = 1;
        ET0 = 1;
}
void T0_time() interrupt 1
{
        TH0 = (65535-100)/256;   
        TL0 = (65535-100)%256;
     if(++t0_ct==133)
       {
            t0_ct = 0;      
                        if(Num==40)
                           {
                                    Num=0;                                                                                               
                                          if(time==0)              
                                                   {                                                                                          
                                                                  time=25;
                                                   }
                   time--;
                                                                         if(time==0)
                                                                            {
                                                                               TR0 = 0;
                                                                               werbg2=1;
                                                                            }
               }
                              else Num++;
                   }
}
void Display(void)
{
        unsigned char  b3,b4;
                b3=time/10;
                b4=time%10;      
          P0=table[b3];
          SMG3=0;                                                         
          delayms(3);
          SMG3=1;

          P0=table[b4];
    SMG4=0;
    delayms(3);                                                
    SMG4=1;
}
void main()
{
          T0_Init();
                while(1)
                {
                          KeyScan();
              Display();
                                TrunMotor(20*1);
                }
}

回復

使用道具 舉報

ID:96682 發表于 2022-4-7 07:29 來自手機 | 顯示全部樓層
是程序還是電源功率有問題?
回復

使用道具 舉報

ID:161164 發表于 2022-4-7 07:45 來自手機 | 顯示全部樓層
開多個定時器1,1ms中斷,把Display放到中斷中循環顯示而不要用delay
回復

使用道具 舉報

ID:516928 發表于 2022-4-7 09:11 | 顯示全部樓層
lkc8210 發表于 2022-4-7 07:45
開多個定時器1,1ms中斷,把Display放到中斷中循環顯示而不要用delay

什么開多個定時器1?
什么寫程序,可給個參考
回復

使用道具 舉報

ID:955673 發表于 2022-4-7 09:47 | 顯示全部樓層
1ms中斷,不要用delay,相當于弄個低速時鐘,要多少按計數來
回復

使用道具 舉報

ID:121859 發表于 2022-4-7 14:10 | 顯示全部樓層
必然的,因為電機轉動的時候,沒有調用顯示,要克服這個問題,需要用定時器來控制顯示,這樣才不會受到其他程序的影響。

評分

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

查看全部評分

回復

使用道具 舉報

ID:516928 發表于 2022-4-7 23:10 | 顯示全部樓層
是這樣寫嗎?
  1. #include<reg52.h>

  2. unsigned char werbg = 0;
  3. unsigned char werbg2 = 0;
  4. unsigned int Num ;
  5. unsigned char shan,cutnum,addnum,startnum,setnum,time;
  6. sbit K2 = P2^0;         
  7. sbit SMG3 = P3^6;                                       
  8. sbit SMG4 = P3^7;                                       
  9. unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x71};           
  10. unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};
  11. unsigned char code BeatCodf[8] = { 0x6, 0x7, 0x3, 0xB, 0x9, 0xD, 0xC, 0xE};
  12. unsigned char t0_ct,num2;

  13. void delayms(xms);
  14. void Display(void);
  15. void delay(unsigned int cnt)
  16. {
  17.     while (cnt--);
  18. }
  19. void delayms(xms)
  20. {
  21.          unsigned int x,y;
  22.          for(x=xms;x>0;x--)
  23.                  for(y=110;y>0;y--);
  24. }

  25. void TrunMotor(unsigned long angle)
  26. {
  27.     unsigned char buf;
  28.     unsigned char step = 0;
  29.     unsigned long beats = 0;   
  30.                 beats = (angle * 1100) / 20;
  31.           if(werbg == 1)
  32.              {
  33.           while (beats--)
  34.              {
  35.                   buf  = P1 & 0xF0;      
  36.                   buf |= BeatCode[step];  
  37.                   P1   = buf;            
  38.                   step++;        
  39.                   step &= 0x07;  
  40.                   delay(70);   
  41.              }
  42.           P1 = 0x00;
  43.                       werbg = 0;
  44.                                         TR1 = 1;         
  45.        }

  46.     if(werbg2==1)
  47.                    {
  48.           while (beats--)
  49.             {
  50.                 buf  = P1 & 0xF0;      
  51.                 buf |= BeatCodf[step];  
  52.                 P1   = buf;            
  53.                 step++;        
  54.                 step &= 0x07;  
  55.                 delay(70);   
  56.             }
  57.          P1 = 0x00;
  58.                      werbg2 = 0;
  59.                          }
  60. }
  61. void KeyScan(void)
  62. {
  63.         if(K2==0)               
  64.         {
  65.                  delay(10);
  66.                 if(K2==0)                  
  67.                 {
  68.                         while(!K2);  
  69.                         werbg = 1;         
  70.                                                
  71.                 }      
  72.         }
  73. }
  74. void T0_Init()
  75. {
  76.         TMOD = 0x11;
  77.         TH0 = (65535-45872)/256;  
  78.         TL0 = (65535-45872)%256;
  79.         TH1 = (65536-45872)/256;
  80.         TL1 = (65536-45872)%256;
  81.         EA = 1;
  82.         ET0 = 1;
  83.         ET1 = 1;
  84.         TR0 = 1;
  85.         
  86. }
  87. void T0_time() interrupt 1
  88. {
  89.         TH0 = (65535-100)/256;   
  90.         TL0 = (65535-100)%256;
  91.    num2++;      
  92.         if(num2 == 20)  
  93.         {
  94.                 num2 = 0;   
  95.         Display();
  96.         }  
  97. }
  98. void T1_time() interrupt 3  
  99. {
  100.         TH1 = (65536-45872)/256;      
  101.         TL1 = (65536-45872)%256;
  102.       
  103.         if(++t0_ct==2)
  104.        {
  105.             t0_ct = 0;      
  106.                         if(Num==10)
  107.                            {
  108.                                     Num=0;                                                                                               
  109.                                           if(time==0)              
  110.                                                    {                                                                                          
  111.                                                                   time=25;
  112.                                                    }
  113.                    time--;
  114.                                                                          if(time==0)
  115.                                                                             {
  116.                                                                                TR1 = 0;
  117.                                                                                werbg2=1;
  118.                                                                             }
  119.                }
  120.                               else Num++;
  121.                    }
  122. }



  123. void Display(void)
  124. {
  125.         unsigned char  b3,b4;
  126.                 b3=time/10;
  127.                 b4=time%10;      
  128.           P0=table[b3];
  129.           SMG3=0;                                                         
  130.           delayms(1);
  131.           SMG3=1;

  132.           P0=table[b4];
  133.     SMG4=0;
  134.     delayms(1);                                                
  135.     SMG4=1;
  136. }
  137. void main()
  138. {
  139.           T0_Init();
  140.                 while(1)
  141.                 {
  142.                           KeyScan();
  143.             
  144.                                 TrunMotor(20*1);
  145.                 }
  146. }


復制代碼

回復

使用道具 舉報

ID:161164 發表于 2022-4-8 13:28 | 顯示全部樓層

不是~
Display()內不要有delay
加個靜態變量static bit i = 0;
if(i)
{
顯示個位
}else{
顯示十位
}
i= !i;//取反
回復

使用道具 舉報

ID:123289 發表于 2022-4-8 15:46 | 顯示全部樓層
估計延時程序是用DELAY()硬做的。
改一下,延時用中斷做,或許就OK了。
回復

使用道具 舉報

ID:516928 發表于 2022-4-8 19:27 | 顯示全部樓層
lkc8210 發表于 2022-4-8 13:28
不是~
Display()內不要有delay
加個靜態變量static bit i = 0;

好的,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久久99久久国产片鸭王 | 国产视频中文字幕在线观看 | 国产成人福利视频 | 欧美精品一二三 | 欧美日韩在线一区 | 嫩草视频免费 | 人人人人干 | 国产激情在线观看视频 | 久久69精品久久久久久久电影好 | 国产精品视频一二三区 | 永久看片 | 久久久久久久久久久一区二区 | 狠狠色综合网站久久久久久久 | 成人免费网视频 | 亚洲日本国产 | 免费在线一区二区三区 | 91婷婷韩国欧美一区二区 | 久久伊人操 | 久久久久久国产精品 | 精品日韩一区 | 91精品久久久 | 国产1区2区3区 | 国产欧美一区二区三区另类精品 | 免费av在线| 干干干日日日 | 91视频大全 | 黄色片免费在线观看 | av中文字幕在线观看 | 亚洲国产一区二区视频 | 久久久久久99 | 欧美日韩亚洲三区 | 天天宗合网 | 亚洲码欧美码一区二区三区 | 天天操天天拍 | 亚洲成av人片在线观看无码 | 国产一区二区免费 | 亚洲精品一二三区 | 超碰在线亚洲 | 中文字幕91av | 精品国产一区二区三区在线观看 | 正在播放国产精品 |