打印
[STC单片机]

一个简单的串口通讯,但是有个问题一直搞不定,求指教!

[复制链接]
1306|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
秋水水天|  楼主 | 2015-3-28 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 秋水水天 于 2015-3-29 11:29 编辑

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag;
sbit key=P2^0;
sbit led=P0^0;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--)
        ;
}
void init()
{
         TMOD=0x21;        //计时器1工作在方式2
         TH1=0xfd;         //设初值,TH1的值自动重装到TL1
         TL1=0xfd;
         
         TH0=(65535-50000)/256;
         TL0=(65535-50000)%256;
         ET0=1;
         
         SCON=0x50;
         PCON=0x80;
         TR1=1;           //开计时器
         EA=1;            //开总中断
         ES=1;
}

void main()
{
         
         init();
         P0=0;
         while(1)
         {        
                  while(key==1);
                  SBUF=0xff;
                        while(!TI);
                        TI=0;
                        led=0;
                  while(!flag);
                        flag=0;
                  led=1;
                        
         }
}
void ser() interrupt 4
{
        RI=0;
        if(SBUF==0xff)
        {        
                flag=1;
        }
}
这段程序的功能是按键发送一个ff,发光二极管是灭的,然后接收一个ff,二极管亮。
问题在于第一次发送ff,正常,接收灯亮,
从第二次开始,按下后会发送很多ff,不用接收二极管常亮,个人感觉问题出在flag上,但是flag我有清零,又或者说发送进入中断使flag变一,但是,问什么呢?

相关帖子

沙发
wanyy| | 2015-3-28 17:06 | 只看该作者
while(!flag)后面是不是有个冒号才对啊!

使用特权

评论回复
板凳
lnulibin| | 2015-3-28 18:36 | 只看该作者
你的WHILE(1)循环体中,
只要按键按下,就向下执行。
如果返回的字节速度足够快,完全可以将循环体执行多次。

进出中断大约也就是几百微秒,时间很快。
人手按键的时间最短也应该在0.2秒左右。算一下,如果按下一次,可以将循环体执行多少次吧。呵呵。

编写程序时应该力求缜密。

使用特权

评论回复
地板
秋水水天|  楼主 | 2015-3-29 11:28 | 只看该作者
wanyy 发表于 2015-3-28 17:06
while(!flag)后面是不是有个冒号才对啊!

对对,我没写上,有冒号还是不行

使用特权

评论回复
5
秋水水天|  楼主 | 2015-3-29 11:30 | 只看该作者
lnulibin 发表于 2015-3-28 18:36
你的WHILE(1)循环体中,
只要按键按下,就向下执行。
如果返回的字节速度足够快,完全可以将循环体执行多次 ...

。。。本意的接收信号来自外部,没有接收程序不会运行,之前少写了一个冒号。

使用特权

评论回复
6
ningling_21| | 2015-3-29 14:45 | 只看该作者
while(!flag)  ;

改为

while(flag==0);

使用特权

评论回复
7
秋水水天|  楼主 | 2015-3-30 08:19 | 只看该作者
ningling_21 发表于 2015-3-29 14:45
while(!flag)  ;

改为

好像不行。

使用特权

评论回复
8
ningling_21| | 2015-3-30 08:41 | 只看该作者

中断程序有问题,逻辑太混乱
改一下中断

void ser() interrupt 4
{
if(RI==1)
{
  RI=0;        
if(SBUF==0xff)
        {        
                flag=1;
        }
}
if(TI==1)
{
   TI=0;
}
}

使用特权

评论回复
9
秋水水天|  楼主 | 2015-3-30 09:36 | 只看该作者
ningling_21 发表于 2015-3-30 08:41
中断程序有问题,逻辑太混乱
改一下中断

嗯嗯,flag的小问题纠结了我半天,太笨了,谢谢你:handshake

使用特权

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

本版积分规则

36

主题

227

帖子

0

粉丝