久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1217|回復: 5
打印 上一主題 下一主題
收起左側

單片機延時的時候中斷不起作用?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1076567 發表于 2024-5-20 15:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機用的是stc15f104w,在主程序的時候中斷可以起作用,能夠控制led的亮滅,但是在延時的時候中斷就不起作用,無法跳出延時,只能等延時結束才可以關閉led,但是不知道哪里錯了,難道是在延時的時候不能執行中斷嗎,有沒有大佬幫忙看看
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        bit  seyFlag=0;

  void DELAY_s (unsigned int t)
         {
            unsigned int a,b,c,d;
            while ( --t != 0&&seyFlag == 0 )
                    {


                                for (a=0;a<=60000;a++);
                                for (b=0;b<=60000;b++);
                                for (c=0;c<=60000;c++);
                                for (d=0;d<=60000;d++);

                       }
       }


  void DELAY_MS (unsigned int t)
         {
             unsigned int a;
             while ( --t != 0 )   
                 {                                
                    for (a=0;a<=600;a++);
                 }
         }


        void Int1_Routine(void) interrupt 2
                        {
                          seyFlag=1; //s1按下執行中斷
                        }

        void main()
        {
                        IT1 = 1;
                        EX1 = 1;
                        EA = 1;
           
                while(1)
                {
                  if(seyFlag        ==        1)
                        {        
                              DELAY_MS(10);
                              led= !led;
                               seyFlag = 0;
                                if (k1==0)
                           {
                                 if (k2==1)
                                        {
                                                if (k3==1)
                                                 {
                                                         DELAY_s(5);
                                                         led=!led;  //k1鍵撥下的時候
                                                        }
                                                
                                                else if(k3==0)
                                            {
                                                        DELAY_s(10);
                                                         led=!led;//k1、k3鍵撥下的時候
                                                        }
                                       
                                        }
                                }
                        }
                }
        }
后面給我們總工看了說是延時函數里的標志位沒有置0,延時之后會重新進主函數里又取反一次,后面加了置0就可以了,但是用這個時間不太準確
            void DELAY_5s(int t)
                {
                        unsigned long int a,b,c,d;
                        a=60000*t;
                        b=60000*t;
                        c=60000*t;
                        d=60000*t;
                        while(1)
                        {
                                a--;
                                b--;
                                c--;
                                d--;
                                if(d==0)
                                {
                                led        = !led;
                                  return;
                                }
                                if(seyFlag==1)
                                {
                                        led        = !led;
                                        seyFlag        =        0;
                                        return;
                                }
                        }
                }



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:192020 發表于 2024-5-20 18:30 | 只看該作者
你的while(1)循環一次就要15秒,進中斷只控制變量seyFlag=1;那你在15秒內進中斷后,只能等下一次循環才能執行 led= !led;意思是變量seyFlag是按中斷實時變化的,但是LED在主循環是15秒后才根據seyFlag變量來變化的。建議你還是用定時器做延時,能做到肉眼實時控制,程序也好理解點
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-5-20 18:42 | 只看該作者
當進入delay_s時,即使你中斷里面seyflag=1,也不能if(seyflag==1)啊。必須后面的delay都完成,主循環再次重頭開始時才有if(seyflag==1)啊
回復

使用道具 舉報

地板
ID:1076567 發表于 2024-5-21 09:20 | 只看該作者
本帖最后由 Dokkis 于 2024-5-21 10:32 編輯
qq475878026 發表于 2024-5-20 18:30
你的while(1)循環一次就要15秒,進中斷只控制變量seyFlag=1;那你在15秒內進中斷后,只能等下一次循環才能 ...

但是它不是要判斷按鍵按下才會進循環的嗎,而且我把seyFlag置0了,它不會一直循環的。之前按網上的例程寫過定時器,但是不起作用,因為不是很懂定時器的原理,就沒改,這個又比較急,所以先用這個代替一下,之后會重新學習的,感謝
回復

使用道具 舉報

