/*
2006.12.31
广成电子有限公司
BY Mr.DC
*/
#include <iot2313v.h>
#include <macros.h>
#define SGIN 0x02//0x02//0x00// //输入信号极性选择(为0时反相) ok 0xoo,dk ft-60r 0x02 0x00//
#define DR0 0x04 //接收数据率选择(1200bps)
#define DR1 0x00
#define CSEL 0x40 //选择COUT脚输出时钟率(76.8kHz)
#define CDIS 0x00 //关闭COUT时钟输出(置位时时钟输出有效)
#define EE0 0x01
#define EE1 0x02
#define ADRS 0x00
#define OR0 0x00
#define OR1 0x00
#define POS_BUSY (1 << PD3)
#define POS_DI (1 << PD4)
#define POS_CLK (1 << PD5)
#define POS_INT (1 << PD2)
#define POS_ORNG (1 << PB2)
#define POS_CS (1 << PB3)
#define POS_DO (1 << PB4)
#define POS_DDR DDRD
#define POS_PORT PORTD
#define POS_PIN PIND
#define POS_CS_DDR DDRB
#define POS_CS_PORT PORTB
#define POS_CS_PIN PINB
#define SET_POS_INT_TO_OUT POS_DDR |= POS_INT;POS_PORT |= POS_INT;
#define SET_POS_INT_TO_IN POS_DDR &= ~POS_INT;POS_PORT |= POS_INT;
#define POS_INT_H POS_PORT |= POS_INT;
#define POS_INT_L POS_PORT &= ~POS_INT;
#define POS_INT_IF_L (POS_PIN&POS_INT)==0
#define POS_INT_IF_H (POS_PIN&POS_INT)==POS_INT
#define SET_POS_DO_TO_OUT POS_CS_DDR |= POS_DO;POS_CS_PORT |= POS_DO;
#define SET_POS_DO_TO_IN POS_CS_DDR &= ~POS_DO;POS_CS_PORT |= POS_DO;
#define POS_DO_H POS_CS_PORT |= POS_DO;
#define POS_DO_L POS_CS_PORT &= ~POS_DO;
#define POS_DO_IF_L (POS_CS_PIN&POS_DO)==0
#define POS_DO_IF_H (POS_CS_PIN&POS_DO)==POS_DO
#define SET_POS_BUSY_TO_OUT POS_DDR |= POS_BUSY;POS_PORT |= POS_BUSY;
#define SET_POS_BUSY_TO_IN POS_DDR &= ~POS_BUSY;POS_PORT |= POS_BUSY;
#define POS_BUSY_H POS_PORT |= POS_BUSY;
#define POS_BUSY_L POS_PORT &= ~POS_BUSY;
#define POS_BUSY_IF_L (POS_PIN&POS_BUSY)==0
#define POS_BUSY_IF_H (POS_PIN&POS_BUSY)==POS_BUSY
#define SET_POS_ORNG_TO_OUT POS_CS_DDR |= POS_ORNG;POS_CS_PORT |= POS_ORNG;
#define SET_POS_ORNG_TO_IN POS_CS_DDR &= ~POS_ORNG;POS_CS_PORT |= POS_ORNG;
#define POS_ORNG_H POS_CS_PORT |= POS_ORNG;
#define POS_ORNG_L POS_CS_PORT &= ~POS_ORNG;
#define POS_ORNG_IF_L (POS_CS_PIN&POS_ORNG)==0
#define POS_ORNG_IF_H (POS_CS_PIN&POS_ORNG)==POS_ORNG
#define SET_POS_DI_TO_OUT POS_DDR |= POS_DI;POS_PORT |= POS_DI;
#define SET_POS_DI_TO_IN POS_DDR &= ~POS_DI;POS_PORT |= POS_DI;
#define POS_DI_H POS_PORT |= POS_DI;
#define POS_DI_L POS_PORT &= ~POS_DI;
#define POS_DI_IF_L (POS_PIN&POS_DI)==0
#define POS_DI_IF_H (POS_PIN&POS_DI)==POS_DI
#define SET_POS_CLK_TO_OUT POS_DDR |= POS_CLK;POS_PORT |= POS_CLK;
#define SET_POS_CLK_TO_IN POS_DDR &= ~POS_CLK;POS_PORT |= POS_CLK;
#define POS_CLK_H POS_PORT |= POS_CLK;
#define POS_CLK_L POS_PORT &= ~POS_CLK;
#define POS_CLK_IF_L (POS_PIN&POS_CLK)==0
#define POS_CLK_IF_H (POS_PIN&POS_CLK)==POS_CLK
#define SET_POS_CS_TO_OUT POS_CS_DDR |= POS_CS;POS_CS_PORT |= POS_CS;
#define SET_POS_CS_TO_IN POS_CS_DDR &= ~POS_CS;POS_CS_PORT |= POS_CS;
#define POS_CS_H POS_CS_PORT |= POS_CS;
#define POS_CS_L POS_CS_PORT &= ~POS_CS;
#define POS_CS_IF_L (POS_CS_PIN&POS_CS)==0
#define POS_CS_IF_H (POS_CS_PIN&POS_CS)==POS_CS
/*
sbit DO=P1^0; //POCSAG DECODER解码数据输出
sbit BUSY=P1^1; //POCSAG DECODER忙标志
sbit DI=P1^3; //POCSAG DECODER控制数据输入
sbit CLK=P1^4; //POCSAG DECODER与MCU串行通信时钟
sbit CS=P1^5; //POCSAG DECODER片选
sbit RESET=P1^6; //POCSAG DECODER复位控制
sbit INT=P3^2; //POCSAG解码数据有效请求
*/
void delay(void); //延时函数声明
void RUN(void); //启动函数声明
void ReadMsg(void); //读消息函数声明
void WriteReg(unsigned char,unsigned char); //写寄存器函数声明
void set_pos_int(void);
unsigned char Msg[20],remained;
unsigned long int ID=1234000;
unsigned char msgcout;
unsigned char pos_int_f = 0;
void Usart1_init(void);
void putchar(unsigned char tx_data);
void main(void)
{
unsigned int dly;
unsigned char ch,cn;
//RESET=0;
for(dly=0;dly<500;dly++);
//RESET=1;
//设置串口工作方式和波特率
asm("cli");
asm("wdr");
WDTCR = 0b10111001;
WDTCR = 0b10111001;
Usart1_init();
set_pos_int();
SET_POS_ORNG_TO_OUT;
SET_POS_DI_TO_OUT;
SET_POS_CLK_TO_OUT;
SET_POS_CS_TO_OUT;
SET_POS_INT_TO_IN;
SET_POS_DO_TO_IN;
SET_POS_BUSY_TO_IN;
WriteReg(0x1a,CDIS+CSEL+DR1+DR0+SGIN); //设置OTHERS寄存器0中各位
for(dly=0;dly<500;dly++);
WriteReg(0x1b,OR1+OR0+ADRS+EE1+EE0); //设置OTHERS寄存器1中各位
for(dly=0;dly<500;dly++);
remained=(unsigned char)(ID%8);
ID=ID/8;
ch=(unsigned char)(ID&0xff); //设置接收地址
WriteReg(0x00,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)((ID>>8)&0xff);
WriteReg(0x01,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)((ID>>16)&0xff);
WriteReg(0x02,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)(remained<<3); //设置帧选择寄存器
WriteReg(0x18,ch);
for(dly=0;dly<500;dly++);
////////////////////
ID=1234008;//校时地址
remained=(unsigned char)(ID%8);
ID=ID/8;
ch=(unsigned char)(ID&0xff); //设置接收地址
WriteReg(0x04,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)((ID>>8)&0xff);
WriteReg(0x05,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)((ID>>16)&0xff);
WriteReg(0x06,ch);
for(dly=0;dly<500;dly++);
ch=(unsigned char)(remained<<3); //设置帧选择寄存器
WriteReg(0x18,ch);
for(dly=0;dly<500;dly++);
RUN(); //调用启动函数以开始接收消息
asm("sei");
putchar('O');
putchar('K');
while(1)
{
asm("wdr");
//putchar('U');
if (pos_int_f == 0x55)
{
pos_int_f = 0x00;
for(cn=0;cn<20;cn++) Msg[cn]=0;
//putchar('#');
ReadMsg(); //调用读消息函数
}
}
}//main
//*****************************************************
//定义延时函数
void delay(void)
{
unsigned int cn;
for(cn=0;cn<200;cn++);
for(cn=0;cn<200;cn++);
}//delay
//****************************************************
//定义写寄存器函数
void WriteReg(unsigned char i,unsigned char j)
{
unsigned char cn,ch;
//while(!BUSY);
while(POS_BUSY_IF_L);
//CS=0;
POS_CS_L;;
ch=0x20+i;
for(cn=0;cn<8;cn++)
{
if(ch&0x01){POS_DI_H;} else {POS_DI_L;}
POS_CLK_L; delay(); POS_CLK_H; delay();
ch=ch>>1;
}
ch=j;
for(cn=0;cn<8;cn++)
{
if(ch&0x01){ POS_DI_H;} else {POS_DI_L;}
POS_CLK_L; delay(); POS_CLK_H; delay();
ch=ch>>1;
}
POS_CS_H;
}//WiteReg
//********************************************************
//定义启动函数
void RUN(void)
{
unsigned char cn;
//while(!BUSY);
while(POS_BUSY_IF_L);
POS_CS_L;
for(cn=0;cn<8;cn++)
{
POS_DI_H;
POS_CLK_L; delay(); POS_CLK_H; delay();
}
POS_CS_H;
}//RUN
//*********************************************************
//定义读消息函
void ReadMsg(void)
{
unsigned char cn,ch,s0,s1,sn,d;
//while(!BUSY);
while(POS_BUSY_IF_L);
//CS=0;
POS_CS_L;
ch=0x80; s1=0; //Read Status0 Command output
for(cn=0;cn<8;cn++)
{
if(ch&0x01) {POS_DI_H;} else {POS_DI_L;}
POS_CLK_L; delay(); POS_CLK_H; delay();
s1=s1>>1; if(POS_DO_IF_H) s1|=0x80; ch=ch>>1; //Status1 Data read
}
//while(!BUSY);
while(POS_BUSY_IF_L);
ch=0x00; s0=0; //NOP Command output
for(cn=0;cn<8;cn++)
{
if(ch&0x01) {POS_DI_H;} else {POS_DI_L;}
POS_CLK_L; delay(); POS_CLK_H; delay();
s0=s0>>1; if(POS_DO_IF_H) s0|=0x80; ch=ch>>1; //Status0 Data read
}
if(s0&0x06) goto end1; //如缓冲区已无消息数据或消息误码>=2bit则结束
//while(!BUSY);
while(POS_BUSY_IF_L);
ch=0xb0; //Read DREG Command output(设置数据输出格式为4bit)
for(cn=0; cn<8; cn++)
评论0