?? 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 + -