#include<reg51.h>
unsigned char Counter=0; //用于T0计数
sbit key1=P2^0; //定义按键位置
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit Waveout=P2^5; //P2.5口输出
sbit Waveout2=P2^6;
void send(); //函数声明
void delay(unsigned int);
void delay50us();
void delay130us();
void main()
{
Waveout2=!Waveout;
while(1)
{
if(!key1) //按下相应的按键,执行相应操作
{
delay(50000);
send();
Waveout=!Waveout;
delay50us();
send();
delay50us();
Waveout=!Waveout;
}
if(!key2)
{
delay(50000);
send();
Waveout=!Waveout;
delay50us();
send();
delay130us();
Waveout=!Waveout;
}
if(!key3)
{
delay(50000);
send();
Waveout=!Waveout;
delay130us();
send();
delay50us();
Waveout=!Waveout;
}
if(!key4)
{
delay(50000);
send();
Waveout=!Waveout;
delay130us();
send();
delay130us();
Waveout=!Waveout;
}
}
}
void delay(unsigned int cnt)//延时子程序,去抖
{
while(--cnt);
}
void send()
{
TMOD = 0x02; //定时器0工作于方式2
TH0= (256-24); //定时器0装入初值,用于产生 38KHz频率
TL0=TH0;
EA=1; //CPU开放中断
ET0=1; //允许T0中断
TR0=1; //启动T0开始计数
ET1=0;
TR1=0;
for(;;)
{
if(Counter>= 48)
{
ET0=0;
TR0 = 0; //停止输出
EA=0;
Counter=0;
break;
}
}
}
void delay50us()
{
TMOD = 0x20; //定时器1工作于方式2
TH1 =(256-164); //定时器1装入初值,延时50us
TL1 = TH1;
EA=1; //CPU开放中断
ET1=1; //允许T1中断
TR1=1; //启动T1开始计时
TR0=0;
ET0=0;
}
void delay130us()
{
TMOD = 0x20; //定时器1工作于方式2
TH1 = (256-16); //定时器1装入初值,延时130us
TL1 = TH1;
EA=1; //CPU开放中断
ET1=1; //允许T1中断
TR1=1; //启动T1开始计时
TR0=0;
ET0=0;
}
void T0_time() interrupt 1
{
Waveout=!Waveout; //方波输出端口,电平翻转,产生方波
Counter++;
}
void T1_time() interrupt 3
{
TR1=0;//关闭定时器1
}
unsigned char Counter=0; //用于T0计数
sbit key1=P2^0; //定义按键位置
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit Waveout=P2^5; //P2.5口输出
sbit Waveout2=P2^6;
void send(); //函数声明
void delay(unsigned int);
void delay50us();
void delay130us();
void main()
{
Waveout2=!Waveout;
while(1)
{
if(!key1) //按下相应的按键,执行相应操作
{
delay(50000);
send();
Waveout=!Waveout;
delay50us();
send();
delay50us();
Waveout=!Waveout;
}
if(!key2)
{
delay(50000);
send();
Waveout=!Waveout;
delay50us();
send();
delay130us();
Waveout=!Waveout;
}
if(!key3)
{
delay(50000);
send();
Waveout=!Waveout;
delay130us();
send();
delay50us();
Waveout=!Waveout;
}
if(!key4)
{
delay(50000);
send();
Waveout=!Waveout;
delay130us();
send();
delay130us();
Waveout=!Waveout;
}
}
}
void delay(unsigned int cnt)//延时子程序,去抖
{
while(--cnt);
}
void send()
{
TMOD = 0x02; //定时器0工作于方式2
TH0= (256-24); //定时器0装入初值,用于产生 38KHz频率
TL0=TH0;
EA=1; //CPU开放中断
ET0=1; //允许T0中断
TR0=1; //启动T0开始计数
ET1=0;
TR1=0;
for(;;)
{
if(Counter>= 48)
{
ET0=0;
TR0 = 0; //停止输出
EA=0;
Counter=0;
break;
}
}
}
void delay50us()
{
TMOD = 0x20; //定时器1工作于方式2
TH1 =(256-164); //定时器1装入初值,延时50us
TL1 = TH1;
EA=1; //CPU开放中断
ET1=1; //允许T1中断
TR1=1; //启动T1开始计时
TR0=0;
ET0=0;
}
void delay130us()
{
TMOD = 0x20; //定时器1工作于方式2
TH1 = (256-16); //定时器1装入初值,延时130us
TL1 = TH1;
EA=1; //CPU开放中断
ET1=1; //允许T1中断
TR1=1; //启动T1开始计时
TR0=0;
ET0=0;
}
void T0_time() interrupt 1
{
Waveout=!Waveout; //方波输出端口,电平翻转,产生方波
Counter++;
}
void T1_time() interrupt 3
{
TR1=0;//关闭定时器1
}