打印

pic18f86j90单片机的IO口模拟串口问题

[复制链接]
1941|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiramisu0501|  楼主 | 2012-12-15 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用串口调试助手监视,单片机发数据给PC,数据是对的;可是PC发数据给单片机却只有偶尔是对的,会误接收为其他数据。应该是波特率不够准确,可是不懂用什么办法可以让波特率做到更精确,还请各位高手指点指点,有没有什么好的办法没有?程序如下:

#include <p18f86j90.h>

/**********************************宏定义*************************************/

#define RXD                PORTBbits.RB2
#define TXD                LATBbits.LATB1

#define RXD_IN                TRISBbits.TRISB2 = 1
#define TXD_OUT                TRISBbits.TRISB1 = 0

#define Receive_Delay        USART_Delay(67)    //串口发送时的延时,延时208us,波特率4800
#define Send_Delay        USART_Delay(67)    //串口接收时的延时,延时208us,波特率4800

//串口初始化函数
void USARAT_Init(void)
{
    RXD_IN;
    TXD_OUT;
}

//位传输延时函数
void USART_Delay(uchar count)
{
    uchar i;
    for(i = 0; i < count; i++);
    Nop();
}

//发送一个字节数据的函数
void USART_SendByte(uchar sendByte)
{
    uchar i;
    TXD = 0;                                //发送起始位
    Send_Delay;

    for(i = 0; i < 8; i++)                //发送8位数据位
    {
        TXD = (sendByte & 0x01);        //先传低位
        Send_Delay;
        sendByte >>= 1;
    }

    TXD = 1;                        //发送结束位
    Send_Delay;
}

//接收一个字节数据的函数
uchar USART_ReceiveByte(void)
{
    uchar i = 0;
    uchar rc_byte = 0;
    Receive_Delay;

    for(i = 0; i < 8; i++)
    {
        rc_byte >>= 1;
        if(RXD)
        {
            rc_byte |= 0x80;
        }
        Receive_Delay;
    }

    return rc_byte;
}
沙发
zhengzhou86| | 2012-12-19 15:48 | 只看该作者
1.用外部晶振
2.换个上位机软件,有的写的不行,呵呵

使用特权

评论回复
板凳
tiramisu0501|  楼主 | 2012-12-20 11:46 | 只看该作者
模拟串口终于好了,应该是因为软件延时会受诸多因素的影响,现在改用外部中断+定时器,就没有问题了

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