⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 msp430和nrf905的例子,联系qqliuyong007@163.com
💻 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 + -