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

PIC18F6722串口无法接收数据的问题

[复制链接]
1392|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JY-DX-JY|  楼主 | 2016-11-15 14:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用PROTEUS仿真PIC18F6722串口中断程序,可是串口老是收不到数据。
原理图如下:

程序如下:
/***************************************************
**
** MCU:PIC18f8772
** 功能:串口接收
** 说明:中断方式
** 时间:2012-5-29     Lzy
**
*****************************************************/
#include <p18cxxx.h>

/*
串口初始化
设置异步接收操作的步骤如下:
1. 初始化SPBRGHx:SPBRGx寄存器,设置合适的
    波特率。按需要将BRGH 和BRG16 位置1 或清
    零,以获得目标波特率。
2. 通过将SYNC 位清零并将SPEN 位置1 使能异步串口。
3. 如果需要中断,将允许位RCxIE 置1。
4. 若需要接收9 位数据,将RX9 位置1。
5. 通过将CREN 位置1,使能接收。
6. 当接收完成时标志位RCxIF 将被置1,此时如果
    允许位RCxIE 已置1,还会产生一个中断。
7. 读RCSTAx 寄存器以获取第9 位数据(如果已
    使能),并判断是否在接收过程中发生了错误。
8. 通过读RCREGx 寄存器来读取接收到的8 位数据。
9. 如果发生错误,通过将使能位CREN 清零来清除错误。
10. 若想使用中断,请确保将INTCON 寄存器中
    GIE 和PEIE 位(INTCON<7:6>)置1。
*/
void UartInit(void)
{
    RCSTA1bits.SPEN = 1;    // 串口使能

    TRISCbits.TRISC7 = 1;    // 异步串行接收数据输入
    TRISCbits.TRISC6 = 0;// 异步和同步主模式,TRISC<6> 零(= 0)

    // TXSTA1:发送状态和控制寄存器
    TXSTA1bits.SYNC = 0;    // 异步模式
    TXSTA1bits.TX9 = 0;     // 选择8 位发送
    TXSTA1bits.TXEN = 0;     // 禁止发送
    TXSTA1bits.BRGH = 1;     // 高速
    TXSTA1bits.TXEN = 1; // 使能发送

    // RCSTA1:接收状态和控制寄存器
    RCSTA1bits.RX9 = 0; // 选择8 位接收
    RCSTA1bits.CREN = 1; // 使能接收器

    // BAUDCON1:波特率控制寄存器
    BAUDCON1bits.BRG16 = 0; // 8位波特率发生器——SPBRGHx 和SPBRGx
    SPBRG1 = 25;

    // 外设中断允许寄存器1
    PIE1bits.RC1IE = 1; // 允许EUSART 接收中断

    INTCONbits.GIE = INTCONbits.PEIE = 1; // 中断控制寄存器
    TRISF = 0;
}

void    InterruptHandlerHigh(void);
//高优先级中断向量
#pragma code InterruptVectorHigh=0x08

void    InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh         //跳到中断程
  _endasm
}

//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh

void InterruptHandlerHigh ()
{
    if(PIR1bits.RC1IF)    // 已接收数据
    {
        PIR1bits.RC1IF = 0;
        PORTF = RCREG1; // 读取接收到的数据
    }
}

void main()
{
       
    UartInit();
    while(1);

}

高手指教,问题出在哪里?谢谢
沙发
NE5532| | 2016-11-15 16:29 | 只看该作者
发送调通了没?

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2016-11-15 17:16 | 只看该作者
NE5532 发表于 2016-11-15 16:29
发送调通了没?

调通了。我怀疑PROTEUS不好用。

使用特权

评论回复
地板
NE5532| | 2016-11-16 08:41 | 只看该作者
检查串口接收完成标志位是否建立,我从来都不赞成用PROTEUS研究电子技术。

使用特权

评论回复
5
JY-DX-JY|  楼主 | 2016-11-16 11:06 | 只看该作者
NE5532 发表于 2016-11-16 08:41
检查串口接收完成标志位是否建立,我从来都不赞成用PROTEUS研究电子技术。

谢谢。我现在没有板子,只能这么干。接收完成标志位没有建立。
现在我把程序改成这样了。
#include <p18f67k22.h>
void main(void)
{
        TRISCbits.TRISC7=1;
        SPBRGH1=0;
        SPBRG1=25;
        TRISD=0;
        TXSTA1=0B00100000;
        RCSTA1=0B10010000;
        BAUDCON1=0X08;
        ODCON3=0;
        PMD0=0;
        while(1)
        {
                while(PIR1bits.RC1IF==0);
                PORTD=RCREG1;
        }       
}       

使用特权

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

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