找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3607|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)儲(chǔ)物箱檢測(cè)程序中斷嵌套程序 請(qǐng)高手幫改一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:280226 發(fā)表于 2018-2-12 22:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
寫(xiě)了一個(gè)儲(chǔ)物箱檢測(cè)程序,思路是當(dāng)物品放置時(shí),壓下微動(dòng)開(kāi)關(guān),進(jìn)入中斷程序,繼電器接通設(shè)定的時(shí)間;這部分程序測(cè)試正常,但現(xiàn)在有個(gè)問(wèn)題搞不定,就是當(dāng)進(jìn)入中斷程序后,如果拿開(kāi)物品,中斷程序還得繼續(xù)完成,如何在中斷程序中嵌入一個(gè)判斷程序,在K開(kāi)關(guān)復(fù)位后自動(dòng)退出中斷程序回到主程序?謝謝!
  1. #include <reg52.h>
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. unsigned int s;
  5. sbit k=P1^0;          //微動(dòng)開(kāi)關(guān)
  6. sbit Relay1 =P0^0;   //繼電器端口
  7. sbit Relay2 =P0^1;
  8. bit  fir=0;           //物品存在標(biāo)志位
  9. /***********************************************
  10. 定時(shí)函數(shù)
  11. ************************************************/
  12. void Timer0Init(void)
  13. {
  14.          
  15.          TMOD = 0x01;            
  16.          TL0 = 0xB0;               
  17.          TH0 = 0x3C;               
  18.          EA=1;
  19.          ET0=1;
  20.          TR0 = 1;               
  21. }
  22. /***********************************************
  23. 主函數(shù)
  24. ************************************************/
  25. int main()
  26. {
  27.          Relay1=1;
  28.         Relay2=1;
  29.         Timer0Init();
  30.          while(1)
  31. {  
  32.   if((k==1)&&(fir==0))
  33.   {
  34.        TR0=1;                 //有物品時(shí)開(kāi)始計(jì)時(shí)
  35.        Relay1=0;              //繼電器通電
  36.        Relay2=0;  
  37.                  }
  38.         }
  39. }
  40. /***********************************************
  41. 中斷函數(shù)
  42. ************************************************/
  43. void Timer0() interrupt 1   
  44. {
  45.         u16 temp;
  46.         s=1;      //改變S可改變定時(shí)時(shí)間
  47.          TL0 = 0xB0;               
  48.          TH0 = 0x3C;               
  49.          temp++;
  50.          if(temp==(20*60)*s)      
  51.          {
  52.                  temp=0;
  53.                  Relay1=1;   //繼電器斷電
  54.                  Relay2=1;
  55.                  fir=1;        //標(biāo)志位置1
  56.            }
  57. }
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:273292 發(fā)表于 2018-2-13 08:57 | 只看該作者
你這箱子壓下去的開(kāi)關(guān)本來(lái)就是中斷觸發(fā)的信號(hào),如這個(gè)信號(hào)沒(méi)了自然就沒(méi)法繼續(xù)在中斷呆著了,不知道有沒(méi)有高手
回復(fù)

使用道具 舉報(bào)

板凳
ID:282439 發(fā)表于 2018-2-13 09:09 | 只看該作者
你需要將TEMP聲明為全局變量。因?yàn)門(mén)IMER0是中斷程序。退出后不能保持TEMP的數(shù)值了。
回復(fù)

使用道具 舉報(bào)

地板
ID:280226 發(fā)表于 2018-2-13 09:45 | 只看該作者
希望高手能直接在程序中幫修改一下,這樣對(duì)照就能知道程序缺陷在哪了,謝謝!
回復(fù)

使用道具 舉報(bào)

