📄 tx_recieve.c
字号:
#include <c8051F330.h>
#include <intrins.h> // _nop_
sbit CE=P1^2;
sbit CS=P1^3;
sbit CLK=P1^4;
sbit DATA=P1^5;
sbit LED0=P0^7;
sbit DR=P0^0;
char rxword[3];
unsigned char comrx=0;
char y,flag;
unsigned char m,n;
char bdata CMRtemp;
sbit bflag=CMRtemp^7;
char initword[15]={
0x18,0x18, //通道2、通道1 数据包长度 11V11,23字节
0x00,0x00,0xcc,0xcc,0xcc, //通道2地址
0x00,0x00,0xcc,0xcc,0xcc, //通道1地址
0x63, //24位地址(位7-2),16位CRC校验(位1),使能CRC(位0)
0x6f, //one recieve(Bit7,0),Shock Mode(Bit6,1),Data rate(Bit 5)1M,Crystall(Bit4-2,011),RFPower(Bit1-0)
0x05 //channal select(Bit7-1)2450M,RX/TX mode(Bit0,1 reciever mode)
};
void init_io();
void Init_Config();
void delay(unsigned int x);
void delay600ns();
void clock();
void SYSCLK_Init();
void Interrupt_Init(); //中断配置
void UART_Init();
void Init_Tim1();
void watchdog_Init(void);
void Comparator_Init();
void Init_Device(void);
void main()
{
EA=0;
PCA0MD&=~0x40; // Disable Watchdog timer
PCA0CN=0x40;
Init_Device();
delay(4998); //delay 3.125ms,Tpd2sby,min 3 ms
EA=1;
LED0=1;
while(1)
{
PCA0CPH2=0x20;
if(comrx==1)
{
LED0 = ~LED0;
}
}
}
void Init_Device(void)
{
SYSCLK_Init();
init_io();
Interrupt_Init(); //中断配置
UART_Init();
Init_Tim1();
Comparator_Init();
watchdog_Init();
Init_Config();
}
void clock()
{
CLK=1;
delay600ns(); //延时580ns,Th min 500ns
CLK=0;
}
void init_io()
{
P0MDIN = 0xFC;
P0MDOUT = 0x80;
P1MDOUT = 0x1C;
P0SKIP = 0x03;
XBR1 = 0x40;
}
void Init_Config()
{
/**********配置接收模块*************/
CE=0;
delay600ns(); //Td min 50ns
CS=1; //配置模式,CS=1,CE=0
CLK=0;
delay(7); //延时5458ns,Tcs2data min 5us
for(m=0;m<15;m++)
{
CMRtemp=initword[m];
for(n=0;n<8;n++)
{
DATA=bflag;
delay600ns(); //Ts min 500ns
clock();
CMRtemp=CMRtemp<<1;
}
}
CS=0;
P1MDOUT=0xBF;
DATA=1;
CE=1; //配置为工作模式
delay(337); //Tsby2rx,203us,max 202us
}
void delay(unsigned int x) //x=1,41个时钟周期,1.7us;x=2,56个周期,2.3us(15个周期0.6us)
{ //该函数延时最长即x=65535为40ms
unsigned int i;
for(i=0;i<x;i++);
}
void delay600ns() //延时580ns,14个时钟周期
{
_nop_();
_nop_();
_nop_();
}
void SYSCLK_Init ()
{
OSCICN = 0x83; // start external oscillator with
}
void Comparator_Init()
{
int i;
CPT0CN = 0x80;
for (i = 0; i < 35; i++); // Wait 10us for initialization
CPT0CN &= ~0x30;
CPT0MX = 0x00;
CPT0MD = 0x22;
}
void Interrupt_Init (void)
{
IE = 0x98;
EIE1 = 0x20;
EIP1 = 0x20;
}
void Init_Tim1(void)
{
TCON = 0x40;
TMOD = 0x20;
CKCON=0x00; //9600
TL1=0x96;
TH1 = 0x96;
}
void serve_cp0() interrupt 12 //上升沿中断,CMR通讯来临!
{
char p,q;
CPT0CN&=~0x30; //clear interrupt pending flags
EA=0;
delay(84); //51us,Td(min 50 ns)+Tdr2clk(min 50 us)
for(p=0;p<3;p++)
{
CMRtemp=0;
for(q=0;q<8;q++)
{
CMRtemp=CMRtemp<<1;
CLK=1;
delay600ns();
CMRtemp|=DATA;
CLK=0;
delay600ns();
}
rxword[p]=CMRtemp;
}
EA=1;
LED0 = ~LED0;
SBUF0=rxword[0];
ES0=1;
if(TI0==1)
{
TI0=0;
}
}
void UART_Init()
{
SCON0 = 0x70; // Serial Port Control Register(01110000b),方式1,8位可变波特率
}
void watchdog_Init()
{
PCA0CN=0x40; //允许PCA计数器功能
PCA0MD=0x40; //允许看门狗定时器,并设系统时钟为计数时钟
PCA0CPL2=0xff; //设定复位时间为32ms
PCA0CPH2=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -