📄 test.c
字号:
#define __SRC
#include "Config.h"
#undef __SRC
#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字节数据存储缓冲区 */
#define BUFADR Databuf[0] /* 系统地址 */
#define BUFPTST Databuf[1] /* 操作端口/状态 */
#define BUFHOUR Databuf[2] /* 时间:时 */
#define BUFMINT Databuf[3] /* 时间:分 */
/*
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);
/*==========================================================*/
/* 功能:查询方式对地址范围为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;
}
/*=================================================*/
/*发送数据子程序*/
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;
mscom_byte(URT_rcv);
}/* 串口接收程序结束 */
}/* 串口中断程序结束 */
/****************************************************************/
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;
/*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; /* 降低工作频率,以便程序移植 */
uart_init(); /* 串口初始化9600BPS */
Spi_init(); /* 初始化SPI端口 */
ChangeMode(Standby); /* nRF905进入待机SPI通讯模式 */
Delayus(1000);
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)
{
/* ChangeMode(Standby); /**/
RF905_Read(RRP,Databuf);
ChangeMode(RXMode);
Delayus(500);
mscom_snd(Databuf,16);
}
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 0x07:
ChangeMode(PowerDown);
URT_rcv =0x10;
default:
ChangeMode(RXMode); /**/
URT_rcv =0x10;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -