|
做了一個(gè)二路紅外監(jiān)控程序,利用紅外開關(guān)判斷信號(hào),每一路紅外開關(guān)有信號(hào)時(shí)該路繼電器接通5分鐘后自動(dòng)停止,5分鐘內(nèi)紅外信號(hào)消失繼電器也自動(dòng)斷開停止,二路獨(dú)立,這部分測(cè)試工作正常,現(xiàn)在加上一段自動(dòng)定時(shí)自啟功能:二個(gè)繼電器都斷開后開始計(jì)時(shí),60分鐘后后如果繼電器都沒有接通信號(hào),繼電器自動(dòng)接通,5分鐘后又自動(dòng)停止,如果在定時(shí)自啟過(guò)程中又有紅外信號(hào),程序恢復(fù)自動(dòng)判斷狀態(tài),如此循環(huán)反復(fù),但這部分功能卻實(shí)現(xiàn)不了,程序錯(cuò)在哪兒,一時(shí)找不出原因,請(qǐng)高手師傅指教修改一下,謝謝!!
附單片機(jī)原程序
#include <reg51.H>
typedef unsigned int u16;
sbit iR1=P1^3;
sbit iR2=P1^4;
sbit Relay1=P1^0;
sbit Relay2=P1^1;
bit flag_1=0,flag_2=0;
u16 temp_1,temp_2,temp_3;
/***********************************************
定時(shí)函數(shù)
************************************************/
void Timer0Init()//50ms@12.000MHz
{
TMOD= 0x01;
TL0 = 0xB0;
TH0 = 0x3C;
TR0 = 1;
EA=1;
ET0=1;
}
/***********************************************
紅外開關(guān)掃描程序
************************************************/
void iRscan()
{
static bit iR_sign1=0;
static bit iR_sign2=0;
if(iR1==1)
{
if(iR_sign1==0)
{
iR_sign1=1;
temp_1=0;
flag_1=1;
Relay1=1;
}
}
else
{
iR_sign1=0;
Relay1=0;
}
if(iR2==1)
{
if(iR_sign2==0)
{
iR_sign2=1;
temp_2=0;
flag_2=1;
Relay2=1;
}
}
else
{
iR_sign2=0;
Relay2=0;
}
}
/***********************************************
主程序
************************************************/
void main()
{
Timer0Init();
while(1)
{
iRscan();
}
}
/***********************************************
中斷函數(shù)
************************************************/
void Timer0() interrupt 1 //50ms@12.000MHz
{
TL0 = 0xB0;
TH0 = 0x3C;
if(flag_1==1)
{
temp_1++;
if(temp_1>=(20*60)*5)
{
flag_1=0;
Relay1=0;
}
}
if(flag_2==1)
{
temp_2++;
if(temp_2>=(20*60)*5)
{
flag_2=0;
Relay2=0;
}
}
/****以下為1小時(shí)后定時(shí)自啟,但功能實(shí)現(xiàn)不了,程序錯(cuò)在哪?
******/
if(flag_1==0&&flag_2==0)
{
temp_3++;
if(temp_3>=(20*60)*60)
{
flag_1=1;
Relay1=1;
flag_2=1;
Relay2=1;
}
}
if(flag_1==1&&flag_2==1)
{
temp_3++;
if(temp_3>=(20*60)*5)
{
flag_1=0;
Relay1=0;
flag_2=0;
Relay2=0;
}
}
}
|
|