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; //清除发送完成标志位
}