5#
ID:1076567 發表于 2024-5-21 09:26 | 只看該作者
xiaobendan001 發表于 2024-5-20 18:42
當進入delay_s時,即使你中斷里面seyflag=1,也不能if(seyflag==1)啊。必須后面的delay都完成,主循環再次 ...

我后面也把那個延時改了一下,讓它每次都判斷seyFlag是否等于1,中斷完了之后不是會返回還沒結束的延時嗎,然后延時循環一輪后就會判斷seyFlag是否等于1,等于1就跳出來了,然后給我們工程師看了說是延時循環里的seyFlag沒置0,改了之后就可以了,感謝
回復

使用道具 舉報

6#
ID:1121801 發表于 2024-5-22 10:22 | 只看該作者
很多新手對定時和中斷都會有這樣的問題,學習了
回復

使用道具 舉報

7#
ID:161164 發表于 2024-5-22 10:45 | 只看該作者
  1. #include <STC15.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit s1 = P3^3;
  6. sbit k1 = P3^2;
  7. sbit k2 = P3^1;
  8. sbit k3 = P3^0;
  9. sbit led = P3^5;
  10. bit  seyFlag=0;

  11. void DELAY_MS (unsigned int t)
  12. {
  13.         unsigned int a;
  14.         while ( --t != 0 )
  15.         {
  16.                 for (a=0; a<=600; a++);
  17.         }
  18. }

  19. uint Delay_Cnt = 0;
  20. bit Key_Lock = 0;
  21. void main()
  22. {
  23.         while(1)
  24.         {
  25.                 //==========按鍵掃苗================
  26.                 if(s1==0 && Key_Lock==1)
  27.                 {
  28.                         seyFlag = 1;
  29.                 }               
  30.                 Key_Lock = s1;
  31.                 //==================================
  32.                
  33.                 //==========按鍵處理================
  34.                 if(seyFlag == 1)
  35.                 {
  36.                         seyFlag = 0;
  37.                         led= !led;
  38.                         if (k1==0)
  39.                         {
  40.                                 if (k2==1)
  41.                                 {
  42.                                         if (k3==1)
  43.                                         {
  44.                                                 Delay_Cnt = 500;
  45.                                         }
  46.                                         else if(k3==0)
  47.                                         {
  48.                                                 Delay_Cnt = 1000;
  49.                                         }
  50.                                 }
  51.                         }
  52.                 }
  53.                 //==================================
  54.                
  55.                 //==========Led亮滅延時================
  56.                 if(Delay_Cnt>0)
  57.                 {
  58.                         Delay_Cnt--;
  59.                         if(Delay_Cnt==0)
  60.                         {
  61.                                 led= !led;
  62.                         }
  63.                 }
  64.                 //==================================
  65.                 DELAY_MS(10);
  66.         }
  67. }
復制代碼

按鍵不用中斷,不用長時間阻塞式延時
以下代碼,參考一下

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女视频黄色片 | 亚洲一区二区三区四区五区午夜 | 久久久青草婷婷精品综合日韩 | 亚洲精品一区二区三区中文字幕 | 国产高清视频在线播放 | 久久性色 | 亚洲性爰| 亚洲成人一区 | 午夜免费网 | 人人干人人草 | 最新国产精品视频 | 99热播放| 国产在线97 | 九九热精品免费 | 久久99精品久久久 | 精品1区| 免费在线成人 | 亚洲综合色婷婷 | 一级a性色生活片久久毛片 午夜精品在线观看 | 毛片入口 | 欧洲一区在线观看 | 欧美福利网站 | 天天操夜夜操免费视频 | 欧美日韩久久久 | 精品一区二区三区在线观看 | 人人干97| 亚洲天堂一区 | 成人av电影天堂 | 一区二区三区在线播放 | 日韩中文字幕久久 | 色婷婷一区 | 一区在线视频 | 日本不卡高字幕在线2019 | 亚洲女人天堂成人av在线 | 男女又爽又黄视频 | 天天爽天天操 | 一区二区三区四区电影视频在线观看 | av电影一区二区 | 九九热九九 | 成人免费福利 | av在线免费播放 |