基于单片机的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 = 1,EA = 1,ES = 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,进行下一个数据的接收。