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

QQ登錄

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

搜索
查看: 3997|回復(fù): 13
收起左側(cè)

那位高手幫我設(shè)計(jì)一個(gè)單片機(jī)多任務(wù)定時(shí)控制程序

[復(fù)制鏈接]
ID:280226 發(fā)表于 2018-1-28 22:20 | 顯示全部樓層 |閱讀模式
剛學(xué)單片機(jī)不久,對(duì)于多任務(wù)系統(tǒng)不太了解,特求助大神。想用一只89S52制作一個(gè)定時(shí)程序控制三只繼電器,具體做法是:由三個(gè)光電開(kāi)關(guān)感應(yīng)模塊分接P1三個(gè)端口,分別控制P2三個(gè)端口繼電器,當(dāng)某一模塊因物體阻擋,光電模塊輸出低電平時(shí)接通所控繼電器工作20分種,20分種到繼電器自動(dòng)斷開(kāi)。當(dāng)物體離開(kāi),光電;謴(fù)輸出高電平時(shí),繼電器也馬上斷開(kāi)停止工作。要求三組可同時(shí)工作也可獨(dú)立工作,互不干擾。希望高手幫我設(shè)計(jì)一套C51程序,謝謝老師!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2018-1-29 21:16 | 顯示全部樓層
雖然你的要求比較簡(jiǎn)單,像布置任務(wù)的樣子一般不會(huì)有人給你寫(xiě)程序,這樣的事情需要自己做,遇到具體困難再求助。

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:280226 發(fā)表于 2018-1-30 15:46 | 顯示全部樓層
wulin 發(fā)表于 2018-1-29 21:16
雖然你的要求比較簡(jiǎn)單,像布置任務(wù)的樣子一般不會(huì)有人給你寫(xiě)程序,這樣的事情需要自己做,遇到具體困難再求 ...

誠(chéng)心求教,不妥之處請(qǐng)鑒諒,謝謝您的批評(píng)!下回發(fā)貼會(huì)注意。
回復(fù)

使用道具 舉報(bào)

ID:269508 發(fā)表于 2018-2-20 21:16 | 顯示全部樓層
兄弟,做的怎樣了?我最近也是在做類(lèi)似的,可以交流下嗎?
回復(fù)

使用道具 舉報(bào)

ID:284323 發(fā)表于 2018-2-21 15:31 | 顯示全部樓層
非常容易,自己動(dòng)手寫(xiě)寫(xiě)代碼想一想就知道了  設(shè)3個(gè)變量 每毫秒加1  時(shí)間到了重新計(jì)數(shù)或停止就行了

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2018-2-21 16:23 | 顯示全部樓層
你可以用一個(gè)定時(shí)器中斷計(jì)時(shí),計(jì)滿(mǎn)20分種,建立標(biāo)志1;計(jì)滿(mǎn)40分種,建立標(biāo)志2。在主程序中等待,標(biāo)志1=1,接通繼電器工作,同時(shí)標(biāo)志1=0;標(biāo)志2=1,斷開(kāi)繼電器,同時(shí)標(biāo)志2=0。用外中斷(物體離開(kāi),光電;謴(fù)輸出高電平)作高優(yōu)先級(jí)中斷,斷開(kāi)繼電器。
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2018-2-21 17:04 | 顯示全部樓層
先定義計(jì)數(shù)器0或計(jì)數(shù)器1作計(jì)時(shí)器 比如沒(méi)1s產(chǎn)生一個(gè)中斷 定義3個(gè)全局變量 在對(duì)應(yīng)的中斷服務(wù)中 每產(chǎn)生一個(gè)中斷 3個(gè)全局變量自加

3個(gè)輸入端分別對(duì)應(yīng)3個(gè)全局變量之一 當(dāng)有觸發(fā)時(shí) 先給對(duì)應(yīng)的全局變量清零然后打開(kāi)繼電器 即 開(kāi)始計(jì)數(shù) 然后判斷變量值是否達(dá)到設(shè)定值 比如你要求的20分鐘 如果達(dá)到則控制繼電器反轉(zhuǎn) 如果計(jì)數(shù)期間觸發(fā)狀態(tài)反轉(zhuǎn)則直接把計(jì)數(shù)器設(shè)置成大于設(shè)定值的數(shù)字 比如設(shè)定20就直接設(shè)置成=21 依舊可以觸發(fā)繼電器反轉(zhuǎn)

