/*定时器0,100us溢出中断*/
SIGNAL(SIG_OVERFLOW0)
{
TCNT0=151;//重载数据,计时区间为151---255,共104uS,一个位的时间
if(TxLength)//
{
if(start==0)
{
Sbit0();//起始位
SUDR=*(TxPoint++);
}
else
{
if((start<=8))
{
if(SUDR&(1<<(start-1)))Sbit1();//数据1
else Sbit0();//数据0
}
else Sbit1();//停止位
}
if(start<10)start++;
else
{
TxLength--;//一字节 发送完成,字节数减1
start=0;
}//
}
}
/*定时器1,1ms溢出中断*/
SIGNAL(SIG_OVERFLOW1)
{
eep_ms++;
}
/*定时器2*/
SIGNAL(SIG_OVERFLOW2)
{
sei();
if(INT0_time)//有数据
{
INT0_time=0;//中断次数清0
rdata=1;//置有数据标志
eep_ms=0;
if(RxLength<10)DispBuff[RxLength++]=RUDR;
}
if(rtime<4)rtime++;//字节间隔时间,间隔3个字节重新开始一帧
else RxLength=0;
}
SIGNAL(SIG_INTERRUPT0)//INT0,边沿触发中断
{
unsigned char temp,temp2=0;
static unsigned char pre_TCNT2,j=0;
if(INT0_time==0)//一个字节第一个下降沿中断,起始位开始
{
TCNT2=130;
pre_TCNT2=130;
RUDR=0xff;//接收的数据初值
j=0; //位数清零
INT0_time++;//中断次数加一
}
else
{
temp=TCNT2;
if(temp>pre_TCNT2)temp2=temp-pre_TCNT2;//取一个高/低电平的宽度
if(temp2>10)//滤过窄电平(干扰信号)
{
pre_TCNT2=temp;//记录前一次的时间值
temp=0;
while(temp2>13)//计算位的个数,约13为一个位(8*13=104uS)
{
temp2-=13;//
temp++;
}
if(temp2>6)temp++;//计算位的个数,一般13为一个位
if(INT0_time==1)temp-=1;
if(INT0_time&1)//奇数次中断
{
while(temp)//位0的个数
{
RUDR&=~(1< temp--;
j++;
}
}
else j+=temp;//偶数,位1的个数,跳过
INT0_time++;//中断次数加一
}
}
rtime=0;
}