本帖最后由 sinianzain 于 2012-10-2 15:14 编辑
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
void INIT_UART(void);
uchar DATA;
uchar code *ptr="Yes,man!";
void main(void)
{
uchar i;
INIT_UART();
while(1)
{
if(!RI) //判断是否进入过串口接收中断
{
for(i=0;i<strlen(ptr);i++) //向缓冲区发送数据
{
SBUF=ptr;
while(!TI); //等待,是否发送完毕
TI=0;
}
}
}
}
void INIT_UART(void)
{
TMOD|=0x20; //定时器T1工作方式为2
TH1=0xfd; //T1封装初值,波特率为9600,晶振频率为11.0592.
TL1=0xfd;
SCON=0x50; //(SM0=0/SM1=1(串口工作方式为1);REN=1(启动串口中断);)
EA=1;
ES=1;
ET1=1;
TR1=1;
}
void INTERRUPT_UART(void) interrupt 4
{
if(RI) //判断是否为接收中断
{
RI=0; //RI清0,便于下次进入中断
DATA=SBUF; //读取缓冲区数据
P1=DATA; //将缓冲区的数据输出到P1口
SBUF=DATA; //把接收到的数据再发回电脑端
}
if(TI) //判断是否为发送中断
TI=0;
}
在上面的程序中我选择让数据发送和数据接收都进串口中断,但是有些地方不明白,请指点,谢谢!
1、在发送完一个字节后,进入接收中断,也就是中断中的if(TI)部分,可是明明在中断中我已经将这个发送中断标志位清0,可为什么还要在返回中断现场时继续清0(main()函数中的TI=0),当我去掉中断现场的哪个TI=0,每次只显示Y m这两个字母?
2、RS232是全双工串口,那么这个发送中断和接收中断是否也是像数据发送和接收一样可以同时进行呢,或者是没发送一个字节便立刻接收一个字节? |