找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 997|回复: 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 单片机教程网

快速回复 返回顶部 返回列表