|
第一個(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
}
} |
|