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

標題: 單片機點燈程序,按鍵進入中斷后,就一直反復執(zhí)行,跳不出來了 [打印本頁]

作者: 三極管一樣的人    時間: 2023-11-23 08:55
標題: 單片機點燈程序,按鍵進入中斷后,就一直反復執(zhí)行,跳不出來了
如下,邏輯上感覺沒錯啊, 10ms ,中斷一次,0.5S燈閃一次, temp+1,累計到時間,判斷與設定的一樣補,一樣執(zhí)行,不一樣,判斷下一個,都不一樣,繼續(xù)等待 ,找不到問題在哪了,求大佬來了

單片機源程序如下:
#include <STC15.H>  

sbit LED1 = P1^0;  
sbit LED2 = P1^1;  
sbit LED3 = P1^2;  
sbit LED4 = P1^3;  
sbit KEY1 = P3^2;  
sbit KEY2 = P3^3;
sbit Pin2out_H = P1^4;        
sbit Pin4out_H = P1^5;
sbit Pin3out_Delay5s_H = P3^6;        
sbit Beer =        P3^7;


unsigned char key_count = 0; //按鍵次數(shù),初始值為1  
unsigned char count_status = 0; //倒計時狀態(tài),初始值為1,表示倒計時未開始  
unsigned char count_select = 0; //倒計時選擇,初始值為1,表示選擇1分鐘倒計時  
unsigned int count = 0; //計數(shù)器,初始值為0,表示倒計時未開始   
unsigned int temp = 0; //計數(shù)器值暫存,初始值為0, COUNT計到1000,Ttemp 加1

void delay(unsigned int time) // 延時函數(shù)  
{  
    unsigned int i,j;  
    for(i=0;i<time;i++)  
        for(j=0;j<1275;j++);  
}  


void key1_ISR() interrupt 0 //按鍵1中斷服務程序,中斷號是0  
{  
    if(key_count < 3)
                { //如果按鍵次數(shù)小于3次  
                key_count++; //按鍵次數(shù)加1  
                if(key_count == 1)
                                { //如果按了一次按鍵
                                LED1 = 0; LED2 = 1; LED3 = 1;
                    count_select = 2; //選擇2分鐘倒計時  
                    //count = 120; //設置倒計時為2分鐘  
                        }   
                else if(key_count == 2)
                                { //如果按了兩次按鍵
                                LED1 = 1; LED2 = 0; LED3 = 1;
                    count_select = 3; //選擇3分鐘倒計時  
                    //count = 180; //設置倒計時為3分鐘  
                        }   
                else if(key_count == 3)
                                { //如果按了三次按鍵  
                                LED1 = 1; LED2 = 1; LED3 = 0;
                    count_select = 1; //重置倒計時選擇為1分鐘  
                    //count = 60; //設置倒計時為1分鐘  
                        }  
            }  
    else
                { //如果按鍵次數(shù)超過3次,重置為1次  
        key_count = 1; //重置按鍵次數(shù)為1次
        LED1 = 0; LED2 = 1; LED3 = 1;
            }  
    KEY1 = 1; //按鍵消抖,防止誤操作,這個可以在主循環(huán)里面加消抖邏輯或者使用硬件去抖動。具體做法根據(jù)你的硬件實現(xiàn)進行編寫。  
}  

// KEY2中斷服務程序,用于處理倒計時邏輯


