我用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。
测试过二三十次都是这样。
|