您好,欢迎来到尔游网。
搜索
您的当前位置:首页单片机串口收发代码

单片机串口收发代码

来源:尔游网


//-----------------------------------------------------------------------------

// Includes

//-----------------------------------------------------------------------------

#include // SFR declarations

#include

//-----------------------------------------------------------------------------

// Global CONSTANTS

//-----------------------------------------------------------------------------

#define SYSCLK 12000000 // SYSCLK frequency in Hz

#define BAUDRATE 9600 // Baud rate of UART in bps

//-----------------------------------------------------------------------------

// Function PROTOTYPES

//-----------------------------------------------------------------------------

void SYSCLK_Init (void);

void UART0_Init (void);

void PORT_Init (void);

void Timer2_Init (int);

void sendchar(char tx);

void send_cstring(char *pstr);

//-----------------------------------------------------------------------------

// Global Variables

//-----------------------------------------------------------------------------

#define UART_BUFFERSIZE 14

char UART_Buffer[UART_BUFFERSIZE];

char Byte;

unsigned int readflag = 0;

unsigned int c,i;

unsigned char flag=0;

//-----------------------------------------------------------------------------

// MAIN Routine

//-----------------------------------------------------------------------------

void main (void)

{

PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer

// enable)

PORT_Init(); // Initialize Port I/O

SYSCLK_Init (); // Initialize Oscillator

UART0_Init();

EA = 1;

for(i=0;i<4;i++)

{ UART_Buffer[i]='5';}

c=0;

while(1)

{

if((flag==1)&&(c<4))

{

flag=0;

UART_Buffer[c]=Byte;

c++;

}

if(c==4)

{

c=0;

for(i=0;i<4;i++)

{sendchar(UART_Buffer[i]);

}

}

}

}

//-----------------------------------------------------------------------------

// PORT_Init

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters : None

//

// Configure the Crossbar and GPIO ports.

//

// P0.4 digital push-pull UART TX

// P0.5 digital open-drain UART RX

//

//-----------------------------------------------------------------------------

void sendchar(char tx)

{

SBUF0=tx;

while(!TI0);

TI0=0;

}

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

* 函数名称:send_cstring()

* 功 能:向计算器上位机发送一字符串

* 入口参数:*pstr 将要被发送的字符串

* 出口参数:无

* 说 明:无

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

void send_cstring(char *pstr)

{

while(*pstr != '\\0') //查询是否到达字符串尾

{

sendchar(*pstr++); //发送字符

}

}

void PORT_Init (void)

{

P0MDOUT |= 0x10; // Enable UTX as push-pull output

XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX)

XBR1 = 0x40; // Enable crossbar and weak pull-ups

}

//-----------------------------------------------------------------------------

// SYSCLK_Init

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters : None

//

// This routine initializes the system clock to use the internal oscillator

// at its maximum frequency.

// Also enables the Missing Clock Detector.

//-----------------------------------------------------------------------------

void SYSCLK_Init (void)

{

OSCICN |= 0x03; // Configure internal oscillator for

// its maximum frequency

RSTSRC = 0x04; // Enable missing clock detector

}

// Configure the UART0 using Timer1, for and 8-N-1.

//-----------------------------------------------------------------------------

void UART0_Init (void)

{

SCON0 = 0x10; // SCON0: 8-bit variable bit rate

// level of STOP bit is ignored

// RX enabled

// ninth bits are zeros

// clear RI0 and TI0 bits

if (SYSCLK/BAUDRATE/2/256 < 1) {

TH1 = -(SYSCLK/BAUDRATE/2);

CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx

CKCON |= 0x08;

} else if (SYSCLK/BAUDRATE/2/256 < 4) {

TH1 = -(SYSCLK/BAUDRATE/2/4);

CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01

CKCON |= 0x01;

} else if (SYSCLK/BAUDRATE/2/256 < 12) {

TH1 = -(SYSCLK/BAUDRATE/2/12);

CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00

} else {

TH1 = -(SYSCLK/BAUDRATE/2/48);

CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10

CKCON |= 0x02;

}

TL1 = TH1; // init Timer1

TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload

TMOD |= 0x20;

TR1 = 1; // START Timer1

IP |= 0x10; // Make UART high priority

ES0 = 1; // Enable UART0 interrupts

}

//-----------------------------------------------------------------------------

// UART0_Interrupt

void UART0_Interrupt(void) interrupt 4

{

if (RI0 )

{

Byte = SBUF0;

RI0 = 0; // Clear interrupt flag

flag=1;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务