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

📄 uart._c

📁 PTR8000无线通信模块的单片机控制程序
💻 _C
字号:
//*************************程序说明部分**************************************
//本程序基于无线模块第3版(2005 12 13)  编写,通过MEGA8 与PTR8000
//实现上位机与下位机之间的程序传输
//主控制器MEGA8,晶振11.0592M
//*************************管脚定义部分**************************************
//SPI通讯部分
//PB2----SS
//PB3----MOSI
//PB4----MISO
//PB5----SCK

//PTR8000控制引脚
//PC0----CD----INPUT
//PC1----AM----INPUT
//PC2----DR----INPUT
//PC3----PWR-----OUTPUT
//PC4----TXEN----OUTPUT
//PC5----TRXCE---OUTPUT

//载波频率控制
//PD2---PD7   ----6BIT频率选择

//PB0----SPEAKER
//PB1----LED

//*************************头文件包含部分***********************************
#include <iom8v.h>
#include <macros.h>
//*************************宏定义部分*****************************************
#define 	WC 		0x00		//Write configuration register Command
#define  	RC 		0x10		//Read configuration register Command
#define 	WTP 	0x20		//Write TX payload Command
#define 	RTP 	0x21		//Read TX payload Command
#define 	WTA 	0x22		//Write TX Address Command
#define 	RTA 	0x23		//Read TX Address Command
#define 	RRP 	0x24		//Read RX payload Command

//*************************全局变量定义部分*******************************
unsigned char Tran;
unsigned char Recv;
unsigned char RC0 = 0x4c,RC1 = 0x0c;
unsigned char Add = 0xa1;
//*************************函数定义部分**************************************
void init_port(void);			//初始化MEGA各控制引脚

void Delay_1ms(void);					//延时1ms函数
void Delay_Nms(unsigned int i);			//延时Nms函数
void LED(unsigned char i);			    //点亮/熄灭LED

//串口通讯用函数
void Uart_Init(void);					//UART初始化
void Uart_Send(unsigned char c);			//UART发送一个字符


//SPI通讯用函数
void SPI_MasterInit(void);	//SPI主机初始化
void SPI_M_Send(unsigned char c);	//主机方式发送一个字符
unsigned char  SPI_M_Recv(unsigned char c);	//主机接收一个字符

//PTR8000用函数
void PTR8_Standby(void);	//set TRC_CE Disable
void PTR8_TREN(void);		//set TRX_CE  Enable
void PTR8_TX(void);		//无线模块发送状态
void PTR8_RX(void);		//无线模块接收状态
void Init_PTR8_CR(void);	//初始化PTR8000控制状态

void Init_Device(void);	//初始化串口、SPI口及其他设备

//******************************函数实现部分************************************
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 	Recv = UDR;
	Uart_Send(Recv);
	
}

/*	函数名:	init_port
	功能说明:初始化各MEGA8各控制引脚
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void init_port(void)
{
	PORTB = 0x2f;		//置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
	DDRB = 0x2f;		//置PB0--SPK,PB1--LED,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
	PORTC = 0x18;		//置PWR,TXEN为1,  TRXCE为0
	DDRC = 0x38;		//置PC0,PC1,PC2输入;PC3--PWR,PC4--TXEN,PC5--TRXCE输出
	PORTD = 0xff;
	DDRD = 0x00;		//置PD口全部为输入,启动内部弱上拉
}
//**************************************************************************************

/*	函数名:	Delay_1ms
	功能说明:软件延时1ms
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/
void Delay_1ms(void)
{
	unsigned int i;
	for ( i = 0 ; i < ( unsigned int ) 11 * 143 - 2 ; i ++ )
		;
}
//******************************************************************

/*	函数名:	Delay_Nms
	功能说明:软件延时Nms,适用于所有CPU
	参数说明:N值决定延时长度。范围为0~65536之间的整数
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/
void Delay_Nms(unsigned int N)
{
	unsigned int j;
	for( j = 0 ; j < N ; j ++ )
		Delay_1ms();
}
//*******************************************************************

/*	函数名:	LED
	功能说明:点亮/熄灭LED
	参数说明:0----点亮;1----熄灭
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void LED(unsigned char i)
{
	if(i == 0)
		PORTB &= ~BIT(PB1);
	else
		PORTB |= BIT(PB1);
}

//*******************************************************************

//串口通讯用函数

/*	函数名:	Uart_Init
	功能说明:串口初始化函数,适用于所有CPU
					波特率9600,8位字节,无奇偶校验
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/
void Uart_Init(void)
{
 	UCSRB = 0x00; //disable while setting baud rate
	UCSRA = 0x00;
 	UCSRC = 0x86;
 	UBRRL = 0x47; //set baud rate lo
 	UBRRH = 0x00; //set baud rate hi
 	UCSRB = 0x98;
}
//********************************************************************

/*	函数名:	Uart_Send
	功能说明:通过查询方式,串口发送一个字节函数,适用于所有CPU					
	参数说明:c为所要发送的字节
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/
void Uart_Send(unsigned char c)
{
 	while(!(UCSRA&(1<<UDRE)))
  		;	//等待空闲
 	UDR=c;	//发送数据
}


//**********************************************************************

//SPI通讯用函数

/*	函数名:	SPI_MasterInit
	功能说明:SPI主机初始化函数。使能SPI,MSB在前,主模式
					起始上升沿,采样上升沿。16分频
	参数说明:	无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/

void SPI_MasterInit(void)
{
	SPCR = 0x51;		//SPI控制寄存器初始化:SPI允许,MSB先发,主模式,16分频
}
//**********************************************************************
/*	函数名:	SPI_M_Send
	功能说明:SPI主机发送一个字节函数。
	参数说明:	c为要发送的字节
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:2005-12-05
	修改内容:	去掉SS信号控制语句	*/

