串口通信+按键中断,行得通吗?

2019-03-24 17:31发布

本帖最后由 铛铛铛挡 于 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"},啥也没有。


各位大神,我就加了那么几句而已,找来找去都找不出问题,请帮帮小弟
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
铛铛铛挡
2019-03-25 01:49
在一句一句的检查之后,我发现问题出在
       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中扫描该位并执行相应当作,但其实还是没有效果。

一周热门 更多>