文档库 最新最全的文档下载
当前位置:文档库 › C8051F340单片机双串口同时工作 中断接收数据 查询发送数据源程序

C8051F340单片机双串口同时工作 中断接收数据 查询发送数据源程序

#include // SFR declarations


//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F34x
//-----------------------------------------------------------------------------

sfr16 SBRL1 = 0xB4;


sbit RI1=0xd2;
sbit TI1=0xd3;

//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

#define SYSCLK 12000000 // SYSCLK frequency in Hz
#define BAUDRATE0 115200 // Baud rate of UART0 in bps
#define BAUDRATE1 115200 // Baud rate of UART1 in bps



//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------

void SYSTEMCLOCK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void UART1_Init (void);
void Delay (void);
char UART1_send(char c) ;

unsigned char temp;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void)
{

PCA0MD &= ~0x40; //关闭看门狗
SYSTEMCLOCK_Init ();
PORT_Init ();
UART0_Init ();
UART1_Init ();
EA=1;
while (1)
{SBUF1='1';
while (!TI1)
{
;
}
TI1=0;

/*
SBUF0='Q';
while (!TI0)
{;}
TI0=0;*/

}
}


void SYSTEMCLOCK_Init (void)
{
OSCICN |= 0x83; // Configure internal oscillator for
// its maximum frequency and enable
// missing clock detector
}



void PORT_Init (void)
{
XBR0 = 0x01; // route UART 0 to crossbar
XBR1 = 0x40;
XBR2 = 0x01; // route UART 1 to crossbar

P0MDIN=0XFF;//不配置为模拟输入
P0MDOUT=0X11;
P0SKIP=0XCC;//P0.4 P0.5、P0.2、P0.1配置为串口0和串口1

P1MDIN=0XFF;//不配置为模拟输入
P1MDOUT=0XFF; //P1口配置为推挽输出

P2MDIN=0XFF;
P2MDOUT=0xFF;

P3MDIN=0XFF;
P3MDOUT=0xFF;

}

//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for baudrate; 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/BAUDRATE0/2/256 < 1)
{
TH1 = -(SYSCLK/BAUDRATE0/2);
CKCON &= ~0x0B; // 定时器1使用系统时钟,
CKCON |= 0x08;
}
else if (SYSCLK/BAUDRATE0/2/256 < 4)
{
TH1 = -(SYSCLK/BAUDRATE0/2/4);
CKCON &= ~0x0B; // 定时器1使用系统时钟4分频
CKCON |= 0x01;
}
else if (SYSCLK/BAUDRATE0/2/256 < 12)
{
TH1 = -(SYSCLK/BAUDRATE0/2/12);
CKCON &= ~0x0B; // 定时器1使用系统时钟12分频
}
else
{
TH1 = -(SYSCLK/BAUDRATE0/2/48);
CKCON &= ~0x0B; // 定时器1使用系统时钟48分频
CKCON |= 0x02;
}

TL1 = TH1; // init Timer1
TMOD &= ~0xf0;
TMOD |= 0x20; // 定时器1工作于方式2,8位重装载
//IP=0x10;//串口0优先级
ES0=1; //开串口0中断
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure UART1 for baudrate1 and 8-N-1.
//
//-----------------------------------------------------------------------------


void UART1_Init (void)
{
SMOD1 = 0x0C; // UART1 8位数据

SCON1 = 0x70; // 接收允许,清发送和接收中断

if (SYSCLK/BAUDRATE1/2/0xFFFF < 1)
{
SBRL1 = -(SYSCLK/BAUDRATE1/2);
SBCON1 |= 0x03; // set prescaler to 1
}
else if (SYSCLK/BAUDRATE1/2/0xFFFF < 4)
{
SBRL1 = -(SYSCLK/BAUDRATE1/2/4);
SBCON1 &= ~0x03;
SBCON1 |= 0x01; // set prescaler to 4
}
else if (SYSCLK/BAUDRATE1/2/0xFFFF < 12)
{
SBRL1 = -(SYSCLK/BAUDRATE1/2/12);
SBCON1 &= ~0x03; // set prescaler to 12
}
else
{
SBRL1 = -(SYSCLK/BAUDRATE1/2/48);
SBCON1 &= ~0x03;
SBCON1 |= 0x02; // set prescaler to 4
}

//SCON1 |= 0x02; // indicate ready for TX
SBCON1 = 0x43; // enable baud rate generator
EIP2=0X02; //串口2优先级高
EIE2 =0X02;//开串口2中断
}


void UART1_receive(void) interrupt 16
{
unsigned temp;
if (SCON1 &0X01==0X01)
{
temp=SBUF1;
if (temp=='A')
{
P1=0X55;
}
}
//SCON1=SCON1&0XFE;
SCON1=0X70;
}




void UART0_receive(void) interrupt 4
{
unsigned temp;
if (RI0)
{
temp=SBUF0;
if (temp=='A')
{
P2=0X55;
}
}
RI0=0;

}

相关文档
相关文档 最新文档