?? uart._c
字號(hào):
//*************************程序說(shuō)明部分**************************************
//本程序基于無(wú)線模塊第3版(2005 12 13) 編寫(xiě),通過(guò)MEGA8 與PTR8000
//實(shí)現(xiàn)上位機(jī)與下位機(jī)之間的程序傳輸
//主控制器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;
//*************************函數(shù)定義部分**************************************
void init_port(void); //初始化MEGA各控制引腳
void Delay_1ms(void); //延時(shí)1ms函數(shù)
void Delay_Nms(unsigned int i); //延時(shí)Nms函數(shù)
void LED(unsigned char i); //點(diǎn)亮/熄滅LED
//串口通訊用函數(shù)
void Uart_Init(void); //UART初始化
void Uart_Send(unsigned char c); //UART發(fā)送一個(gè)字符
//SPI通訊用函數(shù)
void SPI_MasterInit(void); //SPI主機(jī)初始化
void SPI_M_Send(unsigned char c); //主機(jī)方式發(fā)送一個(gè)字符
unsigned char SPI_M_Recv(unsigned char c); //主機(jī)接收一個(gè)字符
//PTR8000用函數(shù)
void PTR8_Standby(void); //set TRC_CE Disable
void PTR8_TREN(void); //set TRX_CE Enable
void PTR8_TX(void); //無(wú)線模塊發(fā)送狀態(tài)
void PTR8_RX(void); //無(wú)線模塊接收狀態(tài)
void Init_PTR8_CR(void); //初始化PTR8000控制狀態(tài)
void Init_Device(void); //初始化串口、SPI口及其他設(shè)備
//******************************函數(shù)實(shí)現(xiàn)部分************************************
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
Recv = UDR;
Uart_Send(Recv);
}
/* 函數(shù)名: init_port
功能說(shuō)明:初始化各MEGA8各控制引腳
參數(shù)說(shuō)明:無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
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口全部為輸入,啟動(dòng)內(nèi)部弱上拉
}
//**************************************************************************************
/* 函數(shù)名: Delay_1ms
功能說(shuō)明:軟件延時(shí)1ms
參數(shù)說(shuō)明:無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-06
修改時(shí)間:
修改內(nèi)容: */
void Delay_1ms(void)
{
unsigned int i;
for ( i = 0 ; i < ( unsigned int ) 11 * 143 - 2 ; i ++ )
;
}
//******************************************************************
/* 函數(shù)名: Delay_Nms
功能說(shuō)明:軟件延時(shí)Nms,適用于所有CPU
參數(shù)說(shuō)明:N值決定延時(shí)長(zhǎng)度。范圍為0~65536之間的整數(shù)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-06
修改時(shí)間:
修改內(nèi)容: */
void Delay_Nms(unsigned int N)
{
unsigned int j;
for( j = 0 ; j < N ; j ++ )
Delay_1ms();
}
//*******************************************************************
/* 函數(shù)名: LED
功能說(shuō)明:點(diǎn)亮/熄滅LED
參數(shù)說(shuō)明:0----點(diǎn)亮;1----熄滅
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
void LED(unsigned char i)
{
if(i == 0)
PORTB &= ~BIT(PB1);
else
PORTB |= BIT(PB1);
}
//*******************************************************************
//串口通訊用函數(shù)
/* 函數(shù)名: Uart_Init
功能說(shuō)明:串口初始化函數(shù),適用于所有CPU
波特率9600,8位字節(jié),無(wú)奇偶校驗(yàn)
參數(shù)說(shuō)明:無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-02
修改時(shí)間:
修改內(nèi)容: */
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;
}
//********************************************************************
/* 函數(shù)名: Uart_Send
功能說(shuō)明:通過(guò)查詢方式,串口發(fā)送一個(gè)字節(jié)函數(shù),適用于所有CPU
參數(shù)說(shuō)明:c為所要發(fā)送的字節(jié)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-02
修改時(shí)間:
修改內(nèi)容: */
void Uart_Send(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)))
; //等待空閑
UDR=c; //發(fā)送數(shù)據(jù)
}
//**********************************************************************
//SPI通訊用函數(shù)
/* 函數(shù)名: SPI_MasterInit
功能說(shuō)明:SPI主機(jī)初始化函數(shù)。使能SPI,MSB在前,主模式
起始上升沿,采樣上升沿。16分頻
參數(shù)說(shuō)明: 無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-02
修改時(shí)間:
修改內(nèi)容: */
void SPI_MasterInit(void)
{
SPCR = 0x51; //SPI控制寄存器初始化:SPI允許,MSB先發(fā),主模式,16分頻
}
//**********************************************************************
/* 函數(shù)名: SPI_M_Send
功能說(shuō)明:SPI主機(jī)發(fā)送一個(gè)字節(jié)函數(shù)。
參數(shù)說(shuō)明: c為要發(fā)送的字節(jié)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-02
修改時(shí)間:2005-12-05
修改內(nèi)容: 去掉SS信號(hào)控制語(yǔ)句 */
void SPI_M_Send(unsigned char c)
{
SPDR = c; //傳送開(kāi)始
while(!(SPSR & 0X80))
; //查詢SPIF標(biāo)志
}
//************************************************************************
/* 函數(shù)名: SPI_M_Recv
功能說(shuō)明:SPI主機(jī)方式接收一個(gè)字節(jié)函數(shù)。
參數(shù)說(shuō)明:任意無(wú)效字符
返回值: 返回接收到的字節(jié)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-06
修改時(shí)間:
修改內(nèi)容: */
unsigned char SPI_M_Recv(unsigned char c)
{
SPDR = c; //傳送開(kāi)始
while(!(SPSR & 0X80))
; //查詢SPIF標(biāo)志
return SPDR; //返回接收的字符
}
//*************************************************************************
//***************************PTR8000無(wú)線模塊用函數(shù)*****************
/* 函數(shù)名: PTR8_Standby
功能說(shuō)明:將PTR8置為待機(jī)狀態(tài)。SET TRX_CE = 0
參數(shù)說(shuō)明:無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
void PTR8_Standby(void)
{
PORTC &= ~BIT(PC5); //TRX_CE = 0
}
//**************************************************************************
/* 函數(shù)名: PTR8_TREN
功能說(shuō)明:將PTR8置為工作狀態(tài)。SET TRX_CE = 1
參數(shù)說(shuō)明:無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
void PTR8_TREN(void)
{
PORTC |= BIT(PC5); //TRX_CE = 1
}
//***************************************************************************
/* 函數(shù)名: PTR8_TX
功能說(shuō)明:將PTR8置為發(fā)送狀態(tài)。
參數(shù)說(shuō)明:無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
void PTR8_TX(void)
{
PORTC |= BIT(PC4); //TX_EN = 1
}
//***************************************************************************
/* 函數(shù)名: PTR8_RX
功能說(shuō)明:將PTR8置為接收狀態(tài)。
參數(shù)說(shuō)明:無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
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
}
//************************************************************************************
/* 函數(shù)名: Init_Device
功能說(shuō)明:初始化設(shè)備。LED亮一下,蜂鳴器叫一聲,初始化串口
參數(shù)說(shuō)明:無(wú)
返回值: 無(wú)
函數(shù)作者:Haibo YU
版本號(hào): 1.0
創(chuàng)建時(shí)間:2005-12-23
修改時(shí)間:
修改內(nèi)容: */
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
}
//**************************************************************************
//****************************主程序**********************************
/*無(wú)線模塊發(fā)送程序,無(wú)線模塊發(fā)送的字符為通過(guò)串口接收的字符,規(guī)定為0和1,而且每次數(shù)據(jù)發(fā)送成功
LED都會(huì)閃一次*/
//********************發(fā)送程序**********************
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); //等待數(shù)據(jù)發(fā)送成功
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();
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -