打印
[51单片机]

关于串口中断的问题,,,

[复制链接]
3399|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
浪浪云|  楼主 | 2013-10-7 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void init()
{
        TMOD=0x20;//定时器1工作方式2
        TH1=0xfd;
        TL1=0xfd;//初值波特率9600
        TR1=1;//开启定时器1
        REN=1;//允许串口中断
        SM0=0;
        SM1=1;//SCON   方式1
        EA=1;//开总中断
        ES=1;        //开串口中断
}
void main()
{       
        init();//初始化函数
        while(1);
}

void ser() interrupt        4        //串口中断
{
        RI=0;                //取消中断申请
        P1=SBUF;          //把接收到的值赋给P1  即发光二极管
}


看了好久,可能是遗漏了某个细节了

上位机发送值给SBUF   然后P1     ,为啥这个程序只能发送一次????中断不是任何时候都能申请吗?小弟求大神

相关帖子

沙发
crazy2012| | 2013-10-7 09:54 | 只看该作者
关注下

使用特权

评论回复
板凳
浪浪云|  楼主 | 2013-10-7 09:58 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag;
void init()
{       
        flag=0;
        TMOD=0x20;//定时器1工作方式2
        TH1=0xfd;
        TL1=0xfd;//初值波特率9600
        TR1=1;//开启定时器1
        REN=1;//允许串口中断
        SM0=0;
        SM1=1;//SCON   串口中断方式1
        EA=1;//开总中断
        ES=1;        //开串口中断
}
void main()
{       
        init();//初始化函数
        while(1)
        {
/*                if(flag==1)
                {
                        flag=0;
                        ES=0;
                        SBUF='1';/////////当把这个注释部分取消注释后,一切正常,否则上位机只能发送一次数据。。。。。何解????
                        while(!TI);
                        TI=0;
                        ES=1;
                }*/
        }

}

void ser() interrupt        4        //串口中断
{
        RI=0;                //取消中断申请
        P1=SBUF;        //把接收到的值赋给P1  即发光二极管
        flag=1;
}


当把这个注释部分取消注释后,一切正常,否则上位机只能发送一次数据。。。。。何解????

使用特权

评论回复
地板
NE5532| | 2013-10-7 10:07 | 只看该作者
你不往SBUF里填写数据,后面的while(!TI);哪里能等到TI标志呢?

当P1=SBUF;以后,就应该检测TI了,你这个属于典型的“头尾分家”型程序,属于没有搞懂中断和主循环之间的关系。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
浪浪云 + 1
5
浪浪云|  楼主 | 2013-10-7 10:21 | 只看该作者
NE5532 发表于 2013-10-7 10:07
你不往SBUF里填写数据,后面的while(!TI);哪里能等到TI标志呢?

当P1=SBUF;以后,就应该检测TI了,你这个 ...

我用了串口助手并且写了数据。。你的意思是在中断里面检测TI?TI不应该是单片机向上位机发送数据才检测吗?

使用特权

评论回复
6
追梦人_梦| | 2013-10-7 10:30 | 只看该作者
你一次只发一个字节数据试试比如0x55

使用特权

评论回复
7
受不了了| | 2013-10-7 10:33 | 只看该作者
你还不如在串口中断里把一个管脚取反点个灯好了,这样最直观

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
浪浪云 + 2
8
追梦人_梦| | 2013-10-7 10:36 | 只看该作者
浪浪云 发表于 2013-10-7 09:58
#include
#define uint unsigned int
#define uchar unsigned char

试着把SBUF='1';改为 十六进制发送SBUF=0x。。

使用特权

评论回复
9
浪浪云|  楼主 | 2013-10-7 10:36 | 只看该作者
追梦人_梦 发表于 2013-10-7 10:30
你一次只发一个字节数据试试比如0x55

我试了,还是老样子,就只能发一次

使用特权

评论回复
10
追梦人_梦| | 2013-10-7 10:37 | 只看该作者
浪浪云 发表于 2013-10-7 09:58
#include
#define uint unsigned int
#define uchar unsigned char

发完后上位机能收到1吗?

使用特权

评论回复
11
追梦人_梦| | 2013-10-7 10:38 | 只看该作者
浪浪云 发表于 2013-10-7 10:36
我试了,还是老样子,就只能发一次

是不是要重启才能在发

使用特权

评论回复
12
浪浪云|  楼主 | 2013-10-7 10:39 | 只看该作者
追梦人_梦 发表于 2013-10-7 10:36
试着把SBUF='1';改为 十六进制发送SBUF=0x。。

我的意思是while里面有if语句的时候是正常的

如果把while里面为空语句的话,会有上述的问题:)

使用特权

评论回复
13
追梦人_梦| | 2013-10-7 10:43 | 只看该作者
浪浪云 发表于 2013-10-7 10:39
我的意思是while里面有if语句的时候是正常的

如果把while里面为空语句的话,会有上述的问题 ...

第一次发完,第二次发完后LED没变化吗

使用特权

评论回复
14
浪浪云|  楼主 | 2013-10-7 10:53 | 只看该作者
受不了了 发表于 2013-10-7 10:33
你还不如在串口中断里把一个管脚取反点个灯好了,这样最直观

前辈的方法我试了,结果还是只能一次,很诡异啊

使用特权

评论回复
15
浪浪云|  楼主 | 2013-10-7 10:55 | 只看该作者
追梦人_梦 发表于 2013-10-7 10:43
第一次发完,第二次发完后LED没变化吗

对,就是只能中断一次

使用特权

评论回复
16
受不了了| | 2013-10-7 10:58 | 只看该作者
浪浪云 发表于 2013-10-7 10:53
前辈的方法我试了,结果还是只能一次,很诡异啊

你程序这么短,那就把灯一路点过去好了,也就一会的事情,看究竟程序在哪里不是照你的意图运行

使用特权

评论回复
17
浪浪云|  楼主 | 2013-10-7 12:04 | 只看该作者
受不了了 发表于 2013-10-7 10:58
你程序这么短,那就把灯一路点过去好了,也就一会的事情,看究竟程序在哪里不是照你的意图运行 ...

单片机是不是上电的时候自动进入串口中断?点了一路的灯,还是不行。开学问问老师吧

使用特权

评论回复
18
yirongfu| | 2013-10-7 12:32 | 只看该作者
这个问题有意思

RXD线上接上拉电阻了吧?
不用if部分,中断里头把RI=0;和P1=SBUF;对调先后顺序试试看。

使用特权

评论回复
19
yirongfu| | 2013-10-7 12:35 | 只看该作者
上电后中断默认是关闭的

使用特权

评论回复
20
浪浪云|  楼主 | 2013-10-7 13:25 | 只看该作者
yirongfu 发表于 2013-10-7 12:35
上电后中断默认是关闭的

硬件应该没有问题,是开发板。程序下载之后用串口助手发送数据只能发送一次,但是   关闭串口再重新打开又能发一次。。关闭打开 发一次。。。关闭打开。。。这是啥问题?

使用特权

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

本版积分规则

23

主题

99

帖子

2

粉丝