📄 rdr.c
字号:
//特殊功能寄存器定义
unsigned char a @ 0x05;
unsigned char status @ 0x0a;
unsigned char intc @ 0x0b;
unsigned char tmr @ 0x0d;
unsigned char tmrc @ 0x0e;
unsigned char pa @ 0x12;
unsigned char pac @ 0x13;
unsigned char pb @ 0x14;
unsigned char pbc @ 0x15;
unsigned char pc @ 0x16;
unsigned char pcc @ 0x17;
//状态寄存器位定义
#define c _0a_0
#define ac _0a_1
#define z _0a_2
#define ov _0a_3
#define pdf _0a_4
#define to _0a_5
//中断控制寄存器位定义
#define emi _0b_0
#define eei _0b_1
#define eti _0b_2
#define eif _0b_4
#define t0f _0b_5
//定时器控制寄存器tmrc位定义
#define psc0 _0e_0
#define psc1 _0e_1
#define psc2 _0e_2
#define te0 _0e_3
#define ton0 _0e_4
#define tm0 _0e_6
#define tm1 _0e_7
//端口管脚位定义
#define pa0 _12_0
#define pa1 _12_1
#define pa2 _12_2
#define pa3 _12_3
#define pa4 _12_4
#define pa5 _12_5
#define pa6 _12_6
#define pa7 _12_7
#define pb0 _14_0
#define pc0 _16_0
#define pc1 _16_1
unsigned char RadarStep @ 0x70;//接收步骤计数器
unsigned char RadarHcount @ 0x71;//雷达高电平脉宽计数器
unsigned char RadarLcount @ 0x72;//雷达低电平脉宽计数器
unsigned char RadarHcountbuf @ 0x73;//高电平脉宽计数值缓存
unsigned char RadarLcountbuf @ 0x74;//低电平脉宽计数值缓存
unsigned char Have_RadarData_Flg @ 0x75;//接收到有效雷达信号态标志缓存器
unsigned char holdtime @ 0x76;
unsigned char SyncOK_HoldTimer @ 0x77;
unsigned char Header_OK @ 0x78;
unsigned char Hpa0 @ 0x79;
unsigned char pa0count @ 0x7b;
//unsigned char pa0count1 @ 0x7c;
unsigned char RadarDataBitCount @ 0x7a; //雷达数据bit位计数
unsigned char RadarStart @ 0x7e; //雷达引导码0xAA
#define RadarStartBit0 _7e_0
#define RadarStartBit1 _7e_1
#define RadarStartBit2 _7e_2
#define RadarStartBit3 _7e_3
#define RadarStartBit4 _7e_4
#define RadarStartBit5 _7e_5
#define RadarStartBit6 _7e_6
#define RadarStartBit7 _7e_7
unsigned char RadarData @ 0x7f; //收到的雷达数据
#define RadarDataBit0 _7f_0
#define RadarDataBit1 _7f_1
#define RadarDataBit2 _7f_2
#define RadarDataBit3 _7f_3
#define RadarDataBit4 _7f_4
#define RadarDataBit5 _7f_5
#define RadarDataBit6 _7f_6
#define RadarDataBit7 _7f_7
#pragma vector isr_extint @ 0x4
#pragma vector isr_timer @ 0x8
//ISR for safequard
// external ISR
void isr_extint()
{
// eif = 0; //清标志
eei = 0; //屏蔽外部中断
if(Have_RadarData_Flg)
{
RadarHcount = 0;
RadarLcount = 0;
return;
}
RadarHcountbuf =RadarHcount;
RadarLcountbuf =RadarLcount;
RadarHcount = 0;
RadarLcount = 0;
// t0f = 0;
// ton0= 0;
// tmr =0x83;
// ton0= 1;
switch(RadarStep)
{
case 0:
if(RadarHcountbuf>=52 && RadarHcountbuf<=60)
{
RadarHcountbuf=0;
RadarHcountbuf=0;
RadarStep=1;
RadarDataBitCount=0;
eei=1;
return;
}
else goto Checking_error;
break;
case 1:
RadarDataBitCount++;
if((RadarLcountbuf>=4 && RadarLcountbuf<=9)&&(RadarHcountbuf>=1 && RadarHcountbuf<=4))
{
RadarHcountbuf = 0;
RadarLcountbuf = 0;
switch(RadarDataBitCount)
{
case 1:RadarStartBit7=1;break;
case 2:RadarStartBit6=1;break;
case 3:RadarStartBit5=1;break;
case 4:RadarStartBit4=1;break;
case 5:RadarStartBit3=1;break;
case 6:RadarStartBit2=1;break;
case 7:RadarStartBit1=1;break;
case 8:RadarStartBit0=1;break;
case 9:RadarDataBit7=1;break;
case 10:RadarDataBit6=1;break;
case 11:RadarDataBit5=1;break;
case 12:RadarDataBit4=1;break;
case 13:RadarDataBit3=1;break;
case 14:RadarDataBit2=1;break;
case 15:RadarDataBit1=1;break;
case 16:RadarDataBit0=1;break;
default:break;
}
}
else if((RadarLcountbuf>=1 && RadarLcountbuf<=4)&&(RadarHcountbuf>=4 && RadarHcountbuf<=9))
{
RadarHcountbuf = 0;
RadarLcountbuf = 0;
switch(RadarDataBitCount)
{
case 1:RadarStartBit7=0;break;
case 2:RadarStartBit6=0;break;
case 3:RadarStartBit5=0;break;
case 4:RadarStartBit4=0;break;
case 5:RadarStartBit3=0;break;
case 6:RadarStartBit2=0;break;
case 7:RadarStartBit1=0;break;
case 8:RadarStartBit0=0;break;
case 9:RadarDataBit7=0;break;
case 10:RadarDataBit6=0;break;
case 11:RadarDataBit5=0;break;
case 12:RadarDataBit4=0;break;
case 13:RadarDataBit3=0;break;
case 14:RadarDataBit2=0;break;
case 15:RadarDataBit1=0;break;
case 16:RadarDataBit0=0;break;
default:break;
}
}
else
{
goto Checking_error;
}
if(RadarDataBitCount==16)
{
RadarDataBitCount=0;
if((RadarStart==0xAA)&&(RadarData==0x43 || RadarData==0x4B || RadarData==0x53 || RadarData==0x5B || RadarData==0x80))
{
RadarStart=0;
// RadarData=0;
Have_RadarData_Flg=1;
SyncOK_HoldTimer=0; // 雷达同步时间
Header_OK=1; //控制雷达同步
}
else if((RadarStart==0xAA)&&(RadarData==0x55))
{
SyncOK_HoldTimer=0; // 雷达同步时间
Header_OK=1; //控制雷达同步
}
RadarHcountbuf = 0;
RadarLcountbuf = 0;
RadarStep=0;
eei=1;
return;
}
break;
default:break;
}
RadarHcountbuf = 0;
RadarLcountbuf = 0;
eei=1;
return;
Checking_error :
RadarStep = 0;
RadarHcountbuf = 0;
RadarLcountbuf = 0;
RadarDataBitCount=0;
eei=1; // enable Ext int
return;
}
// timer ISR -125us
void isr_timer()
{
// t0f = 0; //清标志
if(pc0)
RadarHcount++;
else
RadarLcount++;
holdtime++;
if( holdtime>=240)
{
holdtime=0;
SyncOK_HoldTimer++;
}
if(Hpa0)
{
pa0count++;
if(pa0count==80)
{
pa0count=0;
Hpa0=0;
pa0=1;
pa1=1;
pa3=1;
pa4=1;
}
}
return;
}
//initialize registers for safeguard
void safeguard_init()
{
intc = 0;
tmrc = 0;
tmr = 0x83;
pac = 0xff; //input mode
pbc = 0xff;
pcc = 0xff;
}
void SyncHeadOK_Clr() //070622
{//取得同步时SyncOK_HoldTimer清0,
if(SyncOK_HoldTimer>=130)
{//超时仍未取得再次同步,清除同步信号标志 大概3秒
Header_OK=0;
SyncOK_HoldTimer=0;
}
}
void main()
{
unsigned char i,j;
safeguard_init();
//i/o port initial:
pac = 0x00; //0000-0000B
pbc=0xfe;
pa = 0x00;
pc = 0xff;
pb=0;
//变量初始化:
RadarStep=0;
RadarHcount = 0;
RadarLcount = 0;
RadarHcountbuf=0;
RadarLcountbuf=0;
Have_RadarData_Flg=0;
RadarDataBitCount=0;
RadarStart=0;
RadarData=0;
holdtime=0;
SyncOK_HoldTimer=0;
Header_OK=0;
pa0count=0;
// pa0count1=0;
//set timer/counter as a pulse width measurement mode (脉宽测量模式)
//设置定时/计数器工作方式为:定时器模式, bit7-bit6: 10
//开定时器: bit4 =1;
//active edge(rising/falling):bit3: 0/1
// fint=fsys/4, bit2-bit0: 101, tmr_isr = 125us.
//tmr初始值0x83, 脉宽溢出周期=125us,@fsys=4.0MHz.
tmr = 0x83; //set tmr initial value
tmrc = 0x91; //10010001B
//set intc
//设置中断控制寄存器:
//清除中断标志: bit4-bit5 = 0;
//开启定时器: bit2 = 1;
//开启外部中断: bit1 = 1;
//开启全局中断: bit0 = 1;
intc = 0x07; //00000111B
while(1)
{
SyncHeadOK_Clr();
if(!Hpa0)
{
if(Header_OK) {pa4=1;pa3=1;pa1=1;pa0=1;}
else {pa4=0; pa3=0;pa1=0;pa0=0;}
}
if(Have_RadarData_Flg)
{
Have_RadarData_Flg=0;
switch(RadarData)
{
case 0x43: pa0=1;pa1=0;pa3=0;pa4=0;break;
case 0x4B: pa0=0;pa1=1;pa3=0;pa4=0;break;
case 0x53: pa0=0;pa1=0;pa3=1;pa4=1;break;
case 0x5B: pa0=1;pa1=1;pa3=0;pa4=0;break;
case 0x80: pa0=1;pa1=0;pa3=1;pa4=1;break;
default :break;
}
RadarData=0;
Hpa0=1;
}
// if(pa1) pb0=1;
// else pb0=0;
}//end while
}//end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -