|
发表于 2014-5-29 10:54:57
|
显示全部楼层
SIGNAL(TIMER0_OVF_vect)
{
if (single_wire.transmit_status == SINGLE_WIRE_MODULE_RECEIVE)
{
TCNT0 = 0xD1; //set count
single_wire.pin_value = SINGLE_WIRE_PIN_READ();
if (!single_wire.pin_value)
{
// 计算脉冲宽度低电平时间
single_wire.pluse_coun ++;
}
else
{
switch (single_wire.code_status)
{
case SINGLE_WIRE_CODE_IDLE_PULSE:
// 接收起始码
if ((single_wire.pluse_coun >= 20)&&(single_wire.pluse_coun < 40))
{
single_wire.bit_coun = 0;
single_wire.byte_coun = 0;
// 转为接收数据状态
single_wire.code_status = SINGLE_WIRE_CODE_DATA;
}
break;
case SINGLE_WIRE_CODE_DATA :
// 接收数据
// 根据数据来确定数据长度
// 计算低电平时间算数据为 1 还是 0
if ((single_wire.pluse_coun >= 6)&&(single_wire.pluse_coun < 12))
{
single_wire.buff[single_wire.byte_coun] |= pgm_read_byte(&bit_code[single_wire.bit_coun]);
single_wire.bit_coun++;
}
else if ((single_wire.pluse_coun >= 3)&&(single_wire.pluse_coun < 6))
{
single_wire.buff[single_wire.byte_coun] &= ~pgm_read_byte(&bit_code[single_wire.bit_coun]);
single_wire.bit_coun++;
}
// 接收满 8 比特,接收下一个字节
if (single_wire.bit_coun >= 8)
{
single_wire.bit_coun = 0;
// 字节数自动累加
single_wire.byte_coun ++;
if (single_wire.byte_coun >= SINGLE_RECEIVE_MAX)
{
single_wire.byte_coun = 0;
single_wire.bit_coun = 0;
single_wire.transmit_status = SINGLE_WIRE_MODULE_RECEIVE_OK;
}
}
break;
}
single_wire.pluse_coun = 0;
}
}
else if (single_wire.transmit_status == SINGLE_WIRE_MODULE_SEND)
{
TCNT0 = 0xCE; //set count
// 发送脉冲时间计数
single_wire.pluse_coun++;
switch (single_wire.code_status)
{
case SINGLE_WIRE_CODE_IDLE_PULSE: // 发送起始码
if (single_wire.pluse_coun <= 20)
{
SINGLE_WIRE_SEND_LOW();// 发送高
}
else if (single_wire.pluse_coun <= 40)
{
SINGLE_WIRE_SEND_HIGH(); // 发送低
}
else
{
single_wire.pluse_coun = 0;
single_wire.code_status = SINGLE_WIRE_CODE_DATA;
}
break;
case SINGLE_WIRE_CODE_DATA: // 发送数据
// 根据数据来确定数据长度
if (single_wire.buff[single_wire.byte_coun]
&pgm_read_byte(&bit_code[single_wire.bit_coun]))
{
single_wire.data_width = 12;
}
else
{
single_wire.data_width = 6;
}
// 脉冲一半时间发低电平
if (single_wire.pluse_coun <= single_wire.data_width/2)
{
SINGLE_WIRE_SEND_LOW();//
}
// 脉冲一半时间发高电平
else if (single_wire.pluse_coun <= single_wire.data_width)
{
SINGLE_WIRE_SEND_HIGH(); //
}
else
{
// 脉冲计数时间与设定时间相等时
// 发送下一位数据
single_wire.pluse_coun = 0;
single_wire.bit_coun++;
// 发送满 8 比特则发送下一个字节
if (single_wire.bit_coun >= 8)
{
single_wire.bit_coun = 0;
single_wire.byte_coun++;
// 发送总字节数
if (single_wire.byte_coun >= SINGLE_TRANSMIT_MAX)
{
//single_wire.transmit_status = SINGLE_WIRE_MODULE_SEND_OK;
TCCR0A = 0x00; //; //start Timer
single_wire_init(SINGLE_WIRE_CODE_IDLE_PULSE,SINGLE_WIRE_MODULE_RECEIVE);
TCCR0A = 0x02; //; //start Timer
}
}
}
break;
}
}
} |
|