当前位置: 代码迷 >> 单片机 >> 关于单片机串行口编程基础概念的有关问题
  详细解决方案

关于单片机串行口编程基础概念的有关问题

热度:39   发布时间:2016-04-28 15:49:20.0
关于单片机串行口编程基础概念的问题
#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;的操作,使能后开着即可
  相关解决方案