导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→p89c51rd2的串行通讯问题[fashin]

 *第42399篇: p89c51rd2的串行通讯问题

  
楼 主:fashin 2006年7月31日17:28
 p89c51rd2的串行通讯问题
急,51问题:
   这我写的一个串行通讯的程序阿。发送数据没有问题啊,但是接受数据可以进入中断,但是 temp_address=SBUF句中,sbuf的数据就是付值不给temp_address.为什么?
#include  <reg51.h>  
sbit p1_7=P1^7;
sbit work_state=P1^0;
unsigned char code address=0x01;
unsigned char data temp_address;
unsigned char data temp_function;
unsigned char data flag_uant;
unsigned char data flag_txd;
unsigned char code on[]="OK!";
unsigned char code off[]="off!";
unsigned char code error[]="command error !";

void init()
{
  IE=0;
  temp_address=0x00;
  temp_function=0x00;
}

void init_uant()
{
  PCON&=0X3F;
  TMOD=0X20;
  TH1=0XFD;
  TL1=0XFD;
  SCON=0X50;
  TR1=1;
  flag_uant=0;
  flag_txd=1;
  ES=1;
  EA=1;
}
void uant(void) interrupt 4
{
  
   if(RI==1)
       {
                  RI=0;

      temp_address=SBUF;
        if(temp_address==address) flag_uant=2;
  else
          {      flag_uant=1;
     
     }
  
   }
   if(TI==1)
   {
     TI=0;
  flag_txd=1;
   }
}
void main()
{
 char i;
 init();
  init_uant();
  while(1)
  {
     if(flag_uant==2)
    {
        i=0;
      while(error[i]!='\0')
    {
    flag_txd=0;
    SBUF=error[i];
    while(flag_txd==0);
    i++;
    }
  }
 }
}

  
2楼:wangxueyou 2006年8月1日20:32
 huifu
我觉得你最好还是把RI=0那句放到else语句之后 等所有中断操作都完成之后在把中断位清0  如果总是传不过去 你可以尝试着用ACC做个中间传递.我能给你的也就这么多建议了
  
3楼:fashin 2006年8月2日08:51
 谢谢你了啊
我按你说的改成如下,发现还不是不行,你能不能在帮我看一下.急用啊!!!!!谢谢!
#include  <reg51.h>  
sbit p1_7=P1^7;
sbit work_state=P1^0;
unsigned char code address=0x01;
unsigned char data temp_address;
unsigned char data temp_function;
unsigned char data flag_uant;
unsigned char data flag_txd;
unsigned char code on[]="OK!";
unsigned char code off[]="off!";
unsigned char code error[]="command error !";

void init()
{
  IE=0;
  temp_address=0x00;
  temp_function=0x00;
}

void init_uant()
{
  PCON&=0X3F;
  TMOD=0X20;
  TH1=0XFD;
  TL1=0XFD;
  SCON=0X50;
  TR1=1;
  flag_uant=0;
  flag_txd=1;
  ES=1;
  EA=1;
}
void serial(void) interrupt 4 using 1
{
  
   if(RI==1)
       {
      ACC=SBUF;
        temp_address=ACC;
        if(temp_address==address) flag_uant=2;
  else
          { 
     flag_uant=1;
    }
   RI=0;
   }
   if(TI==1)
   {
     TI=0;
  flag_txd=1;
   }
}
void main()
{
 char i;
 init();
  init_uant();
  while(1)
  {
     if(flag_uant==2)
    {
        i=0;
      while(error[i]!='\0')
    {
    flag_txd=0;
    SBUF=error[i];
    while(flag_txd==0);
    i++;
    }
  }
 }
}

  
4楼:wangxueyou 2006年8月2日09:22
 huifu
你可以尝试 SCON=0x7c;   如果使用的波特率是9600的话 那就把PCON=0x00;
其他的我也看不出来什么毛病了

>>>>>>对该主题发表你的看法

本主题贴数4,分页: [第1页]


[上一篇主题]:一个关于有用信号提取的问题?

[下一篇主题]:ULN2803怎么用?