void key2_ISR() interrupt 2  
{   
        AUXR |= 0x10;                        //定時器2開始計時
        IE2 |= 0x04;                        //定時器2允許中斷
        count_status = 1;                //表示計時開始

}
void Timer2_ISR() interrupt 12  
{        
        
        Pin2out_H = 1;        //先輸出低電平
        Pin4out_H = 0;
        
        count++;        //10ms加1次
        if (count == 50) //加到500ms,即0.5S時
                {
                        LED4= ~LED4; //閃燈
                        temp++;  //temp 加1
                        count =0;  // 5次清零一次,重新累計
                }

}
void main()   
{  
        //M1  M0
                //0   0             準雙向口--51類型
                //0   1             推挽輸出--適合 輸出真正的高低電平
                //1   0             高阻輸入-- 只能作為  輸入:io口被懸空,沒有上拉也沒有下拉,完全由外部電平驅動
                //1   1             開漏輸出--適合線與


        //P1
        //P10,P11,P12,P13,P14,P15設置為推挽輸出  
        P1M1 = 0x00;   //0000 0000
        P1M0 = 0x1F;   //0001 1111

        LED1=1;                        //先關燈
        LED2=1;
        LED3=1;
        LED4=1;
        
        
        //P3
        //P30,P31,P32,P33,P36,P37設置為推挽輸出
        P3M1 = 0x00; //0000 0000
        P3M0 = 0xCF; //1100 1111

        KEY1 = 1;  //按鍵先拉高,
        KEY2 = 1;
        Pin2out_H = 0;        //先輸出低電平
        Pin4out_H = 1;
        Pin3out_Delay5s_H = 1; //先輸出低電平
        Beer = 0;                          //先輸出低電平
        
        //10毫秒@12MHz
        AUXR &= 0xFB;                        //定時器時鐘12T模式
        T2L = 0xF0;                                //設置定時初始值
        T2H = 0xD8;                                //設置定時初始值
        AUXR |= 0x00;
        //AUXR |= 0x10;                        //定時器2開始計時
        
         
          EA = 1; //開啟總中斷  
        //IE2 |= 0x04;                        //使能定時器2中斷
        IE2 |= 0x00;                        //關閉定時器2中斷
         
          IT0 = 1; //設置INT0的中斷類型 為下降沿觸發(fā)
          EX0 = 1; //開啟外部中斷0 P3.2
         
          IT1 = 1; //設置INT1的中斷類型 為下降沿觸發(fā)
          EX1 = 1; //開啟外部中斷1 P3.3

        LED1 = 0;
        count_select = 1;
        
       while (1)
                   { // 主循環(huán)
                        if (temp < 360 )  //如果時間小于三分鐘
                        {
                                //temp++;  //temp 加1
                                if ((temp ==120 ) && (count_select == 1))
                                                {
                                                        IE2 |= 0x00; //關定時器2中斷
                                                        AUXR |= 0x00; //定時器2關閉計時
                                                        temp = 0;
                                                        Pin2out_H = 0;        //先輸出低電平
                                                        Pin4out_H = 1;
                                                        count_status = 0; //倒計時結束
                                                }
                                
                                else if ((temp ==240 ) && (count_select == 2))
                                                {
                                                        IE2 |= 0x00; //關定時器2中斷
                                                        AUXR |= 0x00; //定時器2關閉計時
                                                        temp = 0;
                                                        Pin2out_H = 0;        //先輸出低電平
                                                        Pin4out_H = 1;
                                                        count_status = 0; //倒計時結束
                                                }
                                else if( (temp ==360 ) && (count_select == 3))
                                                {
                                                        IE2 |= 0x00; //關定時器2中斷
                                                        AUXR |= 0x00; //定時器2關閉計時
                                                        temp = 0;
                                                        Pin2out_H = 0;        //先輸出低電平
                                                        Pin4out_H = 1;
                                                        count_status = 0; //倒計時結束
                                                }
                        }
                else  //如果大于三分鐘
                        {
                                temp = 0;
                                Pin2out_H = 0;        //先輸出低電平
                                Pin4out_H = 1;
                                count_status = 0; //倒計時結束
                        }
               
                if(count_status == 0)
                        {
                                        delay(1);
                                Pin3out_Delay5s_H = 0;
                                }
                }

}

作者: lkc8210    時間: 2023-11-23 11:17
反復執(zhí)行啥?跳不出來啥?

