51单片机串口通信——串口设置

  51单片机的串口通信如果全部把发送原理讲完的话可能要打好字,
最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha


串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
具体步骤如下:

1.确定T1的工作方式(编程TMOD寄存器);  
  
2.计算T1的初值,装载TH1、TL1;  
  
3.启动T1(编程TCON中的TR1位);  
  
4.确定串行口控制(编程SCON寄存器);  
  

5.串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。  


一言不合上代码:

#include "reg52.h"           //此头文件中定义了单片机的一些特殊功能寄存器  
  
typedef unsigned int u16;        
typedef unsigned char u8;  
  
void UsartInit()  
{  
    SCON=0X50;          //0101 000设置串行口控制寄存器sm0,sm1为01,即为工作方式1  
    TMOD=0X20;          //设置计数器工作方式2  
  
     /*看到这里的TMOD=0x20可能有同学会有疑问了,将定时器工作方式寄存器定义为0x20  
      就是将计数器1的M1M0设为10,即方式2(8位初值自动重装的8位定时器/计数器)  
      做过动态数码管的同学可能知道,数码管里的是选择定时器0,为什么要用定时器1呢?  
      单片机内部定时器0和定时器1虽然都是16位定时计数器,但在硬件结构和寄存器配置方面,  
      还是有一些不同之处的,通过对寄存器的配置:  
  
      1,定时器0可分成2个独立的8位定时器,而定时器1则不能;  
      2,定时器1可作为**串口的波特率发生器**,而定时器0则不能。*/  
  
    PCON=0X80;          //定义PCON寄存器中的SMOD=1,波特率加倍  
    TH1=0XF3;               //计数器初始值设置,注意波特率是4800的,当然大家可以改  
    TL1=0XF3;  
    EA=1;               //打开总中断  
    ES=1;               //打开中断允许中的串行口中断允许  
    TR1=1;              //打开计数器  
}  
void main()  
{     
    UsartInit();  //    串口初始化  
    while(1);         
}  
void Usart() interrupt 4  
{  
    u8 rec;  
    rec=SBUF+1;//出去接收到的数据,为了效果更明显,即向pc机发送1,回应2这样的效果  
    RI = 0;//清除接收中断标志位  
    SBUF=rec;//将接收到的数据放入到发送寄存器  
    while(!TI);          //等待发送数据完成  
    TI=0;                        //清除发送完成标志位  
}

51单片机串口通信——串口设置_第1张图片

你可能感兴趣的:(51单片机)