基于单片机的GPS开发 (two) UART程序详解

void Uart_Init()					  			   
{
		SCON = 0X50;  
		REN  = 1;    
		PCON = 0x00;  
		TMOD = 0x20;  
		TH1  = 0xFD;  
		TL1  = 0xFD;
		TR1  = 1;    
		EA   = 1;   
		ES   = 1;    
}

详解SCON = 0X50 :

SCON是串行口寄存器,0X50就是 0101 0000,SCON=0X50实际上就是 SM1=1; SM0=0; 这两条语句的集合,也就是说允许接受串行口中断方式1 (即8位异步通讯)。

详解REN = 1:

REN是允许接收控制位,由软件置1或清0。REN = 1时,设置为允许接收,相当于串行接收的开关。

详解PCON = 0x00 :

PCON是电源控制寄存器,不可位寻址。0x00=0000 0000,设置波特率不加倍。

详解TMOD = 0x20 :
0X20就是 0010 0000,选择的是定时器0,工作方式选择方式2:自动重载8位定时器/计数器。

详解TH1  = 0xFD,TL1  = 0xFD :

TH 和TL 是定时器的高位和低位, 即设置9600的波特率。

详解TR1  = 1EA   = 1ES   = 1 :

启动定时器1,打开全局中断控制,打开串行口中断。

*********************************************************************************************

void RECEIVE_DATA(void) interrupt 4 using 3	  
{ 
		unsigned char temp = 0;
		ES=0;
		temp = SBUF;
		RI = 0;
		if(temp == '$')
		{
				RX_Count = 0;
				Flag_GPS_OK = 0;		
		}
		RX_Buffer[RX_Count++] = temp;
		if(RX_Count >= 59)
		{
				RX_Count = 59;
				Flag_GPS_OK = 1;	
		}
		ES=1; 
}

详解 interrupt 4 using 3 :    

interrupt 4  :使用串行口中断

using 3:使用第三组寄存器

详解 ES=0: 

串口发送和接收都会产生中断,这里的写法  ES=0  是发送数据时关闭串口中断,发送完成才打开串口中断。

在程序结尾有一个ES = 1,这两句话中间包裹的程序不就是所谓的我们发送出去的数据吗,发送完成后我们才打开串口中断。

详解temp = SBUF: 

SBUF是串口的数据寄存器,收到和发送的数据都放在这个寄存器中。

串口接收和发送用的是P3.0和P3.1,跟其它管脚没有关系。

收到数据后可以 temp= SBUF。发送时可以 SBUF=data。

说白了,就是串口传一帧数据过来,放在SBUF里面,每放进去一个数据,我们就要把它取出来保存起来,等待后面我们自己使用对吧。

有人会问为什么我们不直接用SBUF中的数据呢那是因为SBUF是缓存器不是存储器当一个数据存进来时SBUF可以暂存,然而当新的数据存进来时SBUF里存储的旧数据就会被新数据挤掉即丢失。

详解RI = 0: 

RI 是串口接收中断申请标志位。就是有数据进来的时候,RI自动置0,接受完数据后,需要手动置1,进行下一个数据的接收。

 

 

 

posted @ 2022-12-01 22:17  Lauriee  阅读(98)  评论(0编辑  收藏  举报  来源