在一段中斷計(jì)數(shù)延時(shí)的單片機(jī)程序設(shè)計(jì)中,被二個(gè)很菜的問(wèn)題困擾著,請(qǐng)高手師傅指教改正。
1、 利用中斷計(jì)數(shù)設(shè)計(jì)一段8小時(shí)的長(zhǎng)時(shí)間延時(shí)程序,計(jì)數(shù)滿8小時(shí)后繼電器自動(dòng)接通工作5分鐘,然后重新進(jìn)入8小時(shí)延時(shí)程序,如此循環(huán),直至外部打斷使flag_5計(jì)時(shí)標(biāo)志為0止。測(cè)試時(shí),每個(gè)計(jì)數(shù)節(jié)用(20*60)*2時(shí)(即2分鐘),9節(jié)共18分鐘,可以正常接通繼電器,然后5分鐘后斷開,程序正常執(zhí)行。但當(dāng)每個(gè)計(jì)數(shù)節(jié)用(20*60)*54時(shí)(即54分鐘,最大也只能設(shè)定為54分鐘,因?yàn)樽畲笥?jì)數(shù)為65536),按理應(yīng)該在8.1小時(shí)后繼電器接通,但實(shí)際卻執(zhí)行不了,繼電器始終不接通,不知問(wèn)題出在哪?請(qǐng)高手指教改正。
if( flag_5==1 ) //如果計(jì)時(shí)標(biāo)志5為1,進(jìn)入下面8小時(shí)延時(shí)
{
temp_5++; //中斷計(jì)數(shù)變時(shí)5自+1
if(temp_5>=(20*60)*54) //(20*60)為延時(shí)1分鐘基數(shù),*54可延時(shí)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; //上面計(jì)數(shù)延時(shí)滿山8小時(shí),繼電器接通
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) //如果計(jì)時(shí)標(biāo)位flag_6=1
{
temp_6++; //中斷變量temp_6+1
if(temp_6>=(20*60)*54) //(20*60)為延時(shí)1分鐘,*5可延時(shí)5分鐘
{
Relay=0; //繼電器斷開
temp_6=0;
flag_6=0; //計(jì)時(shí)標(biāo)志6清零
flag_5=1; //計(jì)時(shí)標(biāo)志5為1,重新進(jìn)入上面的循環(huán)
}
}
2、用一段do-while的循環(huán)程序替代上面的九節(jié)計(jì)數(shù)環(huán)節(jié),卻延時(shí)不了,錯(cuò)在何處,也請(qǐng)高手師傅指教一下。
if( flag_5==1) //如果計(jì)數(shù)標(biāo)志為1,進(jìn)入下面的循環(huán)環(huán)節(jié)
{
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;
}
|