单片机通讯的程序问题

来源:百度知道 编辑:UC知道 时间:2024/07/02 22:56:27
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define OSC_FREQ 12000000
# define c_10ms (65536-OSC_FREQ/(12000000/9970))
uchar ucSBUF232;
/***************************************
//* 单片机初始化
/******************************************/

void Serial_Init()
{
IE=0x00;
TMOD=0X20; //定时器1,方式2工作
TH0=c_10ms/256;
TL0=c_10ms%256;
TH1=0Xfa; //定时器1 作波特律发生器, 波特率为4800bit/s
TL1=0Xfa;
PCON=0X00;
SCON=0XD8; //串口方式3,11异步收发发式
RI=0;
TI=0;
TR0=0;
TR1=1;
ES=1;
EA=1;

}

void Delay()
{
uchar i,j,h;
for(i=0;i<20;i++)
{
for(j=0;j<80;j++)
{
for(h=0;h<250;h++)
;
}
}
}

void Serrialinterrupt() interrupt 4
{
if(RI)
{
RI=0;
REN=0;
ucSBUF232=SBUF;
if(

RI是读中断溢出标志位,每当UART读取一个字节,则RI置1,需软件清0
TI是写中断溢出标志位,每向UART写入一个字节,则TI置1,需软件清0

中断溢出标志,中断后不会自动清零需要指令自己清零,REN为自己定义的变量用于标志中断是有发送完成的还是接收完成的!

TI (scon.1)片内串行口发送中断标志,当串行口发送完一帧数据时,将TI置位;

RI(scon.0)片内串行口接收中断标志,当串行口接收完一帧数据时,将RI置位。

这两位都需要软件清零。
REN(scon.4)为单片机串口接收使能控制位,REN=1,允许单片机接收,REN=0,禁止接收。