5#
ID:280226 發(fā)表于 2018-2-13 10:31 | 只看該作者
第一個(gè)程序有個(gè)缺陷,就是把物品拿開(kāi)后再進(jìn)入,因?yàn)槲锲窐?biāo)志位為1,就再進(jìn)不了中斷程序,F(xiàn)又把程序完善了一下,在物品拿開(kāi)后標(biāo)志位置0,這樣在物品離開(kāi)再進(jìn)入時(shí)就可以再進(jìn)入中斷程序了。現(xiàn)在就是在中斷過(guò)程中如果物品拿開(kāi),無(wú)法立即退出中斷程序,這個(gè)求教高手。
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
unsigned int s;
sbit k=P1^0;          //微動(dòng)開(kāi)關(guān)
sbit Relay1 =P0^0;   //繼電器端口
sbit Relay2 =P0^1;
bit  fir=0;           //物品存在標(biāo)志位
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init(void)
{
         
         TMOD = 0x01;            
         TL0 = 0xB0;               
         TH0 = 0x3C;               
         EA=1;
         ET0=1;
         TR0 = 1;               
}
/***********************************************
主函數(shù)
************************************************/
int main()
{
         Relay1=1;
        Relay2=1;
        Timer0Init();
         while(1)
{  
  if((k==1)&&(fir==0))
  {
       TR0=1;                 //有物品時(shí)開(kāi)始計(jì)時(shí)
       Relay1=0;              //繼電器通電
       Relay2=0;  
                 }
    if((k==0)$$(fir==1))
  {
   fir=0;
   }
        }
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1   
{
        u16 temp;
        s=5;      //改變S可改變定時(shí)時(shí)間
         TL0 = 0xB0;               
         TH0 = 0x3C;               
         temp++;
         if(temp==(20*60)*s)      
         {
                 temp=0;
                 Relay1=1;   //繼電器斷電
                 Relay2=1;
                 fir=1;        //標(biāo)志位置1
           }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2018-2-13 19:38 | 只看該作者
xmcai 發(fā)表于 2018-2-13 10:31
第一個(gè)程序有個(gè)缺陷,就是把物品拿開(kāi)后再進(jìn)入,因?yàn)槲锲窐?biāo)志位為1,就再進(jìn)不了中斷程序。現(xiàn)又把程序完善了 ...

參看我在“請(qǐng)問(wèn)怎么寫(xiě)這個(gè)10s燈滅的語(yǔ)句 幫下忙解解惑”http://www.torrancerestoration.com/bbs/dpj-107271-1.html中的回復(fù),程序邏輯功能幾乎完全一致。
回復(fù)

使用道具 舉報(bào)

7#
ID:280226 發(fā)表于 2018-2-14 11:32 | 只看該作者
wulin 發(fā)表于 2018-2-13 19:38
參看我在“請(qǐng)問(wèn)怎么寫(xiě)這個(gè)10s燈滅的語(yǔ)句 幫下忙解解惑”http://www.torrancerestoration.com/bbs/dpj-107271-1.html中的 ...

試了您的程序,時(shí)間長(zhǎng)了就不行了,我需要有個(gè)15分鐘左右的時(shí)間。
回復(fù)

使用道具 舉報(bào)

8#
ID:280226 發(fā)表于 2018-2-14 12:29 | 只看該作者
wulin 發(fā)表于 2018-2-13 19:38
參看我在“請(qǐng)問(wèn)怎么寫(xiě)這個(gè)10s燈滅的語(yǔ)句 幫下忙解解惑”http://www.torrancerestoration.com/bbs/dpj-107271-1.html中的 ...

參考您的程序,再修改了中斷程序,現(xiàn)在完美解決了,可以延時(shí)任意時(shí)間了。謝謝解答。
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2018-2-14 14:09 | 只看該作者
xmcai 發(fā)表于 2018-2-14 11:32
試了您的程序,時(shí)間長(zhǎng)了就不行了,我需要有個(gè)15分鐘左右的時(shí)間。

