#include "REGX52.H"
#include <stdio.h> void _nop_(void); void delay(unsigned int i )//时子函数 { unsigned int time; for(time=0;time<i;time++) { _nop_; _nop_; _nop_; } } void com() { // IE=0x1a; /*中断允许*/ //通讯初始化子程序 TMOD=0x21; //设置定时器1为工作方式2,定时器0为工作方式1 //ET1=0; //关闭T1中断使能 TH1=0xf3; //预置定时器初值fd,波特率9.6k TL1=0xf3; // TH0=0xb8;//定时器0初值,定时20ms // TL0=0x62; // ET0=1;//开定时器0中断 // TR0=1;//启动定时器0*/ TR1=1; //起动定时器T1 PCON|=0x80; //波特率加倍 SCON=0x50; //串口工作在方式1,并且接收使能 // IE|=0x90; //使能串口中断 //通讯初始化结束 // IE=IE|0x80; /*开中断*/ //TR0=1; //TR2=1; SM0=0;//串口工作方式1 SM1=1; // EA=1;//开总中断 } void main() { unsigned char zhi; com(); while(1) { if(RI) { RI=0; zhi=SBUF; P0_0=~P0_0; SBUF=zhi; } } }
两个SUBF并不一样!在这里,简单说下。 RI,是数据标志位,也称为检测位吧,就是一旦单片机检测到串口给它发的数据,那么她自动将此值设定为非0值,
所以,一旦有数据从计算机发给单片机,就会进入if(RI)循环中。内部再将RI清零(RI=0);以方便下次数据来,让它再次检测!。zhi=SBUF;//将缓冲区的数据传给zhi。SBUF=zhi;//将接收到的数据送到发送的缓冲局。但他们在物理地址上并不代表同一个位置!
|