串口通讯例程

在这里插入图片描述在这里插入图片描述在这里插入图片描述
例:SCON=0X50; //把SM1置1,方式1工作方式;把REN置1,串口允许接收位;01010000 (8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),

在这里插入图片描述
在这里插入图片描述
例:TMOD=0X20; //8位自动装载定时器 00100000

在这里插入图片描述
例:PCON=0X80;,把SMOD置1;工作方式1,2,3的波特率加倍,1000 0000

在这里插入图片描述
例:TR1=1;启动定时器1;

在这里插入图片描述
例: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;		  //只有发送完,我们才通过软件清零,这样才可以进行下一次发送
 }
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值