|
//本例實(shí)現(xiàn)單片機(jī)用pocsag碼向數(shù)字機(jī)發(fā)送pocsag數(shù)字28167的全部編碼
//包括引導(dǎo)碼、同步碼、閑置碼、地址碼、信息碼。、
//本例用stc12C5a60s2用32M晶振成功呼響了motorola大顧問(wèn)傳呼機(jī)
//本例僅供傳呼機(jī)愛(ài)好者地pocsag進(jìn)行了解和試驗(yàn),切勿用于商業(yè)用途
#include "STC12C5A60S2.H"
//#include "string.h"
//#include "intrins.h"
//#include"stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define TIMER0_ENABLE TR0=1;
#define TIMER0_DISABLE TR0=0;
#define TX P2_0 //數(shù)據(jù)輸出端
#define PTT P2_2 //PTT控制端
#define HIGH 1
#define LOW 0
unsigned long xdata addr; //地址
uchar Tx_Num;//地址碼發(fā)射次序
bit TM0_FLAG=0;
void UartInit(void) //9600bps@32.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0x98; //設(shè)定定時(shí)初值
TH1 = 0x98; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
// TI = 1;
}
void Delay200ms() //@32MHz
{
unsigned char i, j, k;
i = 25;
j = 82;
k = 145;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned long calc_bch_and_parity( unsigned long cw_e ) //BCH校驗(yàn)和奇偶校驗(yàn)函數(shù)
{
uchar i;
uchar parity = 0; //奇偶校驗(yàn)計(jì)數(shù)
unsigned long local_cw; //臨時(shí)存放數(shù)
local_cw=cw_e;//保存cw_e參數(shù)值
for(i=1;i<=21; i++,cw_e<<=1)
if (cw_e & 0x80000000) cw_e ^= 0xED200000;
cw_e=cw_e&0xFFC00000;//保留前10位,BCH校驗(yàn)值共11位,只保留前10位有效數(shù)據(jù)
local_cw |= (cw_e >> 21); //BCH校驗(yàn)數(shù)移至第22位到31位,BCH共10位,并和原始數(shù)據(jù)相加
cw_e=local_cw;
for(i=0; i<31; i++, cw_e<<=1) if(cw_e&0x80000000) parity++;
if(parity%2) local_cw+=1;//從1至31位判斷為奇數(shù)則后面加1補(bǔ)充為偶數(shù)
return local_cw;
}
unsigned long calc_addr( unsigned long add,uchar fun ) //地址轉(zhuǎn)換,第1參數(shù)為地址,第2參數(shù)為功能
{
unsigned long adr;
unsigned long tem;
Tx_Num=(uchar)(add&0x00000007);//獲取地址發(fā)射的幀位次,111位第7幀,后3位地址數(shù)據(jù)隱藏不發(fā)送,接收按幀位還原
adr=0x00;
adr=add&0xFFFFFFF8; //去掉地址碼后3位
adr=adr<<10; //地址左移10位
tem=0x00;
tem=fun; //功能位
tem=tem<<11;//功能位左移11位,功能位為00 01 10 11四種狀態(tài),代表4個(gè)地址碼
adr=adr|tem; //地址碼和功能位合成地址碼;
return adr;
}
void IntTimer0() interrupt 1 //設(shè)定中斷時(shí)間為0.8333毫秒,1/1200=0.8333,1200比特速率
{
TL0 = 0x53; //設(shè)置定時(shí)初值
TH0 = 0xF7; //設(shè)置定時(shí)初值
TM0_FLAG=1;
}
void WaitTF0( void )
{
while(!TM0_FLAG);
TM0_FLAG=0; //清標(biāo)志位
}
void Send_start(unsigned long s)
{
uchar i,n;
unsigned long tem;
for(i=0;i<20;i++) //發(fā)送576個(gè)前導(dǎo)10101010101010
{
tem=s;
for (n=0;n<32;n++)
{
if(tem&0x80000000)TX= HIGH ;else TX=LOW;
WaitTF0();//等待延時(shí)結(jié)束 0.833ms
tem<<=1;
}
}
}
void Send_nill()//發(fā)送閑置位
{
uchar n;
unsigned long s=0x7A89C197;
for(n=0;n<32;n++)
{
if(s&0x80000000)TX= HIGH ;else TX=LOW;
WaitTF0();//等待延時(shí)結(jié)束 0.833ms
s<<=1;
}
}
void Send_Num(unsigned long s) //發(fā)送數(shù)據(jù)
{
uchar n;
for (n=0;n<32;n++)
{
if(s&0x80000000)TX= HIGH ;else TX=LOW;
WaitTF0();//等待延時(shí)結(jié)束 0.833ms
s<<=1;
}
}
void Print_code(unsigned long p) //串口打印,用于測(cè)試BCH值
{
uchar i;
unsigned long t;
t=p;
for(i=0;i<32;i++,t<<=1)
{
if(t&0x80000000)
{
SBUF=0x31;
while(TI==0);
TI=0;
}
else
{
SBUF=0x30;
while(TI==0);
TI=0;
}
}
SBUF=0x0D;
while(TI==0);
TI=0;
SBUF=0x0A;
while(TI==0);
TI=0;
t=p;
t<<=21;
for(i=0;i<10;i++,t<<=1)
{
if(t&0x80000000)
{
SBUF=0x31;
while(TI==0);
TI=0;
}
else
{
SBUF=0x30;
while(TI==0);
TI=0;
}
}
SBUF=0x0D;
while(TI==0);
TI=0;
SBUF=0x0A;
while(TI==0);
TI=0;
}
main()
{
uchar i,n;
unsigned long tem;
unsigned long star;
unsigned long sync; //同步碼
unsigned long mess; //信息碼
UartInit(); //串口初始化
TMOD|=0x01; //定時(shí)器0為模式1 (16位定時(shí)器)
TL0 = 0x53; //設(shè)置定時(shí)初值
TH0 = 0xF7; //設(shè)置定時(shí)初值
ET0=1; //定時(shí)器0充許中斷
TR0=0;
EA=1; //開(kāi)總中斷
TX = 0;
P2M0 = 0x01;//設(shè)P2_0為推挽輸出模式
P2M1 = 0x00;
PTT= 0;
star = 0xAAAAAAAA; //前導(dǎo)碼
sync = 0x7CD215D8; //同步碼
tem=calc_addr(1234567,1);//前面是地址碼,后面是BB機(jī)內(nèi)00 01 10 11 代表0,1,2,3種不同的聲音
addr=calc_bch_and_parity(tem);//取得BCH校驗(yàn)后的地址碼序列
mess=calc_bch_and_parity( 0xA0C37000);//信息碼28167數(shù)字碼,取0010(2)的反順序0100輸入
Print_code(mess); //從串口打印32位信息碼和BCH校驗(yàn)碼
while(1)
{
PTT = 0;
Delay200ms();
TL0 = 0x53; //設(shè)置定時(shí)初值
TH0 = 0xF7; //設(shè)置定時(shí)初值
TIMER0_ENABLE; //啟動(dòng)定時(shí)器
Send_start(star); //引導(dǎo)碼
Send_Num(sync); //同步碼
for(i=0;i<8;i++) //發(fā)送一個(gè)批次,共8幀數(shù)據(jù)
{
if(Tx_Num==i) //計(jì)算地址碼插入的幀位,本例為第7幀
{
Send_Num(addr); //地址碼
Send_Num(mess); //信息碼
}
else
{
Send_nill(); //閑置碼
Send_nill(); //閑置碼
}
}
Send_Num(0xFFFFFFFF);
TX=LOW;
TIMER0_DISABLE;
Delay200ms();
Delay200ms();
Delay200ms();
Delay200ms();
Delay200ms();
PTT = 1;
}
}
|
|