📄 function.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include "main.h"
#include <avr/eeprom.h>
void Capture_init(void)
{
// 信号输入 PD3
ClrBit(PORTD,PD3); // Output Low
ClrBit(DDRD,DDD3); //Input,
SetBit(PORTD,PD5); // Output High
SetBit(DDRD,DDD5);
// Time 2 Setting
TCCR2A = _BV(WGM21); //比较匹配发生时OC2A 清零
TCCR2B = _BV(CS22); //clkT2S/64 ( 来自预分频器)
OCR2A = 25; // 64 * N = 1600
TCNT2 =0;
sei();
}
void Start_Mark_Space(void)
{
if(Start_Flag) //检测数据
{
if(DataBit_Flag) //检测DateBit_Mark
{
Start_Mark(); }
else //检测DateBit_Space
{ Start_Space(); }
if(DateByte_counter==4) //接收完4 Byte 数据
{
DateBite_counter=0; //Bit计数清零
DateByte_counter=0; //Byte计数清零
Start_Flag=0; //下一次检测Start,
DataBit_Flag=1;
if((DateBite[0]==(0xff-DateBite[1]))&&(DateBite[2]==(0xff-DateBite[3])))
{
Uart_putc(DateBite[0]);
Uart_putc(DateBite[1]);
Uart_putc(DateBite[2]);
Uart_putc(DateBite[3]);
}
Uart_putc(0xbb); //发送结束标志位到Uart
}
if (bit_is_set( TIFR2, OCF2A)) // 0.2 ms
{
SetBit( TIFR2, OCF2A);
if(++Time_Over40ms==250) //50ms未接收到数据则停止接收
{
Time_Over40ms=0;
Start_Flag=0; //下一次检测Start,
DataBit_Flag=1;
}
}
}
else //检测Start,
{
if (bit_is_set( TIFR2, OCF2A)) // 0.2 ms
{
SetBit( TIFR2, OCF2A);
if(Mark_Flag) //检测Start_Mark
{
Start_Mark();
}
else //检测Start_Space
{
Start_Space();
}
}
}
}
void Start_Mark(void)
{
Mark_Pre=PIND&0x08;
/* if(Mark_Rd != Mark_Pre ) //除抖动
{
Mark_Pre=Mark_Rd;
return;
}
*/
if ( Mark_Pre != Mark_Save )
{
if ( Mark_Pre ) //jump to Mark
{
Mark_Save = Mark_Pre;
goto Jumpto_Mark;
}else //Release_Mark
{
Mark_Save = Mark_Pre;
goto Release_Mark;
}
}else
{
if ( Mark_Save ) //保持 ,Mark
{
goto Keep_Mark;
}
}
return;
Release_Mark: //---------------------------------Release_Mark
if(Start_Flag)
{
if(40<=StartBit_counter && StartBit_counter<=80) //接收DateBit_Mark,400us--800us
{
DataBit_Flag=0;
Time_Over40ms=0;
}
else
{
DataBit_Flag=1;
Start_Flag=0;
Time_Over40ms=0;
}
}
else
{
if(30<=StartBit_counter && StartBit_counter<=60) //检测StartMark时间是否为6ms--12ms
{
Mark_Flag=0;
Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
}
else //未检测到StartMark
{
Mark_Flag=1;
Mark_Rd=0; Mark_Pre=0;Mark_Save=0;
}
}
StartBit_counter=0;
return;
Jumpto_Mark: //-----------------------------------Mark
StartBit_counter=0;
Keep_Mark: //------------------------------- //保持 ,Mark
StartBit_counter++;
}
void Start_Space(void)
{
Space_Pre=PIND&0x08;
/* if(Space_Rd != Space_Pre ) //除抖动
{
Space_Pre=Space_Rd;
return;
}
*/
if ( Space_Pre != Space_Save )
{
if ( !Space_Pre ) //jump to space
{
Space_Save = Space_Pre;
goto Jumpto_Space;
}else //Release_Space
{
Space_Save = Space_Pre;
goto Release_Space;
}
}else
{
if ( !Space_Save ) //保持 ,Space
{
goto Keep_Space;
}
}
return;
Release_Space: //---------------------------------Release_Space
if(Start_Flag)
{
if(40<=StartBit_counter && StartBit_counter<=80) //接收DateBit1_Space,400us--800us
{
DateBite[DateByte_counter] |= 0x01; //接收到"1"
if(++DateBite_counter>=8)
{
DateBite_counter=0;
++DateByte_counter;
}
DateBite[DateByte_counter]<<=1;
Time_Over40ms=0;
}
else if (120<=StartBit_counter && StartBit_counter<=240) //接收DateBit0_Space,1200us--2400us
{
if(++DateBite_counter==8)
{
DateBite_counter=0;
++DateByte_counter;
}
DateBite[DateByte_counter]<<= 1; //接收到"0"
Time_Over40ms=0;
}
else //接收出错
{
DateBite_counter=0;
DateByte_counter=0;
DataBit_Flag=1;
Start_Flag=0;
Time_Over40ms=0;
}
}
else
{
if(15<=StartBit_counter && StartBit_counter<=30) //检测StartSpace时间是否为3ms--6ms
{
Mark_Flag=1;
Start_Flag=1; //开始检测数据,标志位置位
Mark_Rd=0; Mark_Pre=0;Mark_Save=0;
Uart_putc(0xaa); //发送开始检测数据标志位到Uart
}
else //未检测到StartSpace
{
Mark_Flag=1;
Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
}
}
StartBit_counter=0;
return;
Jumpto_Space: //-----------------------------------space
StartBit_counter=0;
Keep_Space: //-------------------------------//保持 ,Space
StartBit_counter++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -