实验目的:学会用单片机与计算机之间通过串口通讯。
实验模块:核心板;
实验内容:由串口调试助手以16进制向单片机发送一数据,如01,如果单片机接收到数据将会原样返回给计算机,并且显示在串口调试助手的接收框内。硬件电路图:在应用单片机的串口和 PC 进行串行通信时,需要进行两种不同的电平之间的转换,需要应用MAX232芯片将从0V和 5V的TTL电平转换到3V~15V或-3V~-15V的 RS-232C 电平。串口通信的数据传输过程如下:MAX232 的 10 脚 T2IN 接单片机 TXD 端 P3.1,TTL 电平从单片机的 TXD 端发出,经过 MAX232 转换为RS-232 电平后从 MAX232 的 14 脚 T1OUT 发出,再连接到串口座的第 2 脚 TXD,至此计算机端接收到数据。PC 机发送数据时从 PC 机串口座上的第 3 脚 RXD 端

                                                                     

单片机串口通信程序架构 单片机串口流程图_串口

 

 

 实验代码:

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

功能描述: 接收PC机发来的数据,并向PC机返回接收到的数据,PC机上使用串口调试助手,波特率1200bps,使用方式1.
硬件连接:  用2位杜邦线分别将J9_0与J5_R1及J9_1与J5_D1连接(下载完程序后),用串口线将PC和开发板上的串口1连接。
***************************************************************************************************/
#include "reg51.h"       //包含头文件
#define uchar unsigned char
#define uint  unsigned int
 
uchar ch;               //用于存放串口接收到的数据
bit read_flag= 0 ;      //取数标志位 //**************************************************************************************************
//初始化串口
//**************************************************************************************************
void init_com( void ) { 
  SCON = 0x50;   // 设定通信方式为方式1,允许接收,相当于REN = 1; SM1 = 1;   
  PCON = 0x00;   //SMOD=0,该语句可去掉
  IE |= 0x90 ;   //打开串口中断, 相当于 EA = 1;ES = 1;    //以下4句设置T1
  TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率
  TH1=0xE6;      //定时器0赋初值,TH1=(256 - (12000000 / (32 * 12 * 1200)))=230;
  TL1=0xE6;      //TL1=(256 - (12000000 / (32 * 12 * 1200)))=230;
  TR1 = 1;       //启动T1
 
} 
//**************************************************************************************************
//串口中断函数
//**************************************************************************************************
void serial () interrupt 4 using 3 { 
    if (RI)        {  
        RI = 0 ;       //此步必不可少,因为硬件不能将其置0   
        ch=SBUF;       //从SBUF中取出数据       
        read_flag= 1 ; //就置位取数标志 
        }} 
//**************************************************************************************************
//串口发送函数
//**************************************************************************************************
void send_char( unsigned char ch1)          { 
            SBUF=ch1;       //将待发数据放到SBUF 
            while (TI== 0); //等待TI=1(表示帧发送结束)发送
            TI= 0 ;         //此步必不可少,因为硬件不能将其置0            } 
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main(void)
{
 init_com( ) ;
 while(1)
 {
   /*  
    查询方式实现通信,当系统较小时采取。
    使用该方式必须将下面的中断方式屏蔽,
     IE = 0x00 ;           //关闭所有中断,以防止中断影响
     while(RI == 0);
     RI = 0;
     ch = SBUF;            // 从缓冲区中把接收的字符放入c中
     SBUF = ch;            // 要发送的字符放入缓冲区 
     while(TI == 0);
     TI = 0;
  *///中断方式实现通信 当系统较大时采取
  if (read_flag)      //如果取数标志已置位,就将读到的数从串口发出     { 
      read_flag= 0 ;  //取数标志清0 
      send_char(ch);  //将读到的数从串口发出 
    } 
 } }