欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 二個(gè)很菜的單片機(jī)中斷延時(shí)計(jì)數(shù)問題請(qǐng)高手指教修正 [打印本頁(yè)]

作者: xmcai    時(shí)間: 2020-4-8 20:21
標(biāo)題: 二個(gè)很菜的單片機(jī)中斷延時(shí)計(jì)數(shù)問題請(qǐng)高手指教修正
在一段中斷計(jì)數(shù)延時(shí)的單片機(jī)程序設(shè)計(jì)中,被二個(gè)很菜的問題困擾著,請(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í)行不了,繼電器始終不接通,不知問題出在哪?請(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;

                   }


作者: hujj    時(shí)間: 2020-4-8 22:29
既然項(xiàng)目最小的計(jì)時(shí)單位是5分鐘,為什么不設(shè)置一個(gè)5分鐘的變量,每隔5分鐘這個(gè)變量增1,這樣整個(gè)處理過(guò)程應(yīng)該會(huì)簡(jiǎn)化很多。
作者: f556    時(shí)間: 2020-4-9 01:30
1、把主頻分頻降低,據(jù)各種MCU,有128分頻,設(shè)寄存器就行了
2、用一個(gè)變量計(jì)中斷次數(shù),不行設(shè)個(gè)unsigned long變量,幾個(gè)小時(shí)不成問題
作者: wulin    時(shí)間: 2020-4-9 08:12
給你一個(gè)示例,定時(shí)精度取決于晶振精度。未經(jīng)實(shí)物驗(yàn)證,只是供參考。如果加上數(shù)碼管顯示和進(jìn)一步優(yōu)化可以做成倒計(jì)時(shí)顯示并使計(jì)時(shí)誤差控制在1秒內(nèi)。
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key=P1^0;
  5. sbit LED=P1^6;
  6. sbit OUT=P1^7;

  7. uchar Cnt50ms=0;sec=0;//50毫秒、秒變量
  8. uint min=0;//分變量
  9. bit flag_5=0;//計(jì)時(shí)標(biāo)志

  10. void Timer0Init()        //50毫秒@12.000MHz
  11. {
  12.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  13.         TL0 = 0xB0;                //設(shè)置定時(shí)初值
  14.         TH0 = 0x3C;                //設(shè)置定時(shí)初值
  15.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  16.         EA = 1;                //開總中斷
  17.         ET0= 1;                //開定時(shí)器0中斷
  18. }
  19. void keyscan()
  20. {
  21.         static bit key_sign=0;//按鍵自鎖標(biāo)志變量
  22.         static uchar count=0;  //消抖計(jì)數(shù)變量               
  23.         if(!key)
  24.         {
  25.                 if(++count>=100 && key_sign==0)
  26.                 {
  27.                         key_sign=1;//自鎖
  28.                         flag_5=~flag_5;//取反
  29.                         if(flag_5==0)
  30.                                 LED=1;//燈熄 定時(shí)器停止工作
  31.                         else
  32.                                 LED=0;//燈亮 定時(shí)器工作中
  33.                         //清0 為重新計(jì)時(shí)準(zhǔn)備
  34.                         Cnt50ms=0;
  35.                         sec=0;
  36.                         min=0;
  37.                 }
  38.         }
  39.         else//松手
  40.         {
  41.                 count=0;//消抖計(jì)數(shù)變量清0
  42.                 key_sign=0;//自鎖標(biāo)志清0
  43.         }
  44. }

  45. void main()
  46. {
  47.         OUT=0;                 //初始化輸出端口
  48.         Timer0Init();//初始化定時(shí)器
  49.         while(1)
  50.         {
  51.                 keyscan();//按鍵掃描
  52.         }
  53. }
  54. /**************中斷服務(wù)程序*****************/
  55. void timer0() interrupt        1
  56. {
  57.         TL0 = 0xB0;                //重裝定時(shí)初值
  58.         TH0 = 0x3C;                //重裝定時(shí)初值

  59.         if(flag_5==1)
  60.         {
  61.                 Cnt50ms++;                                        //中斷變量Cnt50ms自+1
  62.                 if(Cnt50ms>=20)                                //1秒
  63.                 {
  64.                         Cnt50ms=0;
  65.                         sec++;
  66.                         if(sec>=60)                                //1分
  67.                         {
  68.                                 sec=0;                                //秒計(jì)數(shù)
  69.                                 min++;
  70.                         }
  71.                 }
  72.                 if(min<480)                                        //8小時(shí)
  73.                         OUT=0;       
  74.                 if(min>=480||min<485)        //8小時(shí)與8小時(shí)零5分之間
  75.                         OUT=1;       
  76.                 if(min>=485)                                //8小時(shí)零5分時(shí)間到
  77.                 {//全部清0
  78.                         OUT=0;       
  79.                         Cnt50ms=0;
  80.                         sec=0;
  81.                         min=0;
  82. //                        flag_5=0;//不重復(fù)循環(huán)
  83.                 }
  84.         }
  85. }
復(fù)制代碼

作者: 黃youhui    時(shí)間: 2020-4-9 08:46
看著代碼好費(fèi)勁啊,你就不能將你的temp_5++   temp_6++封裝個(gè)函數(shù)調(diào)用一下嗎
作者: xmcai    時(shí)間: 2020-4-9 12:15
wulin 發(fā)表于 2020-4-9 08:12
給你一個(gè)示例,定時(shí)精度取決于晶振精度。未經(jīng)實(shí)物驗(yàn)證,只是供參考。如果加上數(shù)碼管顯示和進(jìn)一步優(yōu)化可以做 ...

非常感謝wulin師傅的無(wú)私指導(dǎo),您已多次指導(dǎo),受您啟發(fā),多次受益,均已成功,謝謝您!!
作者: game灬boy    時(shí)間: 2020-4-9 13:14
你的測(cè)試5分鐘可行對(duì)吧;然后在5分鐘的基礎(chǔ)上再定義1個(gè)變量    分鐘m;
假設(shè)你的5分鐘技數(shù)count=50時(shí)為5分鐘
8小時(shí)60*8=480分鐘480/5=96
m=96時(shí);繼電器使能;m=97時(shí);繼電器關(guān)閉使能;
if (count==50)
{
m++;
if(m==96)
使能flag=1;
if(m==97)
{
  使能flag=0;
  m=0;
}
count=0;

}


作者: xmcai    時(shí)間: 2020-4-9 21:38
game灬boy 發(fā)表于 2020-4-9 13:14
你的測(cè)試5分鐘可行對(duì)吧;然后在5分鐘的基礎(chǔ)上再定義1個(gè)變量    分鐘m;
假設(shè)你的5分鐘技數(shù)count=50時(shí)為5分 ...

謝謝指導(dǎo)!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1