在一段中斷計數延時的單片機程序設計中,被二個很菜的問題困擾著,請高手師傅指教改正。
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;
}
|