请教一个51单片机定时时间差问题

2019-03-24 18:50发布

我用STC12LE5A32S2做了个东西。

用定时器0产生定时时间。
定时器是这样的:
void Time0(void) interrupt 1
{   
ET0 = 0; //定时器0中断关
TH0=0xE5;//(65536-n*FOSC/12/1000)/256;//n=10ms 这里采用8M晶振计算的
TL0=0xF5;//(65536-n*FOSC/12/1000)%256;

if(run_time_flag==1) run_time--;
if(parameter[1]==1) L1 = 0;//L1指示灯,用于调试
else L1 = 1;

ET0 = 1;     //定时器0中断打开

}

这里产生10MS定时。一直开着的。
在run_time_flag==1时进入运行时间递减。



主程序里面是这样的。

在SL1按下后,进入自动运行状态。
自动运行工作是这样的,
RUN=0就是运行,硬件电路是个继电器电路。硬件电路是没有问题的。
运行时间是在parameter[3]变量中存着。
然后发送一串按键数据出去:
“”“”“”“”“”“”“”“”“”“”“”“
  Send_Data(0);
”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“
以上数据发送出去电机在RUN=0动作继电器后就会反转。

parameter[1] 是个电机运行状态记录变量,0为正转,1为反转;

主程序如下:

     if(SL1 == 0)
    {
     delay(20);
     if(SL1 == 0)
     {
      Show_flag = 1;
      while(SL1 == 0);//
      Auto_Flag=1;
      Break_off_SL2 = 0;//暂停后自动运行取消标志   1:为取消
     }
    }

   if(Auto_Flag == 1)
   {
    if(parameter[1]==1) Send_Data(0);
    parameter[1] = 0;//启动  正转  存数据
    run_time = parameter[3];//forward_run_time;
    run_time_flag = 1;//开始计时
    run = 0;run1 = 0;
    while (run_time>0) //执行自动进刀 这里的80也为了给下面电机换向时的转动时间补
    {      
     }
    }
   
    if(Break_off_SL2==0)
    {
     run_time_flag = 0;
       run = 1;//停止
       run1 = 1;
     delay(10); //电机停下,后再发转 100ms
     if(parameter[1]==0) Send_Data(0);
     parameter[1] = 1;//启动  反转 数据保存
     run_time = parameter[4];//backward_run_time;
     run_time_flag = 1;
     run = 0;
     run1 = 0;
     while (run_time>0)
     {
      }
    }
    run_time_flag = 0;
    run = 1;//停止
    run1 = 1;
    Auto_Flag = 0;//自动运行结束
    if(parameter[1]==1) Send_Data(0);
    parameter[1] = 0;//正转 数据保存
    Write_Chanshu();//写EEPROM参数,保存数据


问题是出现在:
运行是可以。
我设定正转运行个5S;反转运行个5S;中间有个100MS电机停机时间

我测试过,可以正常工作下下

我测试运行时间,每按下SL1后,电机会运行,并中间也会停机,然后再反转运行。

就是在三次到五次中间会出现个一次运行时间不是5S,而3S左右。
其他次数测试都是正常工作,运行时间也都正常,正转5S,反转5S。

测试过二三十次都是这样。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。