单片机与pc串口通信程序及电路图 


#include 
#define BUFFERLEGTH 10 
//----------------------------------------------------------------- 
void UART_init(); //串口初始化函数 
void COM_send(void); //串口发送函数 
char str[20]; 
char j; 
//------------------------------------------------------------------- 
void main(void) 
{ 
unsigned char i; 
UART_init(); 
j=0; //初始化串口 
for(i = 0;i 
}; 
while(1); 
} 
//------------------------------------------------------------- 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: UART_init()串口初始化函数 
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s 
// 串口接收中断允许,发送中断禁止 
//-------------------------------------------------------------------------------------------------- 
void UART_init() 
{ 
//初始化串行口和波特率发生器 
SCON =0x50; //选择串口工作方式1,打开接收允许 
TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1 
TH1 =0xfA; //实现波特率9600(系统时钟11.0592MHZ) 
PCON = 0x80; 
TR1 =1; //启动定时器T1 
ET1 =0; 
ES=1; //允许串行口中断 
PS=1; //设计串行口中断优先级 
EA =1; //单片机中断允许 
} 
//------------------------------------------------------------ 
void COM_send(void) 
{ 
unsigned char point = 0; 
for(point=0;str[point]!='\0';point++) //连续发送二十位数据 //把缓存区的数据都发送到串口 
{ 
SBUF=str[point]; 
while(!TI); 
TI=0; 
//str[point]='\0'; 
} 
} 
//-------------------------------------------------------------- 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: com_interrup()串口接收中断处理函数 
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区 
//-------------------------------------------------------------------------------------------------- 
void com_interrupt(void) interrupt 4 using 3 
{ 
unsigned char RECEIVR_buffer; 
bit flag=1; 
if(RI) //处理接收中断 
{ 
RI=0; //清除中断标志位 
RECEIVR_buffer=SBUF; //接收串口数据 
str[j]=SBUF; 
if (RECEIVR_buffer == '$') 
{ ES=0; 
str[j]='\0'; 
SCON =0x40; //接收不允许 
COM_send(); //发送数据 
ES=1; 
j=0; 
flag=0; 
SCON=0x50; //接收允许 
} 
if(flag) 
j++; 
} 
}