我是說(shuō)這個(gè)程序邏輯功能幾乎與你的要求完全一致,至于定時(shí)時(shí)間的長(zhǎng)短是可以任意設(shè)定的。改成定時(shí)15分鐘:
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit key=P3^4;          //按鍵端口定義        
sbit LED=P1^0;          //發(fā)光管端口定義
uchar Cnt50ms=0;        //中斷計(jì)數(shù)變量
uint Cnt1s=0;           //中斷計(jì)數(shù)變量
void Timer0Init()       //50毫秒@12.000MHz
{
        TMOD= 0x01;          //設(shè)置定時(shí)器模式
        TL0 = 0xB0;          //設(shè)置定時(shí)初值
        TH0 = 0x3C;          //設(shè)置定時(shí)初值
//  TF0 = 0;            //清除TF0標(biāo)志
//  TR0 = 1;            //定時(shí)器0開(kāi)始計(jì)時(shí)
        EA=1;                //開(kāi)總中斷
        ET0=1;               //開(kāi)定時(shí)器0中斷        
}
void keyscan()
{
        static bit key_sign=0;        //按鍵有效標(biāo)志
        static uint  count=0;        //計(jì)數(shù)變量                        
        if(key==0)                    //檢測(cè)按鍵如果為0
        {
                count++;                 //消抖計(jì)數(shù)
                if((count>=500)&&(key_sign==0))
                {                        
                        key_sign=1;           //按鍵有效標(biāo)志置1
                        Cnt50ms=0;            //中斷計(jì)數(shù)變量清0
                        Cnt1s=0;              //中斷計(jì)數(shù)變量清0
                        TR0 = 1;              //啟動(dòng)定時(shí)器
                        LED=0;                //發(fā)光管亮
                }
        }
        else                          //按鍵抬起
        {
                key_sign=0;               //按鍵有效標(biāo)志清0
                count=0;                  //消抖計(jì)數(shù)清0
                LED=1;                    //發(fā)光管滅
                TR0=0;                    //關(guān)閉定時(shí)器
        }
}
void main()
{
        Timer0Init();              //定時(shí)器0初始化
        while(1)
        {
                keyscan();             //按鍵掃描
        }
}
void timer0() interrupt 1        //定時(shí)器0中斷
{
        TL0 = 0xB0;                 //設(shè)置定時(shí)初值
        TH0 = 0x3C;                  //設(shè)置定時(shí)初值
        Cnt50ms++;
        if(Cnt50ms>=20)             //1秒
        {
                Cnt50ms=0;
                Cnt1s++;
                if(Cnt1s>=900)                        //15分鐘
                {
                        Cnt1s=0;
                        LED=1;           //發(fā)光管滅
                        TR0=0;           //關(guān)閉定時(shí)器
                }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:280226 發(fā)表于 2018-2-14 14:41 | 只看該作者
wulin 發(fā)表于 2018-2-14 14:09
我是說(shuō)這個(gè)程序邏輯功能幾乎與你的要求完全一致,至于定時(shí)時(shí)間的長(zhǎng)短是可以任意設(shè)定的。改成定時(shí)15分鐘: ...

謝謝您的幫忙,已完美解決。
回復(fù)

使用道具 舉報(bào)

11#
ID:280226 發(fā)表于 2018-2-14 16:19 | 只看該作者
wulin 發(fā)表于 2018-2-14 14:09
我是說(shuō)這個(gè)程序邏輯功能幾乎與你的要求完全一致,至于定時(shí)時(shí)間的長(zhǎng)短是可以任意設(shè)定的。改成定時(shí)15分鐘: ...

在此基礎(chǔ)上,如果用三個(gè)按鍵分別控制三個(gè)LED,能否共用一個(gè)中斷程序各自定時(shí)15分鐘?
回復(fù)

使用道具 舉報(bào)

12#
ID:123289 發(fā)表于 2018-2-14 16:49 | 只看該作者
沒(méi)有真正的理解或認(rèn)識(shí),單片機(jī)中斷是干什么用的。中斷的流程是什么?先補(bǔ)一下課,再做。
回復(fù)

使用道具 舉報(bào)

13#
ID:213173 發(fā)表于 2018-2-15 08:59 | 只看該作者
xmcai 發(fā)表于 2018-2-14 16:19
在此基礎(chǔ)上,如果用三個(gè)按鍵分別控制三個(gè)LED,能否共用一個(gè)中斷程序各自定時(shí)15分鐘?

當(dāng)然可以!定時(shí)器只是一個(gè)時(shí)基,可以提供N個(gè)定時(shí)服務(wù),即可以是相同的定時(shí)時(shí)間,也可以是不同的定時(shí)時(shí)間。雖然新型單片機(jī)內(nèi)置多個(gè)定時(shí)器,但只要規(guī)劃得合理,一個(gè)定時(shí)器幾乎可以完成所有定時(shí)任務(wù)。如果使用多個(gè)定時(shí)器且規(guī)劃失當(dāng),定時(shí)中斷間相互干擾是不容忽視的問(wèn)題。
回復(fù)

使用道具 舉報(bào)

14#
ID:280226 發(fā)表于 2018-2-15 15:37 | 只看該作者
wulin 發(fā)表于 2018-2-15 08:59
當(dāng)然可以!定時(shí)器只是一個(gè)時(shí)基,可以提供N個(gè)定時(shí)服務(wù),即可以是相同的定時(shí)時(shí)間,也可以是不同的定時(shí)時(shí)間 ...

您的編程思路和方法值得學(xué)習(xí)和借鑒,謝謝解答!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表