?? uarttest.c
字號:
//
//程序說明: 此程序用UART0實現RS-232通信,當接收到一個數據后,再將接收到的數據送出。
#include <c8051f020.h> /*SFR定義*/
#include <intrins.h> /*nop*/
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define BAUDRATE 115200 /*UART0的波特率*/
#define SYSCLK 22118400 /*系統時鐘*/
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
bit ReceiveBit; /*接收標志位*/
unsigned char temp; //因為這是要存發送和接收的數據,SBUF0是八位的,只有字符型的數據在系統編譯是被分八位內存
/*延時*/
void delay(unsigned int k)
{
while(k--);
}
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main(void)
{
unsigned char i;
WDTCN = 0xde; /*關看門狗*/
WDTCN = 0xad;
ReceiveBit=0;
SYSCLK_Init (); /*初始化系統時鐘*/
PORT_Init (); /*初始掛交叉開關和I/O口*/
UART0_Init (); /*初始化UART0*/
EA=1;
ES0=1;
while(1){
while (ReceiveBit==1) { /*是否接收到一個數據*/
ES0=0; /*關串口中斷0*/
EA=0; /*關總中斷*/
ReceiveBit=0; /*清接收標志位*/
delay(100000); /*延時*/
SBUF0=temp; /*將接收到數據送出*/
while(TI0==0); /*發送標志位是否產生*/
TI0=0; /*清發送標志位*/
delay(100000); /*延時*/
ES0=1; /*開中斷標志*/
EA=1;
}
_nop_();
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
int i; /*延時計數器*/
OSCXCN = 0x67; /*打開外部晶體振蕩器*/
for (i=0; i < 256; i++) ; /*延時*/
while (!(OSCXCN & 0x80)) ; /*查詢外部晶體是否穩定起振*/
OSCICN = 0x88; /*用外部晶體作為系統時鐘,并使能時鐘丟失檢測*/
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
XBR0 = 0x04; /*使能UART0*/
XBR1 = 0x00;
XBR2 = 0x40; /*使能交叉開關和弱上拉*/
P0MDOUT |= 0x01; /*使能TX0作為推挽輸出*/
P1MDOUT |= 0x40; /*時能P1.6 (LED)作為推挽輸出*/
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
SCON0 = 0x50; /*SCON0:模式1,8位UART,時能RX*/
TMOD = 0x20; /*TMOD: 定時器工作再模式2, 8位重載*/
TH1 = -(SYSCLK/BAUDRATE/16); /*設置定時1用作波特率的重載值*/
// TL1 = TH1;
TR1 = 1; /*開定時器1*/
CKCON |= 0x10; /*定時器1用系統時鐘作為它的時基*/
PCON |= 0x80; /*SMOD00 = 1*/
}
/*串口中斷0子程序*/
void UART0_ISR (void) interrupt 4
{
if(!TI0) //是發送中斷還是接收中斷
{
RI0 = 0; /*清接收標志位*/
temp =SBUF0; /*保存接收到的數據*/
ReceiveBit=1; /*置接收標志*/
}
TI0 = 0; /*清發送標志位*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -