5014|8

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

串口通信+按键中断,行得通吗? [复制链接]

本帖最后由 铛铛铛挡 于 2016-9-10 10:46 编辑

首先讲一下我的思路:1,按键外部触发中断,即INT0或者INT1
2,响应中断,通过串口发送字符到PC机,在串口助手上显示
然而就这样简单的程序,我却被难住了
第一个程序:串口中断收发,运行正常

void main()
{
        bstv51_init();
        TMOD=0X20;                          //先设置T1为工作方式2        ,工作方式2会自动重装

        TH1=0XFC;                          //  
        TL1=0XFC;                          //
        PCON=0X80;                          //倍增位赋1,1000 0000,以上3句设置波特率14400
        SCON=0X50;                          //设置串口工作方式,0101 0000

        EA=1;                                  //打开全局中断
        ES=1;                                  //打开串行口中断
        TR1=1;                                  //打开计数器1

        while(1)
        {
         }
}
void uart() interrupt 4
{
        uchar date;
        date=SBUF;                                //接受缓存区的值赋给date   ,接受完毕则中断标志位置1
        RI=0;                                        //缓存区的值提取完毕后,将接受中断标志位手动赋0
        SBUF=date;                                //将date的值赋给发送缓存区,等待发送完毕
        while(!TI);                                        //等到发送完毕,发送中断标志位会置1产生中断
        TI=0;                                        //发送完毕,手动赋0标志位

}


第二个程序:在第一个程序的基础上,在main里加了3行:

        P3=0X08;                         //0000 1000    P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发)
        EX1=1;                                //INT1中断允许,按键中断 P3.3,第4排按键
        IT1=1;                                //INT1触发方式为下降沿触发        如果是沿触发,响应中断后,硬件自动清除中断标志。

        P1=0XF0;                                //1111 0000,LED灯一半亮一半灭

同时增加了INT1的中断服务函数
void KEY() interrupt 2
{

        uchar date[9]={"123456789"};
        uint i=0;
        P1=~P1;                                                 //LED灯变化   ,表明进入中断
        for(i=0;i<9;i++)
        {
                SBUF=date;;                                //将date的值赋给发送缓存区,等待发送完毕
                while(!TI);                                        //等到发送完毕,发送中断标志位会置1产生中断
                TI=0;                                        //发送完毕,手动赋0
        }                                       

}


串口助手设置波特率14400,数据位8位,停止位1位,没有校验位。
然而,在这里就跪了,串口助手发送字符没有收到返回,
按键可以触发中断(因为LED灯变化了),,串口助手却收不到date[9]={"123456789"},啥也没有。


各位大神,我就加了那么几句而已,找来找去都找不出问题,请帮帮小弟
此帖出自51单片机论坛

最新回复

请看另一个回复啊  详情 回复 发表于 2016-9-10 11:42
点赞 关注
 

回复
举报

2002

帖子

24

TA的资源

五彩晶圆(高级)

沙发
 
你出错的地方可能是在中断嵌套,一般不这样处理。改变思路如下
设全局标志位bKeyPress=false;
在按键中断中bKeyPress=true;退出中断
在住循环while里面if(bKeyPress) {发送串口字符; bKeyPress=false;}
此帖出自51单片机论坛

点评

多谢大侠,但是还是不行。另外这种处理方法,如果中断源比较多,一个个扫描再执行,对实时响应会不会有影响?  详情 回复 发表于 2016-9-10 09:37
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
在一句一句的检查之后,我发现问题出在
       P3=0X08;       //0000 1000    P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发)

因为P3.3是INT1,  P3.2是INT0;所以在上面的句子中,INT0一直收到低电平(即有效触发电平)
我改成了
P3=0X0f;      //0000 1111    P3.3(INT1)和P3.2(INT0)都赋1,以接受第4排按键触发信号(下降沿触发)
程序就正常了
产生了疑问,请大侠帮忙
1.INT0中断我并没有打开,而且也没有写INT0的中断函数,为什么还会造成干扰?
2.我通过LED等能够判断,即使INT0收到低电平,我仍然能够进入INT1中断,但是字符却发送不成功,这又是为什么?
3.按照楼上大侠的思路,我设置了一个全局变量flag,在中断中置位,在main中扫描该位并执行相应当作,但其实还是没有效果。
此帖出自51单片机论坛

点评

这跟INT0没关系,应该是一直为低,达不到产生下降沿的条件! 你不信吧P3挨着赋值:0x01,0x02,0x04,0x08,估计多半有一个是对的  详情 回复 发表于 2016-9-10 10:04
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

4
 
shower.xu 发表于 2016-9-10 01:28
你出错的地方可能是在中断嵌套,一般不这样处理。改变思路如下
设全局标志位bKeyPress=false;
在按键中断 ...

多谢大侠,但是还是不行。另外这种处理方法,如果中断源比较多,一个个扫描再执行,对实时响应会不会有影响?
此帖出自51单片机论坛
 
 
 

回复

109

帖子

1

TA的资源

一粒金砂(中级)

5
 
SBUF=date;                                //将date的值赋给发送缓存区,等待发送完毕

你勾选hex 显示,应该是有值的,只是这个值是数组的地址而已,而不是你想要的数组元素
此帖出自51单片机论坛

点评

如果是这样,照理说 P3=0X08; //0000 1000 P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发) 这句是没有问题的 但是整个程序我就改了这个部分,就可以正常收发了。  详情 回复 发表于 2016-9-10 10:48
 
 
 

回复

109

帖子

1

TA的资源

一粒金砂(中级)

6
 
铛铛铛挡 发表于 2016-9-10 09:36
在一句一句的检查之后,我发现问题出在
       P3=0X08;       //0000 1000    P3.3(INT1)赋1,以接受第4 ...

这跟INT0没关系,应该是一直为低,达不到产生下降沿的条件! 你不信吧P3挨着赋值:0x01,0x02,0x04,0x08,估计多半有一个是对的
此帖出自51单片机论坛

点评

所以INT0没有干扰咯。 但是很奇怪,问题就出在那一句,还是想不通  详情 回复 发表于 2016-9-10 16:16
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

7
 
深蓝恋风 发表于 2016-9-10 09:58
SBUF=date;                                //将date的值赋给发送缓存区,等待发送完毕

你勾选hex 显示 ...

如果是这样,照理说
P3=0X08;       //0000 1000    P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发)
这句是没有问题的
但是整个程序我就改了这个部分,就可以正常收发了。
此帖出自51单片机论坛

点评

请看另一个回复啊  详情 回复 发表于 2016-9-10 11:42
 
 
 

回复

109

帖子

1

TA的资源

一粒金砂(中级)

8
 
铛铛铛挡 发表于 2016-9-10 10:48
如果是这样,照理说
P3=0X08;       //0000 1000    P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触 ...

请看另一个回复啊
此帖出自51单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

9
 
深蓝恋风 发表于 2016-9-10 10:04
这跟INT0没关系,应该是一直为低,达不到产生下降沿的条件! 你不信吧P3挨着赋值:0x01,0x02,0x04,0x08, ...

所以INT0没有干扰咯。
但是很奇怪,问题就出在那一句,还是想不通
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表