打印
[PIC®/AVR®/dsPIC®产品]

关于Pic16f886串口接收的问题!!

[复制链接]
2223|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
涵潇舒雅|  楼主 | 2013-9-11 12:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 涵潇舒雅 于 2013-9-11 13:56 编辑

由于开发板还没有到,我用的是isis仿真器,我的发送没有问题,能够发送数据,其实到底有没有发送我也不确定,只是能够进入中断,
这是发送的中断函数
void interrupt isr()
{
        if(RBIE==1&&RBIF==1)
        {
                while(RB4);      //只有当按钮被释放时才往下执行
                a=1;
                set_led(0);
                PORTB=PORTB;
                RBIF=0;
        }
        if(TXIE==1&&TXIF==1)
        {
                set_led(2);
                TXIF=0;
        }
}

关于接收的串口的配置
void init_RC()
{
        SPEN=1;//串口使能位
        SYNC=0;//选择异步模式
        BRGH=1;//高速
        SPBRG=0X19;//设置波特率
        RX9=0;//允许接收8位数据
        SREN=0;//异步模式无效
        TXIE=0;//关闭发送中断
        TXEN=1;//允许发送?好像只有这样才能打开串口
        CREN=1;//使SCI工作在接收器方式
        RCIF=0;
        RCIE=1;//使能接受中断
}


下面是我的主函数
void main()
{
        TRISA=0;//A设置为输出
        init_RC();
        PIR1=0;//清空所有标志位
        PEIE=1;
        GIE=1;
        set_led(3);
        while(1)
        {
                if(payload==1)
                {
                        set_led(3);
                        payload=0;
                }
        }
}
void interrupt isr()
{
        set_led(3);
        if(RCIE==1&&RCIF==1)
        {
                payload=receive_byte();
                set_led(3);
                RCIF=0;
        }
}


不知道问题出在那里?不知道是仿真器的问题还是我自己代码的问题,求指教
沙发
小白变大白| | 2013-9-11 12:17 | 只看该作者
我最近也是用的这个~~
你程序不完整
RCIF和TXIF都是只读的
中断里最好不要调用其它函数
可能还有其它问题吧~

使用特权

评论回复
板凳
NE5532| | 2013-9-11 13:07 | 只看该作者
拿到开发板再弄实际的也不迟,仿真和实际可能有差异,现在硬着弄,会挫伤自己的积极性。

使用特权

评论回复
地板
yewuyi| | 2013-9-11 13:40 | 只看该作者
在中断函数中,中断标志位和中断容许位要一起判断中断源,否则一不注意就掉坑里了。。。

例如:if(TXIE&&TXIF){}

使用特权

评论回复
5
涵潇舒雅|  楼主 | 2013-9-11 13:45 | 只看该作者
yewuyi 发表于 2013-9-11 13:40
在中断函数中,中断标志位和中断容许位要一起判断中断源,否则一不注意就掉坑里了。。。

例如:if(TXIE&&T ...

的确是,我本想只要进入中断就点亮led,但是就是进不去!!有可能是仿真器的原因吧!我的配置应该没有问题吧!

使用特权

评论回复
6
涵潇舒雅|  楼主 | 2013-9-11 13:46 | 只看该作者
NE5532 发表于 2013-9-11 13:07
拿到开发板再弄实际的也不迟,仿真和实际可能有差异,现在硬着弄,会挫伤自己的积极性。 ...

的确是这么回事,感觉找不到突破口了啊!失落啊

使用特权

评论回复
7
涵潇舒雅|  楼主 | 2013-9-11 13:47 | 只看该作者
本帖最后由 涵潇舒雅 于 2013-9-11 13:54 编辑
小白变大白 发表于 2013-9-11 12:17
我最近也是用的这个~~
你程序不完整
RCIF和TXIF都是只读的
#include<pic.h>  //<***.h>是调用标准头文件
#include "delay.h"// "***.h"是调用非标准头文件
#include "uart.h"
uchar PORTB_TEMP,a=0,payload;
void init()
{
        RA0=0;
        RA1=0;
        TRISA=0;

        //配置RB4为上升沿中断
        RB4=0;
        TRISB4=1;
        ANSELH=0;
        RBPU=0;//上升沿触发
        WPUB4=1;
        IOCB4=1;
        RBIE=1;
        PORTB=PORTB;
        RBIF=0;
}
void main()
{
        TRISA=0;//A设置为输出
        init_RC();
        PIR1=0;//清空所有标志位
        PEIE=1;
        GIE=1;
        set_led(3);
        while(1)
        {
                if(payload==1)
                {
                        set_led(3);
                        payload=0;
                }
        }
}
void interrupt isr()
{
        set_led(3);
        if(RCIF==1&&RCIE==1)
        {
                payload=receive_byte();
                set_led(3);
                RCIF=0;
        }
}

使用特权

评论回复
8
yewuyi| | 2013-9-11 13:50 | 只看该作者
涵潇舒雅 发表于 2013-9-11 13:47

再重复提示你一次,在中断函数中,应该结合中断容许位和中断标志位一起判断中断源,例如:if(TXIE&&TXIF){}


请将中断函数中的各个中断源函数首先按照这个方式改掉再说。。。

使用特权

评论回复
9
涵潇舒雅|  楼主 | 2013-9-11 13:57 | 只看该作者
yewuyi 发表于 2013-9-11 13:50
再重复提示你一次,在中断函数中,应该结合中断容许位和中断标志位一起判断中断源,例如:if(TXIE&&TXIF) ...

恩,现在已经改掉了!!!其他配置有问题吗?

使用特权

评论回复
10
yewuyi| | 2013-9-11 15:12 | 只看该作者
涵潇舒雅 发表于 2013-9-11 13:57
恩,现在已经改掉了!!!其他配置有问题吗?

其他没看

使用特权

评论回复
11
兰天白云| | 2013-9-11 16:24 | 只看该作者
isis仿真器是什么?通讯测试最好有硬件,外加一个示波器,看波形是最爽的

使用特权

评论回复
12
涵潇舒雅|  楼主 | 2013-9-12 13:46 | 只看该作者
兰天白云 发表于 2013-9-11 16:24
isis仿真器是什么?通讯测试最好有硬件,外加一个示波器,看波形是最爽的

就是因为没有硬件,我才用的仿真器 泡一泡程序 试试

使用特权

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

本版积分规则

26

主题

164

帖子

1

粉丝