首先需要配置寄存器:
下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可
void Uart_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
在main中调用SendByte函数,每按下一次复位键,接收缓冲区就会收到一个11
这就是单向发送的一个简单实例,接下来实现每隔一秒发送一个递增的数据,只需要添加一个全局变量Sec,再把SendByte放到循环中即可
#include <REGX52.H>
#include "Delay.h"
unsigned char Sec;
void Uart_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Uart_SendByte(unsigned char Byte)
{
SBUF = Byte; //写入
while(TI == 0); //直到发送成功,TI变成1,跳出循环
TI = 0; //复位
}
void main()
{
Uart_Init();
while(1)
{
Uart_SendByte(Sec);
Sec ++;
Delay(1000);
}
}
最后需要做的是把这个串口模块化,方便以后直接使用
下面实现电脑端向单片机发送数据,单片机需要利用中断来检测是否有数据发送过来,在中断函数里面来进行数据处理,接收功能需要把SCON的REN给置1,所以SCON = 0x50,中断系统需要重新配置
所以ES = 1;
EA = 1;
最后一个优先级开关可以先不管
写在Uart串口控制的初始化函数里
最后还要在main.c写中断函数 函数名后面要跟上interrupt 4代表串口接收/发送中断
在接收到信息之后RI会置1,此时进行处理,结束之后记得手动清零
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"
unsigned char Sec;
void main()
{
Uart_Init();
while(1)
{
}
}
void Uart_Routine() interrupt 4
{
if(RI == 1) //串口接收到数据后会自动将RI置1
{
P2 = SBUF; //读取缓冲区
RI = 0;
}
}
此时在输入区发送0f,左边全灭右边全亮啦
插入一条提醒:一个函数不能即在主函数中调用又在中断函数中调用!
在中断函数中调用SendByte即可让单片机在读取电脑发来的数据的同时,还能将这个数据Send回来
void Uart_Routine() interrupt 4
{
if(RI == 1) //串口接收到数据后会自动将RI置1
{
P2 = SBUF; //读取缓冲区
Uart_SendByte(SBUF);
RI = 0;
}
}
最后把串口中断函数放到之前的Uart模块里面,方便以后使用。。