关于单片机串行口编程基础概念的问题
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
uchar code table[]="I get";
void init()
{
TMOD=0X20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
这是最基本的一道程序,简单解说一下,看下我的理解错误在哪里。
一系列初始化之后,进入while死循环。首先应该flag=0,怎么进去下面的程序?后者关闭串口中断(为什么关闭),循环六次把6个字符都发出去(应该是完整的两个I getI get),等待它发完产生中断进入中断服务程序(前面不是已经关闭了ES?),在中断服务程序里面先RI清0,然后接受SBUF里面的数据(前面里面有I getI get)放到a里面去(a前面定义只能放一个位呀?),让标志位等于1(这里才标志等于1,前面应该是0的呀)。中断服务程序回来后把TI清0(说明发送完了)。然后把a里面的东西又发送出去(这里a只有一位的吧),然后继续等它发完,再打开串行口中断(前面已经关闭了中断呀,这里才打开,怎么进去中断服务程序),让标志清0;
在串口助手里面第一次发送数据情况是 : I getI getI getI getUI get
除以上的问题外:
1:在main函数里面是管单片机发送数据,中断服务程序是管PC机的接收吗。
2:发现输出的东西变得难以控制,不知道它会发多少东西出来,SBUF没这么大呀!
3:是否两次进入了中断服务程序,等待了两次TI呀。
[解决办法]
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
51的这个中断是接收和发送都会进入这个中断,最好在期间做一个判断
void ser() interrupt 4
{
if (RI == 1);
{
///
}
}
程序的意图基本是你所要求的
不过我印象中是不需要ES=0;的操作,使能后开着即可