6樓的方法也可以 不過(guò)我習(xí)慣盡量不用中斷或者盡快共用中斷 單片機(jī)的中斷資源實(shí)在太少了 處理速度也不能和PC類(lèi)的比 中斷用的越多相當(dāng)于耽誤的時(shí)間越多 開(kāi)始養(yǎng)成這個(gè)習(xí)慣利于以后寫(xiě)更大的程序

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:280226 發(fā)表于 2018-2-22 10:33 | 顯示全部樓層
本帖最后由 xmcai 于 2018-2-22 10:58 編輯

下面的程序就是用一個(gè)光電開(kāi)關(guān)的,當(dāng)物體遮擋時(shí),光電開(kāi)關(guān)輸出高電平,繼電器1吸合,5分鐘后自動(dòng)斷開(kāi),在5分鐘內(nèi)如果物體離開(kāi),繼電器馬上斷開(kāi),已測(cè)試正常,F(xiàn)在需要用到三個(gè)光電開(kāi)關(guān),各自控制三個(gè)繼電器,有物體時(shí)繼電器吸合5分鐘,當(dāng)物體離開(kāi)時(shí),繼電器馬上斷開(kāi),三者互不影響。但如何寫(xiě)成多任務(wù)系統(tǒng),我還不熟悉,請(qǐng)高手幫忙完善。(這個(gè)光電掃描程序是參照wulin老師的)
#include <reg52.H>
#define uint unsigned int
typedef unsigned int u16;
sbit iR1=P1^0;                                            //紅外線(xiàn)端口1定義   
sbit iR2=P1^1;                                            //紅外線(xiàn)端口2定義
sbit iR3=P1^5;                                            //紅外線(xiàn)端口3定義
sbit Relay1=P0^0;                                         //繼電器1端口定義
sbit Relay2=P0^1;                                         //繼電器2端口定義
sbit Relay3=P0^2;                                         //繼電器3端口定義
//sbit Relay4=P0^3;                                         //繼電器4端口定義
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init()                                          //50毫秒@12.000MHz
{
        TMOD= 0x01;                                        //設(shè)置定時(shí)器模式
        TL0 = 0xB0;                                        //設(shè)置定時(shí)初值
        TH0 = 0x3C;                                        //設(shè)置定時(shí)初值
              EA=1;                                              //開(kāi)總中斷
        ET0=1;                                             //開(kāi)定時(shí)器0中斷
}
/***********************************************
紅外開(kāi)關(guān)掃描子程序
************************************************/
void iRscan()                                              //紅外開(kāi)關(guān)信號(hào)識(shí)別子程序
{
         static bit iR_sign1=0;                            //紅外開(kāi)關(guān)1有效標(biāo)志
//               static bit iR_sign2=0;                            //紅外開(kāi)關(guān)2有效標(biāo)志
//               static bit iR_sign3=0;                            //紅外開(kāi)關(guān)3有效標(biāo)志                  
         if(iR1==1)                                         //檢測(cè)信號(hào)如果為1
         {
                                   if(iR_sign1==0)
                 {                        
                        iR_sign1=1;                        //紅外開(kāi)關(guān)1有效標(biāo)志置1
                         TR0 = 1;                          //啟動(dòng)定時(shí)器
                         Relay1=0;                         //繼電器接通
//                                                                               Relay2=0;
                }
         }
         else                                               //紅外開(kāi)關(guān)1信號(hào)消失
        {
                 iR_sign1=0;                                //紅外開(kāi)關(guān)1有效標(biāo)志清0
                 Relay1=1;                                  //繼電器斷開(kāi)
                                                                 Relay2=1;                                 
                 TR0=0;                                     //關(guān)閉定時(shí)器
        }
//                                 if(iR2==1)                                         //檢測(cè)信號(hào)如果為1
//         {
//                                   if(iR_sign2==0)
//                 {                        
//                        iR_sign2=1;                        //紅外開(kāi)關(guān)1有效標(biāo)志置1
//                         TR0 = 1;                          //啟動(dòng)定時(shí)器
//                         Relay2=0;                         //繼電器接通
//                                                                               Relay3=0;
//               }
//         }
//         else                                               //紅外開(kāi)關(guān)1信號(hào)消失
//        {
//                 iR_sign2=0;                                //紅外開(kāi)關(guān)1有效標(biāo)志清0
//                 Relay2=1;                                  //繼電器斷開(kāi)
//                                                                 Relay3=1;                                 
//                 TR0=0;                                     //關(guān)閉定時(shí)器
//        }
// }
/***********************************************
主函數(shù)
************************************************/
void main()
{
         Timer0Init();                                //定時(shí)器0初始化
         while(1)
         {
             iRscan();                                //按鍵掃描
        }
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1   //50毫秒@12.000MHz
{
                                 u16 temp;
         TL0 = 0xB0;                //設(shè)置定時(shí)初值
         TH0 = 0x3C;                //設(shè)置定時(shí)初值
                                 temp++;
         if(temp==(20*60)*5)        //20*60為1分鐘,5為分鐘數(shù)
         {
                 temp=0;
                 Relay1=1;          //繼電器斷開(kāi)
//                                               Relay2=1;
           }
                                 }

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2018-2-22 12:28 | 顯示全部樓層
xmcai 發(fā)表于 2018-2-22 10:33
下面的程序就是用一個(gè)光電開(kāi)關(guān)的,當(dāng)物體遮擋時(shí),光電開(kāi)關(guān)輸出高電平,繼電器1吸合,5分鐘后自動(dòng)斷開(kāi),在5 ...

在這種情況下多任務(wù)使用一個(gè)定時(shí)器就不能直接操作TR0,而是操作3個(gè)標(biāo)志來(lái)分別計(jì)時(shí)。給你改一下,以達(dá)拋磚引玉。
#include <reg52.H>
typedef unsigned char u8;
typedef unsigned int u16;
sbit iR1=P1^0; //紅外線(xiàn)端口1定義   
sbit iR2=P1^1; //紅外線(xiàn)端口2定義
sbit iR3=P1^5; //紅外線(xiàn)端口3定義
sbit Relay1=P0^0;//繼電器1端口定義
sbit Relay2=P0^1;//繼電器2端口定義
sbit Relay3=P0^2;//繼電器3端口定義
//sbit Relay4=P0^3;//繼電器4端口定義
bit flag_1=0,flag_2=0,flag_3=0;//計(jì)時(shí)標(biāo)志
u16 temp_1,temp_2,temp_3;//中斷計(jì)數(shù)變量
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init()//50毫秒@12.000MHz
{
        TMOD= 0x01;  //設(shè)置定時(shí)器模式
        TL0 = 0xB0;  //設(shè)置定時(shí)初值
        TH0 = 0x3C;  //設(shè)置定時(shí)初值
        TR0 = 1;     //開(kāi)啟定時(shí)器
        EA=1;        //開(kāi)總中斷
        ET0=1;       //開(kāi)定時(shí)器0中斷
}
/***********************************************
紅外開(kāi)關(guān)掃描子程序
************************************************/
void iRscan()           //紅外開(kāi)關(guān)信號(hào)識(shí)別子程序
{
        static bit iR_sign1=0; //紅外開(kāi)關(guān)1有效標(biāo)志
        static bit iR_sign2=0; //紅外開(kāi)關(guān)2有效標(biāo)志
        static bit iR_sign3=0; //紅外開(kāi)關(guān)3有效標(biāo)志                  
        if(iR1==1)             //檢測(cè)iR1信號(hào)如果為1
        {
                if(iR_sign1==0)        //防止重復(fù)響應(yīng)
                {                        
                        iR_sign1=1;//紅外開(kāi)關(guān)1有效標(biāo)志置1
                        temp_1=0;  //中斷計(jì)數(shù)變量清0
                        flag_1=1;  //計(jì)時(shí)標(biāo)志置1
                        Relay1=0; //繼電器接通
                }
        }
        else //紅外開(kāi)關(guān)1信號(hào)消失
        {
                iR_sign1=0;//紅外開(kāi)關(guān)1有效標(biāo)志清0
                Relay1=1; //繼電器斷開(kāi)
        }
        if(iR2==1)  //檢測(cè)iR2信號(hào)如果為1
        {
                if(iR_sign2==0)        //防止重復(fù)響應(yīng)
                {                        
                        iR_sign2=1;//紅外開(kāi)關(guān)1有效標(biāo)志置1
                        temp_2=0;  //中斷計(jì)數(shù)變量清0
                        flag_2=1;  //計(jì)時(shí)標(biāo)志置1
                        Relay2=0; //繼電器接通
                }
        }
        else //紅外開(kāi)關(guān)2信號(hào)消失
        {
                iR_sign2=0;//紅外開(kāi)關(guān)2有效標(biāo)志清0
                Relay2=1; //繼電器斷開(kāi)
        }
        if(iR3==1) //檢測(cè)iR3信號(hào)如果為1
        {
                if(iR_sign3==0)        //防止重復(fù)響應(yīng)
                {                        
                        iR_sign3=1;//紅外開(kāi)關(guān)1有效標(biāo)志置1
                        temp_3=0;  //中斷計(jì)數(shù)變量清0
                        flag_3=1;  //計(jì)時(shí)標(biāo)志置1
                        Relay3=0; //繼電器接通
                }
        }
        else //紅外開(kāi)關(guān)3信號(hào)消失
        {
                iR_sign3=0;//紅外開(kāi)關(guān)3有效標(biāo)志清0
                Relay3=1; //繼電器斷開(kāi)
        }
}
/***********************************************
主函數(shù)
************************************************/
void main()
{
        Timer0Init();  //定時(shí)器0初始化
        while(1)
        {
                iRscan();  //紅外開(kāi)關(guān)信號(hào)掃描
        }
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1   //50毫秒@12.000MHz
{
        TL0 = 0xB0;                //設(shè)置定時(shí)初值
        TH0 = 0x3C;                //設(shè)置定時(shí)初值
        if(flag_1==1)             //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_1++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_1>=(20*60)*1)  //20*60為1分鐘
                {
                        flag_1=0;          //計(jì)時(shí)標(biāo)志置0
                        Relay1=1;          //繼電器斷開(kāi)
                }
        }
        if(flag_2==1)             //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_2++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_2>=(20*60)*1)  //20*60為1分鐘
                {
                        flag_2=0;          //計(jì)時(shí)標(biāo)志置0
                        Relay2=1;          //繼電器斷開(kāi)
                }
        }
        if(flag_3==1)             //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_3++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_3>=(20*60)*1)  //20*60為1分鐘
                {
                        flag_3=0;          //計(jì)時(shí)標(biāo)志置0
                        Relay3=1;          //繼電器斷開(kāi)
                }
        }
}

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:280226 發(fā)表于 2018-2-22 15:37 | 顯示全部樓層
wulin 發(fā)表于 2018-2-22 12:28
在這種情況下多任務(wù)使用一個(gè)定時(shí)器就不能直接操作TR0,而是操作3個(gè)標(biāo)志來(lái)分別計(jì)時(shí)。給你改一下,以達(dá)拋磚 ...

