在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2793|回复: 3

[求助] c51 串口中断通信问题

[复制链接]
发表于 2011-10-29 22:05:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
问题描述:程序本意是想实现接收主机发来的字符串,格式c01010001111000101010w,c为数据开始,w为数据结束标志位,串口传输方式为文本模式,如果接收到字符‘0’或‘1’,则转换成int型0或1。最终结果的低八位通过P1口,输出到发光二极管用来验证结果的正确性。
但程序运行时,二极管并没有反应,(主机pc发送没有问题)。
请前辈们,看看以下程序哪地方有问题,谢谢啦

void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned int a,b,count;
unsigned int cw[21];
if(TI)
  TI=0;
if(RI)
{
  unsigned char ch;
  RI=0;
  ch=SBUF;
if(a==1&&ch=='w')
{
  a=0;
  b=1;
}
if(a==1)
{
  if(ch=='0')
  {
    cw[count]=0;
  }
  else
  {
    cw[count]=1;
  }
  count++;
}
if(ch=='c')
{
  a=1;
  count=0;
}
if(b==1);
{
  b=0;
  P1_0=cw[0];
  P1_1=cw[1];
  P1_2=cw[2];
  P1_3=cw[3];
  P1_4=cw[4];
  P1_5=cw[5];
  P1_6=cw[6];
  P1_7=cw[7];
}
}
}
 楼主| 发表于 2011-10-29 22:42:01 | 显示全部楼层
问题已经解决了,是没有定义全局变量,然后附上全程序:
#include<reg52.h>

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;                     

unsigned int data cw[21];
unsigned int a,b;

void SendStr(unsigned char *s);

void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
   // ES    = 1;                //打开串口中断
}                           

void main (void)
{
InitUART();
SendStr("A0B");
ES = 1;                  //打开串口中断
while (1)
{
        if(b==1);
                  {
                           b=0;
                        P1_0=cw[0];
                        P1_1=cw[1];
                        P1_2=cw[2];
                        P1_3=cw[3];
                        P1_4=cw[4];
                        P1_5=cw[5];
                        P1_6=cw[6];
                        P1_7=cw[7];
                   }
}                             
}

void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}

void SendStr(unsigned char *s)
{
while(*s!='\0')        // \0 表示字符串结束标志,通过检测是否字符串末尾
  {
  SendByte(*s);
  s++;
  }
}

void UART_SER (void) interrupt 4         //串行中断服务程序
{
        unsigned int count;

        if(TI)
         TI=0;
        if(RI)
        {
                unsigned char ch;
                RI=0;
                ch=SBUF;
                if(a==1&&ch=='w')
                {
                        a=0;
                        b=1;
                }

                if(a==1)
                {
                        if(ch=='0')
                        {
                                cw[count]=0;
                        }
                        else
                        {
                                cw[count]=1;
                        }
                        count++;
                }

                if(ch=='c')
                {
                        a=1;
                        count=0;
                }
        }
}
发表于 2011-10-30 01:48:44 | 显示全部楼层
这才对了啊,在中断里面处理的事情要尽可能少啊,定义数组肯定不行,哪有那么多栈资源,要花多少时间啊,效率低
发表于 2011-12-15 19:49:42 | 显示全部楼层
真的是受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-29 05:34 , Processed in 0.016622 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表