IE2 |= 0x00; //關定時器2中斷
AUXR |= 0x00; //定時器2關閉計時
這兩句是沒作用的




作者: tyrl800    時間: 2023-11-23 11:56
if(key_count < 3)                 { //如果按鍵次數(shù)小于3次                   key_count++; //按鍵次數(shù)加1                   if(key_count == 1)                                 { //如果按了一次按鍵                                 LED1 = 0; LED2 = 1; LED3 = 1;                     count_select = 2; //選擇2分鐘倒計時                       //count = 120; //設置倒計時為2分鐘                           }                    else if(key_count == 2)                                 { //如果按了兩次按鍵                                 LED1 = 1; LED2 = 0; LED3 = 1;                     count_select = 3; //選擇3分鐘倒計時                       //count = 180; //設置倒計時為3分鐘                           }                    else if(key_count == 3)                                 { //如果按了三次按鍵                                   LED1 = 1; LED2 = 1; LED3 = 0;                     count_select = 1; //重置倒計時選擇為1分鐘                       //count = 60; //設置倒計時為1分鐘                           }               }
作者: tyrl800    時間: 2023-11-23 12:08
邏輯錯誤
作者: 三極管一樣的人    時間: 2023-11-23 12:31
lkc8210 發(fā)表于 2023-11-23 11:17
反復執(zhí)行啥?跳不出來啥?

IE2 |= 0x00; //關定時器2中斷

就是反復執(zhí)行 LED4 0.5S閃一下 時間到了也 跳不出中斷,  就 不能執(zhí)行原先設定的倒計時時間,  比如,我上電默認是一分鐘, 按KEY2后,定時器中斷打開,0.5S燈翻一下, 原本按照邏輯應該是一分鐘后,關中斷,倒計時結束,對應引腳輸出信號。現(xiàn)在就卡在中斷里面,一直閃燈,時間到了也不停止。
作者: tyrl800    時間: 2023-11-23 12:51
else if ((temp ==240 ) && (count_select == 2))
                                                {
                                                        IE2 |= 0x00; //關定時器2中斷
                                                        AUXR |= 0x00; //定時器2關閉計時
                                                        temp = 0;
                                                        Pin2out_H = 0;        //先輸出低電平
                                                        Pin4out_H = 1;
                                                        count_status = 0; //倒計時結束
                                                }
                                else if( (temp ==360 ) && (count_select == 3))
                                                {
                                                        IE2 |= 0x00; //關定時器2中斷
                                                        AUXR |= 0x00; //定時器2關閉計時
                                                        temp = 0;
                                                        Pin2out_H = 0;        //先輸出低電平
                                                        Pin4out_H = 1;
                                                        count_status = 0; //倒計時結束
                                                } 這些語句都不會執(zhí)行的
作者: lkc8210    時間: 2023-11-23 14:09
三極管一樣的人 發(fā)表于 2023-11-23 12:31
就是反復執(zhí)行 LED4 0.5S閃一下 時間到了也 跳不出中斷,  就 不能執(zhí)行原先設定的倒計時時間,  比如,我 ...

原因就在于我說的那兩句
作者: 三極管一樣的人    時間: 2023-11-23 18:01
tyrl800 發(fā)表于 2023-11-23 12:08
邏輯錯誤

大佬,請指點下,哪里邏輯錯了,我實際按鍵,也可以切換燈,就是,再按K2啟動后,這時間就亂套了。
作者: 三極管一樣的人    時間: 2023-11-23 18:07
tyrl800 發(fā)表于 2023-11-23 12:51
else if ((temp ==240 ) && (count_select == 2))
              &#1 ...

   額... 我屢屢哈, 先0.5S,燈反一下,  然后,temp 存1,  累積120次,就是 60 000ms ,就是一分鐘, 然后,240次就是2分鐘,360次,就是三分鐘, 嗯, 大于3分鐘就歸零,從新存 。 這個思路沒錯吧?
作者: 三極管一樣的人    時間: 2023-11-23 18:08
lkc8210 發(fā)表于 2023-11-23 14:09
原因就在于我說的那兩句

我又看了規(guī)格書的范例, 改用了  IE2 &= ~0x04;    關掉中斷,總算可以結束倒計時了。 現(xiàn)在就是倒計時時間不對, 沒有設想的一分鐘,2分鐘,3分鐘如期實現(xiàn)
作者: tyrl800    時間: 2023-11-23 18:21
三極管一樣的人 發(fā)表于 2023-11-23 18:07
額... 我屢屢哈, 先0.5S,燈反一下,  然后,temp 存1,  累積120次,就是 60 000ms ,就是一分 ...

你temp==120時,后面temp=0; 永遠不會出現(xiàn)temp==240了
作者: lkc8210    時間: 2023-11-24 09:26
三極管一樣的人 發(fā)表于 2023-11-23 18:08
我又看了規(guī)格書的范例, 改用了  IE2 &= ~0x04;    關掉中斷,總算可以結束倒計時了。 現(xiàn)在就是倒計時時 ...

當一變量會在主循環(huán)判斷并在中斷里更新時
該變量應使用8位數(shù)據(jù)類型,如char,uchar
原因在我的貼子里有討論
http://m.zg4o1577.cn/bbs/dpj-213547-1.html



作者: 三極管一樣的人    時間: 2023-11-24 10:32
tyrl800 發(fā)表于 2023-11-23 18:21
你temp==120時,后面temp=0; 永遠不會出現(xiàn)temp==240了

額,我是這樣想的,   我這temp 一直加加, 加到temp==120 滿足時候,同時再去判斷 是否還要 同時滿足 count_select == 1  ,才會進去執(zhí)行,執(zhí)行后,那就歸零。也就是停止計時中斷了。
相當于要進行下一輪按鍵選擇,和開始
如果不滿足 就是去判斷下一個條件, ,如果都不滿足,這個是temp 已經(jīng)加到 360以上了,
那就歸零,再重頭計
(經(jīng)過改了關定時器2的語句)
現(xiàn)在最新實際情況是,這時間亂倒計。第二輪還不停。

作者: 三極管一樣的人    時間: 2023-11-24 10:52
lkc8210 發(fā)表于 2023-11-24 09:26
當一變量會在主循環(huán)判斷并在中斷里更新時
該變量應使用8位數(shù)據(jù)類型,如char,uchar
原因在我的貼子里有 ...

學習了 ,原來還有這種細節(jié)問題。而且,帖子提到的那個前輩,看那段話風格,眼熟,一查果然是江湖人稱鴻哥的早期經(jīng)驗連載貼




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日本精品国产 | 亚洲一区久久 | 又色又爽又黄gif动态图 | 久久综合伊人 | 免费毛片网站 | 中文字幕一区二区三区在线观看 | 超碰91在线 | 欧美性色网| 法国极品成人h版 | 夜夜夜夜操 | 亚洲7777| 欧美精品第一页 | 国产黄网| 亚洲蜜桃av| 成人在线网址 | 亚洲小视频在线观看 | 欧美日韩免费在线观看 | 在线观看免费毛片 | 秋霞一区 | 午夜影院在线观看 | 欧美顶级黄色大片免费 | 69堂视频| 免费特级毛片 | 中文字幕免费在线观看 | 日本黄色免费 | 国产精品久久午夜夜伦鲁鲁 | 99热99re6国产在线播放 | 亚洲在线免费视频 | 中文字幕精品一区久久久久 | 99视频在线精品免费观看2 | 人人爱人人草 | 欧美日韩小视频 | 在线性视频 | cao视频| 青青草久久 | 夜夜嗨av一区二区三区网页 | 日韩av在线免费看 | 毛片网站在线观看 | 国产高清91 | a级片网址 | 亚洲视频精品 |