wulin老師,謝謝您!這個(gè)程序一直受到您的幫助指導(dǎo),受益菲淺。
回復(fù)

使用道具 舉報(bào)

ID:284815 發(fā)表于 2018-2-22 17:54 | 顯示全部樓層
那么簡(jiǎn)答
回復(fù)

使用道具 舉報(bào)

ID:280226 發(fā)表于 2018-3-8 15:25 | 顯示全部樓層
wulin 發(fā)表于 2018-2-22 12:28
在這種情況下多任務(wù)使用一個(gè)定時(shí)器就不能直接操作TR0,而是操作3個(gè)標(biāo)志來(lái)分別計(jì)時(shí)。給你改一下,以達(dá)拋磚 ...

wulin老師,現(xiàn)在我要增加一個(gè)強(qiáng)制按鈕,按下后不論什么狀態(tài),三路繼電器均接通15分鐘,然后斷開(kāi)。但編譯通不過(guò),不知錯(cuò)在哪里,麻煩您再指導(dǎo)修正,不勝感激!謝謝您!
#include <reg52.H>
//typedef unsigned char u8;
typedef unsigned int u16;
#define uint unsigned int
sbit iR1=P1^4; //紅外線(xiàn)端口1定義   
sbit iR2=P1^5; //紅外線(xiàn)端口2定義
sbit iR3=P1^6; //紅外線(xiàn)端口3定義
sbit Relay1=P0^0;//繼電器1端口定義
sbit Relay2=P0^1;//繼電器2端口定義
sbit Relay3=P0^2;//繼電器3端口定義
sbit k=P1^7;     //強(qiáng)制按鍵定義
bit flag_1=0,flag_2=0,flag_3=0; flag_4=0;//計(jì)時(shí)標(biāo)志
u16 temp_1,temp_2,temp_3;temp_4;//中斷計(jì)數(shù)變量
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init()//50毫秒@12.000MHz
{
        TMOD= 0x01;  //設(shè)置定時(shí)器模式
        TL0 = 0xB0;  //設(shè)置定時(shí)初值
        TH0 = 0x3C;  //設(shè)置定時(shí)初值
        TR0 = 1;     //開(kāi)啟定時(shí)器
        EA=1;        //開(kāi)總中斷
        ET0=1;       //開(kāi)定時(shí)器0中斷
}
/***********************************************
紅外開(kāi)關(guān)掃描子程序
************************************************/
void iRscan()           //紅外開(kāi)關(guān)信號(hào)識(shí)別子程序
{
        static bit iR_sign1=0; //紅外開(kāi)關(guān)1有效標(biāo)志
        static bit iR_sign2=0; //紅外開(kāi)關(guān)2有效標(biāo)志
        static bit iR_sign3=0; //紅外開(kāi)關(guān)3有效標(biāo)志
        static bit k_sign4=0; //強(qiáng)制開(kāi)關(guān)有效標(biāo)志       
              static uint  count=0;  //計(jì)數(shù)變量
        if(iR1==1)             //檢測(cè)iR1信號(hào)如果為1
         {
                 if(iR_sign1==0)        //防止重復(fù)響應(yīng)
                {                        
                         iR_sign1=1;    //紅外開(kāi)關(guān)1有效標(biāo)志置1
                         temp_1=0;      //中斷計(jì)數(shù)變量清0
                         flag_1=1;      //計(jì)時(shí)標(biāo)志置1
                         Relay1=0;      //繼電器接通
                }
         }
         else                           //紅外開(kāi)關(guān)1信號(hào)消失
        {
                 iR_sign1=0;            //紅外開(kāi)關(guān)1有效標(biāo)志清0
                 Relay1=1;              //繼電器斷開(kāi)
        }
                               
         if(iR2==1)                     //檢測(cè)iR2信號(hào)如果為1
         {
                 if(iR_sign2==0)        //防止重復(fù)響應(yīng)
                {                        
                         iR_sign2=1;    //紅外開(kāi)關(guān)2有效標(biāo)志置1
                         temp_2=0;      //中斷計(jì)數(shù)變量清0
                         flag_2=1;      //計(jì)時(shí)標(biāo)志置1
                         Relay2=0;      //繼電器接通
                }
         }
         else                           //紅外開(kāi)關(guān)2信號(hào)消失
        {
                 iR_sign2=0;            //紅外開(kāi)關(guān)2有效標(biāo)志清0
                 Relay2=1;              //繼電器斷開(kāi)
        }
                               
         if(iR3==1)                     //檢測(cè)iR3信號(hào)如果為1
         {
                 if(iR_sign3==0)        //防止重復(fù)響應(yīng)
                {                        
                         iR_sign3=1;    //紅外開(kāi)關(guān)1有效標(biāo)志置1
                         temp_3=0;      //中斷計(jì)數(shù)變量清0
                         flag_3=1;      //計(jì)時(shí)標(biāo)志置1
                         Relay3=0;      //繼電器接通
                }
         }
         else                           //紅外開(kāi)關(guān)3信號(hào)消失
        {
                 iR_sign3=0;            //紅外開(kāi)關(guān)3有效標(biāo)志清0
                 Relay3=1;              //繼電器斷開(kāi)
        }
                                if(k==1)                        //檢測(cè)手動(dòng)消毒開(kāi)關(guān)如果為1
                                {
                                        count++;                //消抖計(jì)數(shù)
               if((count>=500)&&(k_sign4==0))  //防止重復(fù)響應(yīng)
                                                                {
                                                                        k_sign4=1;      //手動(dòng)消毒開(kāi)關(guān)標(biāo)志置1
                                          temp_4=0;      //中斷計(jì)數(shù)變量清0
                        flag_4=1;      //計(jì)時(shí)標(biāo)志置1
                        Relay1=0;      //繼電器接通
                        Relay2=0;      //繼電器接通
                        Relay3=0;      //繼電器接通
                                                            }       
                                                                }
                                else
                                {
                                              iR_sign1=0;            //紅外開(kāi)關(guān)1有效標(biāo)志清0
                                              iR_sign2=0;            //紅外開(kāi)關(guān)2有效標(biāo)志清0
                                               iR_sign3=0;            //紅外開(kāi)關(guān)3有效標(biāo)志清0
                                              k_sign4=0;            //強(qiáng)制開(kāi)關(guān)有效標(biāo)志清0
                                              Relay1=1;              //繼電器斷開(kāi)
                                              Relay2=1;              //繼電器斷開(kāi)
                                              Relay3=1;              //繼電器斷開(kāi)
                                        }
                       
/***********************************************
主函數(shù)
************************************************/
void main()
{
         Timer0Init();                  //定時(shí)器0初始化
        while(1)
         {
                 iRscan();              //紅外開(kāi)關(guān)信號(hào)掃描
        }
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1                       //50毫秒@12.000MHz
{
        TL0 = 0xB0;                             //設(shè)置定時(shí)初值
        TH0 = 0x3C;                             //設(shè)置定時(shí)初值
        if(flag_1==1)                           //如果計(jì)時(shí)標(biāo)志為1
         {
                 temp_1++;                      //中斷計(jì)數(shù)變量自+1
                 if(temp_1>=(20*60)*15)          //20*60為1分鐘
                {
                         flag_1=0;              //計(jì)時(shí)標(biāo)志置0
                         Relay1=1;              //繼電器斷開(kāi)
                }
         }
                                 
         if(flag_2==1)                          //如果計(jì)時(shí)標(biāo)志為1
         {
                 temp_2++;                      //中斷計(jì)數(shù)變量自+1
                 if(temp_2>=(20*60)*15)          //20*60為1分鐘
                {
                         flag_2=0;              //計(jì)時(shí)標(biāo)志置0
                         Relay2=1;              //繼電器斷開(kāi)
                }
         }
                                 
         if(flag_3==1)                          //如果計(jì)時(shí)標(biāo)志為1
         {
                 temp_3++;                      //中斷計(jì)數(shù)變量自+1
                 if(temp_3>=(20*60)*15)          //20*60為1分鐘
                {
                         flag_3=0;              //計(jì)時(shí)標(biāo)志置0
                         Relay3=1;              //繼電器斷開(kāi)
                }
         }
                                  if(flag_4==1)                           //如果計(jì)時(shí)標(biāo)志為1
         {
                 temp_4++;                      //中斷計(jì)數(shù)變量自+1
                 if(temp_4>=(20*60)*15)          //20*60為1分鐘
                {
                         flag_4=0;              //計(jì)時(shí)標(biāo)志置0
                         Relay1=1;              //繼電器斷開(kāi)
                                                                               Relay2=1;              //繼電器斷開(kāi)
                                                                               Relay3=1;              //繼電器斷開(kāi)
                }
         }
}
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2018-3-8 21:44 | 顯示全部樓層
xmcai 發(fā)表于 2018-3-8 15:25
wulin老師,現(xiàn)在我要增加一個(gè)強(qiáng)制按鈕,按下后不論什么狀態(tài),三路繼電器均接通15分鐘,然后斷開(kāi)。但編譯 ...

編譯通不過(guò)的主要原因是你添加的語(yǔ)句部分使用了中文{ }符號(hào),現(xiàn)在已經(jīng)改正并做了調(diào)整,K部分的語(yǔ)句只適合用轉(zhuǎn)換開(kāi)關(guān),不適合按鈕。按住15分鐘以上顯然不合理。如果必須用按鈕那程序就要再增加一個(gè)標(biāo)志,按一次置1,執(zhí)行強(qiáng)制指令,再按一次置0,解除強(qiáng)制為自動(dòng)。
#include <reg52.H>
//typedef unsigned char u8;
typedef unsigned int u16;
#define uint unsigned int
sbit iR1=P1^4; //紅外線(xiàn)端口1定義   
sbit iR2=P1^5; //紅外線(xiàn)端口2定義
sbit iR3=P1^6; //紅外線(xiàn)端口3定義
sbit Relay1=P0^0;//繼電器1端口定義
sbit Relay2=P0^1;//繼電器2端口定義
sbit Relay3=P0^2;//繼電器3端口定義
sbit k=P1^7;     //強(qiáng)制按鍵定義
bit flag_1=0,flag_2=0,flag_3=0; flag_4=0;//計(jì)時(shí)標(biāo)志
u16 temp_1,temp_2,temp_3;temp_4;//中斷計(jì)數(shù)變量
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init()//50毫秒@12.000MHz
{
        TMOD= 0x01;  //設(shè)置定時(shí)器模式
        TL0 = 0xB0;  //設(shè)置定時(shí)初值
        TH0 = 0x3C;  //設(shè)置定時(shí)初值
        TR0 = 1;     //開(kāi)啟定時(shí)器
        EA=1;        //開(kāi)總中斷
        ET0=1;       //開(kāi)定時(shí)器0中斷
}
/***********************************************
紅外開(kāi)關(guān)掃描子程序
************************************************/
void iRscan()           //紅外開(kāi)關(guān)信號(hào)識(shí)別子程序
{
        static bit iR_sign1=0; //紅外開(kāi)關(guān)1有效標(biāo)志
        static bit iR_sign2=0; //紅外開(kāi)關(guān)2有效標(biāo)志
        static bit iR_sign3=0; //紅外開(kāi)關(guān)3有效標(biāo)志
        static bit k_sign4=0; //強(qiáng)制開(kāi)關(guān)有效標(biāo)志        
        static uint  count=0;  //計(jì)數(shù)變量
        if(k==1)       //檢測(cè)手動(dòng)消毒開(kāi)關(guān)如果為1
        {
                count++;                //消抖計(jì)數(shù)
                if((count>=500)&&(k_sign4==0))  //防止重復(fù)響應(yīng)
                {
                        k_sign4=1;      //手動(dòng)消毒開(kāi)關(guān)標(biāo)志置1
                        temp_4=0;      //中斷計(jì)數(shù)變量清0
                        flag_4=1;      //計(jì)時(shí)標(biāo)志4置1
                        flag_1=0;                //計(jì)時(shí)標(biāo)志1清0
                        flag_2=0;                //計(jì)時(shí)標(biāo)志2清0
                        flag_3=0;                //計(jì)時(shí)標(biāo)志3清0
                        Relay1=0;      //繼電器1接通
                        Relay2=0;      //繼電器2接通
                        Relay3=0;      //繼電器3接通
                }        
        }
        else        //強(qiáng)制開(kāi)關(guān)復(fù)位執(zhí)行自動(dòng)檢測(cè)
        {
//                iR_sign1=0;            //紅外開(kāi)關(guān)1有效標(biāo)志清0
//                iR_sign2=0;            //紅外開(kāi)關(guān)2有效標(biāo)志清0
//                iR_sign3=0;            //紅外開(kāi)關(guān)3有效標(biāo)志清0
                count=0;                                                //消抖計(jì)數(shù)清0
                k_sign4=0;            //強(qiáng)制開(kāi)關(guān)有效標(biāo)志清0
                Relay1=1;              //繼電器斷開(kāi)
                Relay2=1;              //繼電器斷開(kāi)
                Relay3=1;              //繼電器斷開(kāi)

                if(iR1==1)             //檢測(cè)iR1信號(hào)如果為1
                {
                        if(iR_sign1==0)        //防止重復(fù)響應(yīng)
                        {                        
                                iR_sign1=1;    //紅外開(kāi)關(guān)1有效標(biāo)志置1
                                temp_1=0;      //中斷計(jì)數(shù)變量清0
                                flag_1=1;      //計(jì)時(shí)標(biāo)志置1
                                Relay1=0;      //繼電器接通
                        }
                }
                else                           //紅外開(kāi)關(guān)1信號(hào)消失
                {
                        iR_sign1=0;            //紅外開(kāi)關(guān)1有效標(biāo)志清0
                        Relay1=1;              //繼電器斷開(kāi)
                }
       
                if(iR2==1)                     //檢測(cè)iR2信號(hào)如果為1
                {
                        if(iR_sign2==0)        //防止重復(fù)響應(yīng)
                        {                        
                                iR_sign2=1;    //紅外開(kāi)關(guān)2有效標(biāo)志置1
                                temp_2=0;      //中斷計(jì)數(shù)變量清0
                                flag_2=1;      //計(jì)時(shí)標(biāo)志置1
                                Relay2=0;      //繼電器接通
                        }
                }
                else                           //紅外開(kāi)關(guān)2信號(hào)消失
                {
                        iR_sign2=0;            //紅外開(kāi)關(guān)2有效標(biāo)志清0
                        Relay2=1;              //繼電器斷開(kāi)
                }
       
                if(iR3==1)                     //檢測(cè)iR3信號(hào)如果為1
                {
                        if(iR_sign3==0)        //防止重復(fù)響應(yīng)
                        {                        
                                iR_sign3=1;    //紅外開(kāi)關(guān)1有效標(biāo)志置1
                                temp_3=0;      //中斷計(jì)數(shù)變量清0
                                flag_3=1;      //計(jì)時(shí)標(biāo)志置1
                                Relay3=0;      //繼電器接通
                        }
                }
                else          //紅外開(kāi)關(guān)3信號(hào)消失
                {
                        iR_sign3=0;    //紅外開(kāi)關(guān)3有效標(biāo)志清0
                        Relay3=1;      //繼電器斷開(kāi)
                }
        }
}                 
/***********************************************
主函數(shù)
************************************************/
void main()
{
        Timer0Init();                  //定時(shí)器0初始化
        while(1)
        {
                iRscan();              //紅外開(kāi)關(guān)信號(hào)掃描
        }
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1                       //50毫秒@12.000MHz
{
        TL0 = 0xB0;                             //設(shè)置定時(shí)初值
        TH0 = 0x3C;                             //設(shè)置定時(shí)初值
        if(flag_1==1)                           //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_1++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_1>=(20*60)*15)          //20*60為1分鐘
                {
                        flag_1=0;              //計(jì)時(shí)標(biāo)志置0
                        Relay1=1;              //繼電器斷開(kāi)
                }
        }

        if(flag_2==1)                          //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_2++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_2>=(20*60)*15)          //20*60為1分鐘
                {
                        flag_2=0;              //計(jì)時(shí)標(biāo)志置0
                        Relay2=1;              //繼電器斷開(kāi)
                }
        }

        if(flag_3==1)                          //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_3++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_3>=(20*60)*15)          //20*60為1分鐘
                {
                        flag_3=0;              //計(jì)時(shí)標(biāo)志置0
                        Relay3=1;              //繼電器斷開(kāi)
                }
        }
        if(flag_4==1)                           //如果計(jì)時(shí)標(biāo)志為1
        {
                temp_4++;                      //中斷計(jì)數(shù)變量自+1
                if(temp_4>=(20*60)*15)          //20*60為1分鐘
                {
                        flag_4=0;              //計(jì)時(shí)標(biāo)志置0
                        Relay1=1;              //繼電器斷開(kāi)
                        Relay2=1;              //繼電器斷開(kāi)
                        Relay3=1;              //繼電器斷開(kāi)
                }
        }
}
回復(fù)

使用道具 舉報(bào)

ID:280226 發(fā)表于 2018-3-9 09:03 | 顯示全部樓層
wulin 發(fā)表于 2018-3-8 21:44
編譯通不過(guò)的主要原因是你添加的語(yǔ)句部分使用了中文{ }符號(hào),現(xiàn)在已經(jīng)改正并做了調(diào)整,K部分的語(yǔ)句只適合 ...

謝謝wulin老師!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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