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

Tiramisu0501 2012-12-15 03:24:35
用串口调试助手监视,单片机发数据给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;
}
...全文
605 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
palleexu 2012-12-17
  • 打赏
  • 举报
回复
一点一点的试,一个语句占多长时间,发送一位后需要延时多长时间,你每发送一位,与你的波特率算出来的位宽要一致。
Tiramisu0501 2012-12-17
  • 打赏
  • 举报
回复
引用 2 楼 AnYidan 的回复:
p18f86j90没有uart 吗?为何不用库函数或直接配置 regster 设定 波特率
因为硬件的原因,本来的USART被占用了,只好用IO来模拟了,看样子软件延时确实不行,不过用16位的定时器,预分频也设置为1:1,也是发送可以,接收不行,用示波器看了,波特率好像还是不精确啊
palleexu 2012-12-16
  • 打赏
  • 举报
回复
嗯,直接delay一遇到中断什么的就不准确了,可能什么都不做的话是准确的,但单片机运行过程中未必就是你想要延时得到的时间了。
Binzo 2012-12-15
  • 打赏
  • 举报
回复
引用
Send_Delay;
你想通过delay设置波特率?肯定不行。 正如楼上所说,可以直接配置相关UART寄存器。
AnYidan 2012-12-15
  • 打赏
  • 举报
回复
p18f86j90没有uart 吗?为何不用库函数或直接配置 regster 设定 波特率
诶呦 2012-12-15
  • 打赏
  • 举报
回复
软延时不够精确,很容易被其它操作干扰,比如说中断

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