在一段中断计数延时的单片机程序设计中,被二个很菜的问题困扰着,请高手师傅指教改正。
1、 利用中断计数设计一段8小时的长时间延时程序,计数满8小时后继电器自动接通工作5分钟,然后重新进入8小时延时程序,如此循环,直至外部打断使flag_5计时标志为0止。测试时,每个计数节用(20*60)*2时(即2分钟),9节共18分钟,可以正常接通继电器,然后5分钟后断开,程序正常执行。但当每个计数节用(20*60)*54时(即54分钟,最大也只能设定为54分钟,因为最大计数为65536),按理应该在8.1小时后继电器接通,但实际却执行不了,继电器始终不接通,不知问题出在哪?请高手指教改正。
if( flag_5==1 ) //如果计时标志5为1,进入下面8小时延时
{
temp_5++; //中断计数变时5自+1
if(temp_5>=(20*60)*54) //(20*60)为延时1分钟基数,*54可延时54分钟
{
temp_6++;
if(temp_6>=(20*60)*54)
{
temp_7++;
if(temp_7>=(20*60)*54)
{
temp_8++;
if(temp_8>=(20*60)*54)
{
temp_9++;
if(temp_9>=(20*60)*54)
{
temp_10++;
if(temp_10>=(20*60)*54)
{
temp_11++;
if(temp_11>=(20*60)*54)
{
temp_12++;
if(temp_12>=(20*60)*54)
{
temp_13++;
if(temp_13>=(20*60)*54)
{
Relay=1; //上面计数延时满山8小时,继电器接通
temp_4=0;
temp_5=0;
temp_6=0;
temp_7=0;
temp_8=0;
temp_9=0;
temp_10=0;
temp_11=0;
temp_12=0;
temp_13=0;
flag_5=0;
flag_6=1;
}
}
}
}
}
}
}
}
}
}
if(flag_6==1) //如果计时标位flag_6=1
{
temp_6++; //中断变量temp_6+1
if(temp_6>=(20*60)*54) //(20*60)为延时1分钟,*5可延时5分钟
{
Relay=0; //继电器断开
temp_6=0;
flag_6=0; //计时标志6清零
flag_5=1; //计时标志5为1,重新进入上面的循环
}
}
2、用一段do-while的循环程序替代上面的九节计数环节,却延时不了,错在何处,也请高手师傅指教一下。
if( flag_5==1) //如果计数标志为1,进入下面的循环环节
{
temp_5=0;
temp_6=0;
do
{
temp_5++;
if(temp_5>=(20*60)*54)
{
temp_5=0;
temp_6=temp_6+1;
}
}
while(temp_6<=9); }
if(temp_6>=9)
{
Relay0=1; //继电器接通
flag_5=0;
flag_6=1;
}
|