打印

串口通讯问题,

[复制链接]
4651|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
喷嚏成风|  楼主 | 2013-4-19 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是郭天祥的代码
 #include "reg52.h"

#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I get ";
uchar flag,a,i;



void init()
{
        TMOD=0X20;
        TH1=0XFD;
        TL1=0XFD;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=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;
}
下面是我的代码
 #include "reg52.h"

#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I get ";
uchar flag,a,i;

void delayms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void init()
{
        TMOD=0X20;
        TH1=0XFD;
        TL1=0XFD;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
}

void main()
{
        init();

        while(1)
        {
        a=SBUF;
        if(RI==1)
        {
        for(i=0;i<6;i++)
        {
                SBUF=table[i];
                delayms(500);
               
        }
        SBUF=a;
        delayms(500);
        SBUF=' ';
        delayms(500);

        RI=0;
        }
        }

       
}

相关帖子

沙发
喷嚏成风|  楼主 | 2013-4-19 17:13 | 只看该作者
本来是想自己一步一步来,没想到这样就可以了,和郭天祥的差别很大。我的程序延时函数改为100ms就不行了。我这样写的程序行吗。功能是可以。但是没把TI置零可以吗?

使用特权

评论回复
板凳
ningling_21| | 2013-4-19 19:17 | 只看该作者
TI只是中断标志,如果不清除,会重复触发串口中断...
如果关闭串口中断,用查询的方式也可以工作...
你这样的程序勉强能工作...

使用特权

评论回复
地板
喷嚏成风|  楼主 | 2013-4-20 09:52 | 只看该作者
ningling_21 发表于 2013-4-19 19:17
TI只是中断标志,如果不清除,会重复触发串口中断...
如果关闭串口中断,用查询的方式也可以工作...
你这样 ...

谢谢,但是TI没清零的话,程序一直处于串口中断,应该不能发送下一个数据才对呀,可是我延时一会儿就可以了。不过时间短点的话,会出错

使用特权

评论回复
5
gx_huang| | 2013-4-20 10:07 | 只看该作者
先把串口的原理搞清楚,特别是中断和查询、TI/RI如何处理要搞明白。

使用特权

评论回复
6
ningling_21| | 2013-4-20 10:37 | 只看该作者
喷嚏成风 发表于 2013-4-20 09:52
谢谢,但是TI没清零的话,程序一直处于串口中断,应该不能发送下一个数据才对呀,可是我延时一会儿就可以 ...

如果TI未清除,如果开了中断的话才会进入中断处理否则不会。
如果上个数据已发送完成,TI未清除也一样能发送。
延时一会是让数据发送完成。
如果上一个数据未发送完成,发送下一个数据肯定出错。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
喷嚏成风 + 1 很给力!
7
helong124| | 2013-4-20 12:07 | 只看该作者
说得不错

使用特权

评论回复
8
喷嚏成风|  楼主 | 2013-4-21 17:06 | 只看该作者
ningling_21 发表于 2013-4-20 10:37
如果TI未清除,如果开了中断的话才会进入中断处理否则不会。
如果上个数据已发送完成,TI未清除也一样能 ...

就是说下面如果写一个中断函数的话,ES没等于的话,是不会处理这个函数的是不是?

使用特权

评论回复
9
喷嚏成风|  楼主 | 2013-4-21 17:08 | 只看该作者
喷嚏成风 发表于 2013-4-21 17:06
就是说下面如果写一个中断函数的话,ES没等于的话,是不会处理这个函数的是不是? ...

”ES没等于“后少了个1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