今天对51单片机串口通信写了具体的代码:
首先是发送数据,每秒输出一个递增的整数,代码如下:
#include <REGX52.H>
#include "delay.h"
unsigned int sec;
void UART_Init() //4800bps@12.000MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x40; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void UART_SEND(unsigned char byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void main()
{
UART_Init();
while(1)
{
UART_SEND(sec);
sec++;
delay(1000);
}
}
其中串口初始化函数使用了stc-isp软件直接生成,经测试可以正常运行
之后是向单片机发送数据,代码如下:
#include <REGX52.H>
void UART_Init() //4800bps@12.000MHz
{
PCON |= 0x80;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xF3;
TH1 = 0xF3;
ET1 = 0;
TR1 = 1;
EA=1;
ES=1;
}
void main()
{
UART_Init();
while(1)
{
}
}
void UART_routine() interrupt 4
{
if(RI==1)
{
P2=SBUF;
RI=0;
}
}
这里代码遇上个代码区别在于SCON中REN置为1,意为打开串行接收,打开串口中断,之后又增加了一个中断函数对接收数据做出相关控制。
我这里写的是电脑发送数据控制单片机LED模块。