📄 sendreceive26good.c
字号:
#include <c8051F330.h>
#include <Intrins.h>
sbit LED_send = P1^2;
sbit CE2 = P1^3;
sbit CS2 = P1^4;
sbit CLK2 = P1^5;
sbit DATA2 = P1^6;
sbit LED = P1^7;
sbit DR=P0^0;
bdata unsigned char temp; //可位寻址的变量temp
sbit bflag = temp^7;
char idata InitWord[15]; //初始化配置字
char idata Txword[6]; //发送的数据包
unsigned int i=0;
unsigned int j=3;
char new_comm = 0; //通讯完成标志
char rxword[3]; //接收端
unsigned char comrx=0;
char j_re=1;
char y,flag;
unsigned char m,n;
void Reset_Sources_Init();
void SYSCLK_Init();
void Interrupt_Init();
void Init_IO(void);
void Build_InitWord(void);
void Init_Config(void);
void Init_Send(void); //初始化发射模块
void init_recieve(void);
void Init_Tim1(void); //初始化定时器1,做波特率发生器
void ClockS(void); //产生发射时钟脉冲
void delay1(unsigned int x); //软件延时
void delay600ns(void);
void Send(void);//发送数据包
void watchdog_Init(void);
void UART_Init (void); //配置串口通讯
void main()
{
//int ii;
EA=0;
PCA0MD&=~0x40; // Disable Watchdog timer
PCA0CN=0x40;
Reset_Sources_Init();
SYSCLK_Init();
Init_IO();
Interrupt_Init (); //中断配置
UART_Init ();
Init_Tim1();
watchdog_Init();
Build_InitWord(); //构造初始化配置字
Init_Config();
init_recieve(); //配置接收模块
delay1(4998); //delay 3.125ms,Tpd2sby,min 3 ms
Txword[0]=0xcc;
Txword[1]=0xcc;
Txword[2]=0xcc;
Txword[3]=0;
Txword[4]=0;
Txword[5]=0;
i = 0;
EA = 1; //上位机通讯程序robotest接口测试
while(1)
{
PCA0CPH2=0x20;
if(new_comm==1)
{
Init_Send(); //配置发送模块
delay1(4998); //delay 3.125ms,Tpd2sby,min 3 ms
Send();
new_comm=0;
LED_send = ~LED_send;
init_recieve();
delay1(4998);
}
if(comrx==1)
{
comrx=0;
LED = ~LED;
}
}
}
void Reset_Sources_Init()
{
int i_reset = 0;
VDM0CN = 0x80;
for (i_reset = 0; i_reset < 350; i_reset++); // Wait 100us for initialization
RSTSRC = 0x02; // Enable VDD monitor as a Reset Source
}
void SYSCLK_Init ()
{
OSCICN = 0x83; // start external oscillator with
}
void Init_IO()
{
XBR0=0x01; // TX,RX分配到P0.0,P0.1
XBR1=0x40; //禁止弱上拉,允许交叉开关
P0MDIN=0xFC;
P0MDOUT=0x10;
P0SKIP = 0x03;
P1MDIN=0xFF;
P1MDOUT=0xBF;
//P1MDOUT=0xFF;
P2MDOUT=0xFF;
CPT0MX=0x00; //P0.0=CP0+ P0.1=CP0-
CPT0MD=0x20; //23; //上升沿允许
CPT0CN=0x80;
for(y=0;y<10;y++);
CPT0CN&=~0x30;
}
void Build_InitWord()
{
InitWord[0] = 0x18;
InitWord[1] = 0x18; //通道1数据长度8字节
InitWord[2] = 0x00;
InitWord[3] = 0x00;
InitWord[4] = 0xcc;
InitWord[5] = 0xcc;
InitWord[6] = 0xcc;
InitWord[7] = 0x00; //通道2地址
InitWord[8] = 0x00;
InitWord[9] = 0xcc;
InitWord[10] = 0xcc;
InitWord[11] = 0xcc; //通道1地址
InitWord[12] = 0x63; //8位地址(位7-2),8位CRC校验(位1),使能CRC(位0)
InitWord[13] = 0x6f; //one recieve(Bit7,0),Shock Mode(Bit6,1),Data rate(Bit 5)1M,Crystall(Bit4-2,011),RFPower(Bit1-0)
InitWord[14] = 0x05; //channal select(Bit7-1)2450M,RX/TX mode(Bit0,1 reciever mode)
}
void ClockS()
{
CLK2 = 1;
delay600ns(); //延时580ns,Th min 500ns
CLK2 = 0;
}
void Init_Config()
{
char Bytesend,Bitsend;
/**********配置接收模块*************/
CE2 = 0;
delay600ns(); //延时580ns,Td min 50ns
CS2 = 1; //配置模式,CS=1,CE=0
CLK2 = 0;
delay1(7); //延时5458ns,Tcs2data min 5us
for(Bytesend=0;Bytesend<15;Bytesend++) //前三个测试字节可以不发!!!
{
temp=InitWord[Bytesend];
for(Bitsend=0;Bitsend<8;Bitsend++)
{
DATA2 = bflag;
delay600ns(); //延时580ns
ClockS();
temp = temp<<1;
}
}
CS2 = 0;
CE2 = 1; //配置为工作模式
}
void Init_Send()
{
InitWord[14] = 0x04;
Init_Config();
// P1MDOUT=0xFF; //发送
}
void init_recieve()
{
InitWord[14] = 0x05;
Init_Config();
P1MDOUT=0xBF; //直接影响收到数据与否
// DATA2=1;
// delay1(337);
}
void Send()
{
char ByteTx,BitTx;
for(ByteTx=0;ByteTx<6;ByteTx++) //真正与小车通讯时为26(23+3)字节,与开发板通讯时为13字节(5+8)
{
temp = Txword[ByteTx];
for(BitTx=0;BitTx<8;BitTx++)
{
DATA2=bflag;
TR0=1;
delay600ns(); //延时580ns
ClockS(); //
temp=temp<<1;
}
}
j=3;
CE2 = 0; //启动数据发送
delay1(1000);//1000
CE2 = 1; //置为工作态,为下次发送准备
delay600ns(); //延时580ns,Td
}
void delay1(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 Interrupt_Init (void)
{
// IP = 0x10; // Interrupt Priority
IE = 0x90; // Interrupt Enable
EIE1=0x20;
EIP1=0x20;
IP=0x00; // Interrupt Priority
}
void serve_cp0() interrupt 12 //上升沿中断,CMR通讯来临!
{
char p,q;
char Rx_Cou;
CPT0CN&=~0x30; //clear interrupt pending flags
EA=0;
// delay1(168);
delay1(84); //51us,Td(min 50 ns)+Tdr2clk(min 50 us)
for(p=0;p<3;p++)
{
temp=0;
for(q=0;q<8;q++)
{
temp=temp<<1;
CLK2=1;
delay600ns();
temp|=DATA2;
CLK2=0;
delay600ns();
}
rxword[p]=temp;
}
for(Rx_Cou=0;Rx_Cou<3;Rx_Cou++)
{
SBUF0=rxword[Rx_Cou];
while(TI0==0);
TI0=0;
}
EA=1;
flag=1;
comrx=1;
}
void comm(void) interrupt 4
{
if(RI0==1)
{
RI0=0;
if(j<6)
Txword[j++]=SBUF0;
}
if(j==6)
new_comm=1;
}
void UART_Init (void)
{
SCON0 = 0x70; // Serial Port Control Register(01110000b),方式1,8位可变波特率
}
void Init_Tim1(void)
{
TCON = 0x40;
TMOD = 0x20;
CKCON=0x02;//2400
// CKCON=0x08;//115200
TL1=0x96;
TH1 = 0x96;
}
void watchdog_Init(void)
{
PCA0CN=0x40; //允许PCA计数器功能
PCA0MD=0x40; //允许看门狗定时器,并设系统时钟为计数时钟
PCA0CPL2=0xff; //设定复位时间为32ms
PCA0CPH2=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -