趁热打铁简单的写个程序帮助串口收发数据的理解,这个程序是通过电脑发送数据让单片机的led小灯根据数据点亮,同时从单片机发送接收到的数据给电脑。
一、寄存器的配置
之前已经讲了一下,自己如何配置寄存器,现在就直接用软件配置,复制代码然后放到工程中,注意这里是89c52RC并没有AUXR所以这里需要删除。
二、发送数据函数
直接把需要发送的数据写进SBUF中。
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
三、串口中断
串口中断的触发行为是发送或者接收完成,这里需要设置一个中断标志位。
这里的RI就是接收标志,如果RI=1时就是接收到了数据,然后点亮led,再发送接收到的数据,SBUF在逻辑物理上是两个,但是其实它们是同一个地址。然后最后手动置0RI,简简单单。
void UART_Routine(void) interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_SendByte(SBUF);//一个函数不能即在主函数里面出现又在中断函数出现会发生重录
RI=0;
}
}
四、完整代码及效果
4.1main.c
#include <REGX52.H>
#include "UART.h"
#include "Delay.h"
void main()
{
UART_Init();
while(1)
{
}
}
void UART_Routine(void) interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_SendByte(SBUF);//一个函数不能即在主函数里面出现又在中断函数出现会发生重录
RI=0;
}
}
4.2UART.c
#include "UART.h"
#include <REGX52.H>
/**
* @brief 串口初始化
* @parm
* @retval
*/
void UART_Init()//4800bps@12.000MHz
{
//启动定时器1
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
/**
* @brief 串口发送一个字节数据
* @parm 无
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
//串口中断函数模板
//void UART_Routine(void) interrupt 4
//{
// if(RI==1)
// {
// P2=~SBUF;
// UART_SendByte(SBUF);//一个函数不能即在主函数里面出现又在中断函数出现会发生重录
// RI=0;
// }
//}
4.3效果
这里发送0x0f,单片机接收后点亮了低四位的四个灯同时发送接收到的数据给电脑。