串口通讯例程

串口通讯例程_第1张图片串口通讯例程_第2张图片串口通讯例程_第3张图片
例:SCON=0X50; //把SM1置1,方式1工作方式;把REN置1,串口允许接收位;01010000 (8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),

串口通讯例程_第4张图片
串口通讯例程_第5张图片
例:TMOD=0X20; //8位自动装载定时器 00100000

串口通讯例程_第6张图片
例:PCON=0X80;,把SMOD置1;工作方式1,2,3的波特率加倍,1000 0000

串口通讯例程_第7张图片
例:TR1=1;启动定时器1;

串口通讯例程_第8张图片
例:ES=1;打开串口中断 EA=1;打开总中断

#include "reg51.h"

typedef unsigned char u8;
typedef unsigned int  u16;


#define	FOSC	12000000L
#define	BAUD	4800
#define	SMOD_2	2		//(2的SMOD次方)

#define	T1MS	(256-FOSC*SMOD_2/384/BAUD)


void usartinit()	 
{
 SCON=0X50;	//寄存器模式 SM0=0,SM1=1方式1(8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),
 			//REN=1,串口允许接收位,01010000 
 TMOD=0X20;	 //8位自动装载定时器
 PCON=0X80;	//设置SMOD置1,波特率提高一倍, 
 TH1=T1MS;	  //波特率数值
 TL1=T1MS;	  //波特率数值
 TR1=1;	    //启动定时器1
 
 ES=1;	   //打开串口中断
 EA=1;	  //打开总中断
}


void main()
{
  usartinit();  //调用子函数
  while(1);	  //让它循环
}

void usart () interrupt 4  //编写外部中断号4
{
  u8 receivedata;	 //变量
  if(RI==1)	       //接收完数据由硬件自动置RI=1;判断是否接收完成
  {
	  receivedata=SBUF; // 保存串口发送的数据
	  RI=0;  //软件清0
	  SBUF=(receivedata+1); //将接收到的数据通过receivedata返回给Pc机串口
	  //SBUF 是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收,
	  //发送也是,当单片机准备发送数据时,会先把数据放到SBUF中,然后再发送出去。
	  while(!TI); //发送完通过while循环判断,等待发送完成
	  TI=0;		  //只有发送完,我们才通过软件清零,这样才可以进行下一次发送
 }
} 

你可能感兴趣的:(串口通讯例程)