|
#include <reg52.H>
#include <stdio.H>
#include "IR.H"
#include "uart.h"
#define uchar unsigned char
#define uint unsigned int
void delay_ms(unsigned int t);
void Timer0Init(void);
//自己加的延時(shí)
//#define delay1ms; //誤差 -0.018084490741us
uint sec,ms1;
uint Time[3]={99,99,99};
//1.LED1~LED3依次接P1.0~P1.2;
//2.紅外接P3.2
sbit LED0=P1^0; //燈1
sbit LED1=P1^1; //燈2
sbit LED2=P1^2; //喇叭
sbit KEY0=P2^7; //光感應(yīng)
sbit KEY1=P2^6; //人體紅外
sbit KEY2=P2^5; //雷達(dá)
bit KEY2_temp;
void main()
{
// P1M0=0X07; //LED推挽輸出
// P1M1=0X00;
LED0=LED1=LED2=0; //開機(jī)全滅
IR_init(); //紅外初始化
UartInit();
Timer0Init();
KEY0=KEY1=KEY2=0;
KEY2_temp=KEY2;
while(1)
{
if(IR_Flag)
{
IR_Flag=0;
SendData(IRCOM[2]);
switch(IRCOM[2])
{
case 0x05:LED0=~LED0;break; //收到鍵值是05,LED0取反
case 0x09:LED1=~LED1;break; //收到鍵值是09,LED1取反
case 0x0D:LED2=~LED2;break; // 收到鍵值是0D,LED2取反
case 0x11:LED0=LED1=LED2=0;break; // 收到鍵值是11,LED0=LED1=LED2=0為低電平
}
}
else if(KEY0==1&&KEY1==1) //如果光感應(yīng)KEY0與感應(yīng)器1KEY1都為高電平,燈1開關(guān)打開
{
LED0=1;
delay_ms(5000); //延時(shí)時(shí)間=5ms*t
LED0=0;
// delay_ms(3000); //延時(shí)時(shí)間=5ms*t
// LED0=1;
}
else if(KEY0==1&&KEY1==1&&KEY2==1) //如果KEY0、KEY1和KEY2都為高電平,燈1和喇叭打開2分鐘
{
LED0=LED2=1;
delay_ms(5000); //延時(shí)時(shí)間=5ms*t
LED0=LED2=0;
}
if(KEY2!=KEY2_temp) // 如果KEY2有高電平 ,往下判斷
{
delay_ms(10);
if(KEY2!=KEY2_temp) // 再次判斷KEY2是否有高電平 ,如有,往下運(yùn)行
{
KEY2_temp=KEY2;
if(KEY2==1) // 如果KEY2有高電平
{
Time[2]=sec;
sec=0;
if((Time[0]+Time[1]+Time[2])<60) // 如果KEY2有高電平,60秒內(nèi)超過3次,所有開關(guān)都打開
{
LED0=LED1=LED2=1;
delay_ms(5000); //延時(shí)時(shí)間=5ms*t
LED0=LED1=LED2=0;
}
Time[0]=Time[1];
Time[1]=Time[2];
}
}
}
}
} /*
//自己加的延時(shí)程序
void delay_1ms() //誤差 -0.018084490741us
{
unsigned char a,b;
for(b=18;b>0;b--)
for(a=152;a>0;a--);
_nop_(); //if Keil,require use intrins.h
} */
void delay_ms(unsigned int t) //延時(shí)時(shí)間=5ms*t
{
ms1=0;
while(ms1<t);
}
void timer0 ()interrupt 1 using 1
{
static uint ms;
TL0 = 0x66; //設(shè)置定時(shí)初值// TL0=(65536-1000)%256;
TH0 = 0xFC; //設(shè)置定時(shí)初值// TH0=(65536-1000)/256;
ms++;
ms1++;
if(ms>=1000)
{
ms=0;
sec++;
}
}
void Timer0Init(void)
{
TMOD |=0x01;
TL0 = 0x66; //設(shè)置定時(shí)初值// TL0=(65536-1000)%256;
TH0 = 0xFC; //設(shè)置定時(shí)初值// TH0=(65536-1000)/256;
TR0 =1;
ET0 =1;
EA =1;
}
|
|