pic18f86j90单片机的IO口模拟串口问题
用串口调试助手监视,单片机发数据给PC,数据是对的;可是PC发数据给单片机却只有偶尔是对的,会误接收为其他数据。应该是波特率不够准确,可是不懂用什么办法可以让波特率做到更精确,还请各位高手指点指点,有没有什么好的办法没有?程序如下:
#include <p18f86j90.h>
/**********************************宏定义*************************************/
#define RXDPORTBbits.RB2
#define TXDLATBbits.LATB1
#define RXD_INTRISBbits.TRISB2 = 1
#define TXD_OUTTRISBbits.TRISB1 = 0
#define Receive_DelayUSART_Delay(67) //串口发送时的延时,延时208us,波特率4800
#define Send_DelayUSART_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;
}
[解决办法]
软延时不够精确,很容易被其它操作干扰,比如说中断
[解决办法]
嗯,直接delay一遇到中断什么的就不准确了,可能什么都不做的话是准确的,但单片机运行过程中未必就是你想要延时得到的时间了。