将单片机接收的信号的低电平,2倍频后发出去(有少许误差,需要适当减少时间长度)。
//测量负脉冲宽度 并2倍频
#include<reg51.h> //包含51单片机寄存器定义的头文件
sbit u=P3^2; //将u位定义为P3.2
sbit pwm=P3^7;
unsigned int k1,k2;
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{
TMOD=0x11; //TMOD=0001 0001B,使用定时器T1 T0的模式1
EA=1; //开放总中断
EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断
ET0=1; //允许定时器T0中断
ET1=1; //允许定时器T1中断
TH0=0; //定时器T0赋初值0
TL0=0; //定时器T0赋初值0
TR0=0; //先关闭T0
TH1=0; //定时器T1赋初值0
TL1=0; //定时器T1赋初值0
TR1=1; //先开启T1
IP=0x08;//T1优先级大于T0
while(1)
; //无限循环, 不停检测输入负脉冲宽度
}
/**************************************************************
函数功能:外中断0的中断服务程序
**************************************************************/
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
TR0=1; //外中断一到来,即启动T0计时
TL0=0; //从0开始计时
TH0=0; //从0开始计时
while(u==0) //低电平时,等待T0计时
;
// P0=TL0; //将结果送P0 P1口显示
// P1=TH0;
k1=TH0*256+TL0;
TR0=0; //关闭T0
}
/**************************************************************
函数功能:定时器T1的中断服务程序
**************************************************************/
void Time1(void) interrupt 3 using 0 //"interrupt"声明函数为中断服务函数
{
TF1=0;//清除中断标志位
k2=k1/2;//2倍频
TH1=255-k2/256; //定时器T1的高8位赋初值
TL1=255-k2%256; //定时器T1的低8位赋初值
pwm=~pwm; //将pwm引脚输出电平取反,产生方波
TR1=1; //启动定时器T1
}
完整资料打包(含仿真):