📄 send8000(11.0592m).c
字号:
#define __SRC
#include "Config.h"
#undef __SRC
#define HALFSECTICKS 500 //12
#define SECTICKS 1000 //24
#define COMRBUFLEN 16
#define COMSBUFLEN 16
uchar TLV=0x00; //0xb0; //Now is 1000 times per seconds; //for 18432000,
uchar THV=0xfa; //0xff; //
uchar temptl0,tempth0;
sbit RLED = P1^2;
bit triggle=0,triggle1=0;
uint count=0;
#define PWR_ON 0
#define PWR_OFF 1
#define MOTO_FORW 1 /* 01 */
#define MOTO_BACK 2 /* 10 */
#define MOTO_STOP 3 /* 11 */
/************************************************************/
#define E2ADRSYS 0x00 /* 本系统于EEPROM中地址 */
uchar idata ADDRESS; /**/
uchar idata URT_buf; /* 串口接收数据缓冲器 */
uchar idata URT_cnt; /* 数据接收计数器 */
uchar idata URT_rcv,URT_cmd,URT_len;
/************************************************************/
uchar idata wrrdadr; /* EEPROM操作(读/写)首地址 */
uchar idata Databuf[16]; /* 16字节数据存储缓冲区 */
uchar idata comrbuf[COMRBUFLEN],comrbufp=0; /* 16字节数据存储缓冲区 */
uchar idata comsbuf[COMSBUFLEN],comsbufp=0; /* 16字节数据存储缓冲区 */
#define BUFADR Databuf[0] /* 系统地址 */
#define BUFPTST Databuf[1] /* 操作端口/状态 */
#define BUFHOUR Databuf[2] /* 时间:时 */
#define BUFMINT Databuf[3] /* 时间:分 */
extern ulong RX_ADDRESS;
#define RX_ADDRESS_0 RX_ADDRESS >> 24 //接收有效地址第1字节 Byte5 11100111
#define RX_ADDRESS_1 (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6 11100111
#define RX_ADDRESS_2 (RX_ADDRESS >> 8) & 0xff //接收有效地址第3字节 Byte7 11100111
#define RX_ADDRESS_3 RX_ADDRESS & 0xff //接收有效地址第4字节 Byte8 11100111
/*
uchar idata TX_ADDRESS[4]={0x50,0x51,0x52,0x53}; /* RF接收方地址 */
uchar idata TX_ADDRESS[4]={0xA0,0xA1,0xA2,0xA3}; /* RF接收方地址 */
/************************************************************/
uchar idata tim_cnt; /* 定时计数器 */
uchar idata tim_scd; /* 秒计数器 */
uchar idata tim_mnt;
uchar idata tim_hur;
bit bdata Flag_scd; /* 1秒标志位 */
/* 波特率发生器的初值fosc=7.3728MHz/(2*DIVM)=1.8432MHz */
/* 设置串口波特率 = Fosc / ((BRGR1,BRGR0)+16) */
#define BRGR1_DATA 0x00 /* 9600BPS = 00B0H */
#define BRGR0_DATA 0xB0 /* 2400BPS = 1DF0H */
/*==========================================================*/
void Spi_init(void);
void Config905(void); /* 配置nRF905 */
void ChangeMode(uchar num); /* RF模式配置 */
void RF905_Write(uchar RFcmd,uchar *RFdata); /* 配置nRF905写地址/数据 */
void RF905_Read(uchar RFcmd,uchar *RFdata); /* 配置nRF905读地址/数据 */
void Delayus(uchar xus);
void Delayms(uint xms)
{
//uint i = xus;
uint startc,endc;
startc=count;
endc=count;
while((endc+SECTICKS-startc)%SECTICKS < xms) endc=count;
}
/*==========================================================*/
/* 功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(写) */
/* 入口: ptr,写入数据首地址
/* e2adr,写入EEPROM首地址
/* length,写入数据长度
/* 出口: 无。
/************************************************************/
/*
void eeprom_write(uchar e2adr,uchar *ptr,uchar length)
{
uchar i,j;
i=j=0;
for(i=0;i<length;i++)
{
j=0;
DEECON = 0;
DEEDAT = ptr[i];
DEEADR = e2adr;
while(j==0)j=DEECON&0x80;
e2adr++;
}
}
*/
/*==========================================================*/
/* 功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(读) */
/* 入口: ptr,写入数据首地址
/* e2adr,写入EEPROM首地址
/* length,写入数据长度
/* 出口: 无。
/************************************************************/
/*
void eeprom_read(uchar e2adr,uchar *ptr,uchar length)
{
uchar i,j;
i=j=0;
for(i=0;i<length;i++)
{
j=0;
DEECON = 0;
DEEADR = e2adr;
while(j==0)j=DEECON&0x80;
ptr[i] = DEEDAT;
e2adr++;
}
}
*/
void uart_init(void)
{
//SCON=0x50; /* 串行口为方式1 SM2=0,REN=1 */
/* PCON|=0x40; /* SMOD0=1,使用FE标志位(与SSTAT.3是同一标志) */
//PCON=0x00;
//SSTAT=0x20; /* 禁止双缓冲使能,中断独立,每发送一字节产生一次中断 */
/* 设置串口波特率:Fosc / ((BRGR1,BRGR0)+16) */
//BRGCON=0x00; /* 关波特率发生器 */
//BRGR1=BRGR1_DATA;
//BRGR0=BRGR0_DATA;
//BRGCON=0x03; /* 打开串口波特率发生器,使用串口波特率发生器 */
ES=1; /* 允许接收中断 */
//EST=0; /* 禁止发送中断 */
//RI=0;
//TI=0;
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */
//TH1 = 0xfb; //9600bps 0xe8; //1200bps,0xfd; //9600bps for 11.0592M /* TH1: reload value for 1200 baud @ 16MHz */
TH1 = 0xfd; //9600bps 0xe8; //1200bps,0xfd; //9600bps for 11.0592M /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
}
/*=================================================*/
/*发送数据子程序*/
void mscom_snd(uchar *ptr,uchar length)
{
uchar i;
for(i=0;i<length;i++)
{ SBUF=ptr[i];
while(TI==0);
TI=0;
}
}
void mscom_byte(uchar sndat)
{
SBUF=sndat;
while(TI==0);
TI=0;
}
/**************************************************/
/*********** 串口(Rx)中断服务子程序 *************/
void Mscom_rcv(void) interrupt 4 using 1
{
if(RI==1)
{
RI=0;
//URT_rcv=SBUF;
comrbuf[comrbufp]=SBUF;
if(comrbuf[comrbufp]=='E' && comrbuf[(comrbufp+COMRBUFLEN-1)%COMRBUFLEN]==0 && comrbuf[(comrbufp+COMRBUFLEN-4)%COMRBUFLEN]=='S')
{
comsbuf[12]=comrbuf[(comrbufp+COMRBUFLEN-3)%COMRBUFLEN];
comsbuf[13]=comrbuf[(comrbufp+COMRBUFLEN-2)%COMRBUFLEN];
}
if(++comrbufp==COMRBUFLEN) comrbufp=0;
mscom_byte(URT_rcv);
}/* 串口接收程序结束 */
}/* 串口中断程序结束 */
/****************************************************************/
//////////Timer0 interrupt//////
void t0int() interrupt 1
{
temptl0=TL0;
tempth0=TH0;
TH0=THV+tempth0;
TL0=TLV+temptl0+10;
count++;
if(count==HALFSECTICKS)
{
triggle=1;
RLED=1;
}
if(count==SECTICKS)
{
count=0;
triggle=1;
RLED=0;
}
}
void Ptimer1(void) interrupt 3 using 1
{
TH1=(65536-46080)/256; /* Fosc=733728MHz/4=1.8432MHz */
TL1=(65536-46080)%256; /* 50ms timer interrupt */
TR1=1;
if(++tim_cnt==20)
{
tim_cnt=0;
Flag_scd=1;
if(tim_scd++==60)
{
tim_scd=0;
if(tim_mnt++==60)
{
tim_mnt=0;
if(tim_hur++==24) tim_hur=0;
}
}
}
}
/************************************************************************************************/
main()
{
uchar i;
for(i=0;i<4;i++) comsbuf[i]=TX_ADDRESS[i];
comsbuf[4]=RX_ADDRESS_0;
comsbuf[5]=RX_ADDRESS_1;
comsbuf[6]=RX_ADDRESS_2;
comsbuf[7]=RX_ADDRESS_3;
comsbuf[8]=0xff;
comsbuf[9]=0xd7;
comsbuf[10]=0x06;
comsbuf[11]='S';
comsbuf[14]=0x00;
comsbuf[15]='E';
/*IO口模式设置00准双向;01推挽;10高阻输入;11开漏 */
//P0M1=0x00; /* P0M1: 00000000 键盘 双向*/
//P0M2=0x0F; /* P0M2: 00001111 LED 推挽*/
//P1M1=0x2C; /* P1M1: 00101100 P1.2/P1.3配置为开漏,外接上拉电阻;P1.5(RST)仅能为输入(高阻);*/
//P1M2=0x0C; /* P1M2: 00001100 中断1,串口为准双向;*/
//P2M1=0x00; /* P2M1: 00000000 */
//P2M2=0x00; /* P2M2: 00000000 */
//P3M1=0x00; /* IO口模式设置: 准双向口00,使用内部时钟 */
//P3M2=0x00;
//P0=0xFF; /* 初化P0口 */
//P1=0xFF;
//P2=0xFF; /* */
//P3=0xFF; /* */
//DIVM=2; /* 降低工作频率,以便程序移植 */
TR0 = 1;
IE = 0x82; //Enable timer0.
uart_init(); /* 串口初始化9600BPS */
Spi_init(); /* 初始化SPI端口 */
ChangeMode(Standby); /* nRF905进入待机SPI通讯模式 */
//Delayus(1000);
Delayms(1);
Config905(); /* 配置nRF905 */
//TMOD|=0x10; /* Timer1 mode set Mode1 */
//TH1=(65536-46080)/256; /* Fosc=1.8432MHz,50ms timer interrupt */
//TL1=(65536-46080)%256;
//ET1=1;TR1=1;
//EA=1;
//eeprom_read(E2ADRSYS,Databuf,16); /* 读取本系统地址及参数 */
//ADDRESS = BUFADR;
//if(ADDRESS==0xFF) /* 地址为0xFF时,初始化地址为1 */
//{
// BUFADR = ADDRESS = 0x01; /* 本系统地址存储为0x01 */
// for(i=1;i<16;i++)Databuf[i]=i;
// eeprom_write(E2ADRSYS,Databuf,16); /* 存储本系统地址及参数 */
//}
mscom_snd(Databuf,16);
RF905_Read(RC,Databuf);
mscom_snd(Databuf,16);
ChangeMode(RXMode); /**/
while(1)
{
while(RF_DR && RF_AM)
{
ChangeMode(Standby);
Delayms(1);
RF905_Read(RRP,Databuf);
ChangeMode(RXMode);
//Delayus(300);
//Delayms(1);
mscom_snd(Databuf,16);
if(Databuf[15]=='E' && Databuf[14]==0x00 && Databuf[11]=='S')
{
triggle1=1;
}
}
if(triggle1)
{
//triggle=0;
triggle1=0;
ChangeMode(TXMode);
//Delayus(3100);
Delayms(3);
RF905_Write(WTA,TX_ADDRESS);
//RF905_Write(WTP,Databuf);
RF905_Write(WTP,comsbuf);
ChangeMode(TXData);
//mscom_snd(TX_ADDRESS,4);
//mscom_snd(Databuf,16);
//Delayus(650); // ensure nRF905 have began TX
//Delayms(2);
while(!RF_DR);
ChangeMode(RXMode);
}
/*
switch (URT_rcv)
{
case 0x00:
for(i=0;i<16;i++) Databuf[i]=i;
//eeprom_write(E2ADRSYS,Databuf,16);
//eeprom_read(E2ADRSYS,Databuf,16);
//mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x01:
ChangeMode(Standby);
Delayus(3100);
RF905_Read(RC,Databuf);
ChangeMode(RXMode);
mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x02:
ChangeMode(TXMode);
Delayus(3100);
RF905_Write(WTA,TX_ADDRESS);
RF905_Write(WTP,Databuf);
ChangeMode(TXData);
//mscom_snd(TX_ADDRESS,4);
//mscom_snd(Databuf,16);
Delayus(650); // ensure nRF905 have began TX
ChangeMode(RXMode);
URT_rcv =0x10;
break;
case 0x03:
ChangeMode(Standby);
RF905_Read(RTP,Databuf);
Delayus(650);
ChangeMode(RXMode);
mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x04:
ChangeMode(Standby);
RF905_Read(RRP,Databuf);
Delayus(650);
ChangeMode(RXMode);
//mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x05:
for(i=0;i<16;i++) Databuf[i]=15-i;
//eeprom_write(E2ADRSYS,Databuf,16);
//eeprom_read(E2ADRSYS,Databuf,16);
//mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x06:
for(i=0;i<16;i++) Databuf[i]=0x06;
//eeprom_write(E2ADRSYS,Databuf,16);
//eeprom_read(E2ADRSYS,Databuf,16);
//mscom_snd(Databuf,16);
URT_rcv =0x10;
break;
case 0x07:
ChangeMode(PowerDown);
URT_rcv =0x10;
default:
ChangeMode(RXMode);
URT_rcv =0x10;
break;
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -