📄 uart.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 + -