|
/**************************************
* PT2262软件解码 *
* 解码晶振4M *
**************************************/
#include <STC12C5A60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint irtime;
uchar dfnum; //接收次数
uchar dfstart; //接收开始标志
uint dfdata[24]; //数据收集存放区
uchar dfcode[3]; //解码完成存放区
uchar bitnum; //接收位选
uchar dfdataok; //数据收集完成标志
uchar dfcodeok; //解码完成标志
sbit LED1 = P0^1; //前导码判断成功开始数据接收指示
sbit LED2 = P0^2; //解码指示
sbit LED3 = P0^3;//解码成功指示
sbit df_in = P3^2;
sbit LED01 = P1^0;
sbit LED02 = P1^1;
sbit LED03 = P1^2;
sbit LED04 = P1^3;
uchar b; //接收次数标志
/******************************************
* 延时函数 *
******************************************/
void delay_ms(uint a) //@12.000MHz
{
unsigned char i, j;
for(;a !=0 ; a--)
{
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
}
/*******************************
* 初始化定时器0 *
*******************************/
void time0init()
{
TMOD = TMOD|0x01; //设置定时器为16位
TH0= 0;
TL0 =0;
// ET0 = 1; //开启定时器0中断
EA = 1;
TR0 = 1;
}
/*******************************
* 初始化外部中断0 *
*******************************/
void INT0init()
{
IT0 =1; //设置下降延触发
EX0 = 1; //开启中断
EA = 1;
}
/********************************************************************
* 串口初始化 *
* 速率:9600 晶振:4M
********************************************************************/
void init_rs232()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器
REN = 0; //开启串口数据接收功能
EA = 1; //开启总中断
ES = 1; //开启串口中断
TR1 = 1; //定时器启动
}
/*******************************************************************
* 串口数据传输函数 *
*******************************************************************/
void datas_pass(uchar tring)
{
SBUF = tring;
while(~TI);
TI = 0;
}
/****************************
* 解码 *
****************************/
void dfpros(void) //解码
{
uchar k,i,j;
uchar value;
k = 0;
for(j = 0 ; j<3 ;j++)
{
for(i = 0; i <8 ;i++)
{
value =value>>1;
if(dfdata[k]>250)
{
value =value|0x80;
}
k++;
}
dfcode[j] = value;
}
dfcodeok =1;
}
/*********************************
* 主函数 *
*********************************/
void main()
{
uchar a;
INT0init();
time0init();
init_rs232();
LED1 = 1; //前导码判断成功开始数据接收指示
LED2 = 1; //解码指示
LED3 = 1;
// YS = 1;
while(1)
{
if(dfdataok == 1)
{
LED2 =~LED2;
dfpros();
a = dfcode[2];
datas_pass(a);
dfdataok = 0;
}
if(dfcodeok ==1)
{
a = dfcode[2];
datas_pass(a);
if(a == 0x0c)
{
LED01 = ~LED01;
}
if(a == 0xc0)
{
LED02 = ~LED02;
}
if(a == 0x03)
{
LED03 = ~LED03;
}
if(a == 0x30)
{
LED04 = ~LED04;
}
dfcodeok =0;
}
delay_ms(4);
}
}
/****************************
* 定时器0 *
****************************/
void time0()interrupt 1
{
irtime++;
}
/****************************
* 外部中断0 *
****************************/
void INT0i()interrupt 0
{
uchar i;
EX0 = 0;
df_in =1;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(df_in==0&&TF0 ==0);
while(df_in==1&&TF0==0);
TR0 = 0;
if(TF0 ==1)
{
goto end;
}
irtime = TH0;
irtime =irtime <<8;
irtime = irtime +TL0;
if(irtime>3400&& irtime < 4300 ) //检测引导码
{
LED1 = ~LED1;
dfstart =1;
}
else //同步头判断失败就直接退出程序
{
goto end;
}
if(dfstart == 1) //同步头判断成功解码开始
{
for(i = 0;i<24;i++)
{
while(df_in == 1);
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(df_in==0);
TR0 = 0;
if(TF0 ==1)
{
b=0;
goto end;
}
irtime = TH0;
irtime =irtime <<8;
irtime = irtime +TL0;
dfdata[i] =irtime;
while(df_in == 1);
}
dfstart =0; //数据收集完成将同步标志位置0。
if(b == 2)
{
dfdataok=1;
b =0;
}
b++;
}
end:
TF0=0;
EX0 = 1;
TR0 = 0;
}
|
|