/*程序的功能是在T1定时器工作方式2下使用串口工作方式1实现串口通讯,
即PC机发送一串数据,51单片机将数据反馈回来。使用回车符作为一串字符串的结束标志
总结:
我是参照郭天祥51单片机写的,
这个程序写得还是有点疑惑,就是下面在接受完数据后
一定要先将串口中断关闭(即ES = 0),然后再进行处理,
如果不关闭中断的话,反馈回PC机的数据就是I get\n*/
#include<reg51.h>
//#define DEBUG
#define u8 unsigned char
#define u16 unsigned int
#define MAXSIZE 64
u8 code table[] = "I get ";
u8 flag,index,i,Len;
u8 Buff[MAXSIZE];
void Configuration()
{
TMOD = 0x20;
TH1 = 0xF3; //设置波特率为4800
TL1 = 0xF3;
TR1 = 1;
SCON = SCON & (0x3<<6);
SCON = SCON | (0x01<<6) | (1<<4); //设置串口工作模式和使能接受
PCON = PCON | (1<<7); //设置波特率加倍,即最终的波特率为9600
EA = 1; //开启中断
ES = 1;
}
void Recieve() interrupt 4
{
RI = 0;
Buff[index++] = SBUF;
#ifdef DEBUG
SBUF = Buff[index-1];
while(!TI);
TI = 0;
#endif
if (Buff[index-1]=='\n' ) //这一串数据结束
{
Len = index;
index = 0;
flag = 1;
}
}
void main()
{
Configuration();
while(1)
{
if (1==flag) //判断是否有数据到来
{
ES = 0; //要关闭中断,否则程序有问题
for(i=0;i<6;i++)
{
SBUF = table[i];
while(!TI); //等待数据发送完毕
TI = 0;
}
for(i=0;i<Len;i++)
{
SBUF = Buff[i];
while(!TI);
TI = 0;
}
flag = 0;
ES = 1;
}
}
}