void SPI_M_Send(unsigned char c)
{
	SPDR = c;	//传送开始
	while(!(SPSR & 0X80)) 
		;	//查询SPIF标志
	
}
//************************************************************************

/*	函数名:	SPI_M_Recv
	功能说明:SPI主机方式接收一个字节函数。
	参数说明:任意无效字符
	返回值:	返回接收到的字节
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/

unsigned char SPI_M_Recv(unsigned char c)
{
	SPDR = c;	//传送开始
	while(!(SPSR & 0X80)) 
		;	//查询SPIF标志
	return SPDR;	//返回接收的字符
}
//*************************************************************************

//***************************PTR8000无线模块用函数*****************

/*	函数名:	PTR8_Standby
	功能说明:将PTR8置为待机状态。SET TRX_CE = 0
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_Standby(void)
{
	PORTC &= ~BIT(PC5);	//TRX_CE = 0
}
//**************************************************************************

/*	函数名:	PTR8_TREN
	功能说明:将PTR8置为工作状态。SET TRX_CE = 1
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_TREN(void)
{
	PORTC |= BIT(PC5);	//TRX_CE = 1
}
//***************************************************************************

/*	函数名:	PTR8_TX
	功能说明:将PTR8置为发送状态。
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_TX(void)
{
	PORTC |= BIT(PC4);	//TX_EN = 1
}
//***************************************************************************

/*	函数名:	PTR8_RX
	功能说明:将PTR8置为接收状态。
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_RX(void)
{
	PORTC &= ~BIT(PC4);	//TX_EN = 0
}
//*****************************************************************************

void Init_PTR8_CR(void)
{
	PORTB &= ~BIT(PB2);	//SS SET LOW, Write Configuration register Start
	SPI_M_Send(WC);	//Wirte Configuration Register,Start From 0000
	SPI_M_Send(RC0);	//Write CH_NO [7 : 0]
	SPI_M_Send(RC1);		//Write Byte 2
	SPI_M_Send(0x44);
	SPI_M_Send(0x01);	//RX payload = 1 byte 
	SPI_M_Send(0x01);	//TX payload = 1 byte
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(0x58);
	PORTB |= BIT(PB2);	//SS set HIGH,Write Configuration Register Finish
	
}
//************************************************************************************
/*	函数名:	Init_Device
	功能说明:初始化设备。LED亮一下,蜂鸣器叫一声,初始化串口
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void Init_Device(void)
{
	//stop errant interrupts until set up
 	CLI(); //disable all interrupts
 	
	init_port();		//初始化各控制端口
	LED(0);	//LED全亮
	Uart_Init();		//串口初始化
	SPI_MasterInit();//SPI Master Init
	MCUCR = 0x00;
 	GICR  = 0x00;
 	TIMSK = 0x00; //timer interrupt sources
 	
	SEI(); //re-enable interrupts
	LED(1);	//LED全灭
	//all peripherals are now initialised
}

//**************************************************************************


//****************************主程序**********************************
/*无线模块发送程序,无线模块发送的字符为通过串口接收的字符,规定为0和1,而且每次数据发送成功
LED都会闪一次*/
//********************发送程序**********************

void main(void)
{
	unsigned char i,dr,F;
	Init_Device();	//Init All Device

	Init_PTR8_CR();	//Set Configuration register
	Delay_1ms();

	PTR8_RX();	//Set RX mode
	PTR8_TREN();	// TRX_CE = 1  Enable RX
	Delay_1ms();
	while(1)
	{
			LED(1);
			Delay_Nms(1000);
			
			PTR8_TX();		//set TX mode
			Delay_1ms();
			PORTB &= ~BIT(PB2);	//SS = 0
			SPI_M_Send(WTP);		//Write TX payload
			
			SPI_M_Send(Recv);		// Data = Recv[]
			
			PORTB |= BIT(PB2);		//ss = 1		
			Delay_1ms();
			PORTB &= ~BIT(PB2);		//SS = 0
			SPI_M_Send(WTA);		//write TX_Address
			for(i = 0 ; i < 4 ; i ++)
			{
			 	  SPI_M_Send(Add);	//TX_Address = Add
			}
			PORTB |= BIT(PB2);		//ss = 1
			Delay_1ms();
			PTR8_TREN();	//TRX_CE = 1  Enable TX
			do
			  	dr = (PINC & 0x04);
			while(dr == 0);	//等待数据发送成功
			PTR8_Standby();	//TRX_CE = 0  disable TX
			Delay_1ms();
			
			LED(0);
			Delay_Nms(1000);
			
			PTR8_RX();	//Set RX mode
			PTR8_TREN();	// TRX_CE = 1  Enable RX
			Delay_1ms();
			
			
			
	}   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -