|
/**************************************
* 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;
}
|
|