UART通信PIC16f877A

时间:2014-09-07 12:53:36

标签: microcontroller pic uart microchip

我一直致力于一个需要与我的笔记本电脑和微芯片Pic 16f877a进行通信并且通信无法正常工作的项目,但是当我把这个例子放在Proteus 8上时工作正常。
我的笔记本电脑上没有RS232(串口),但是我买了TTL模块。我在电路板上使用外部振荡器8MHz,波特率为9600 bps。

当我连接我的笔记本电脑并发送到TTL模块时,A符号没有任何问题,当我发送几次A快速我收到奇怪的符号,如'?'或'#'回来。

以下是Pic的代码:

char x;
void main(){
  TRISB = 0x00;
  PORTB = 0x00;
  UART1_Init(9600);
  delay_ms(10);
while(1){
  if(UART1_Data_Ready())
  {
     x = UART1_Read();
     if(x == 'A')
     {
         PORTB = 0xFF;
         UART1_Write(13);
         UART1_Write_Text("A");
         UART1_Write(13);
     }
     else
     {
        PORTB = 0x00;
     }
  }
 x= '\0';
}
}

有人能帮助我吗?有什么问题?

3 个答案:

答案 0 :(得分:0)

据我所知,有两种可能性(假设UART1_Init(9600);是正确的库函数):

  1. 您没有将Rx引脚设置为输入;将TRIS寄存器设置为0会使该端口上的所有引脚都输出。

  2. 您使用的是不正确的奇偶校验。

  3. 您是否在行

    处设置了断点
    x = UART1_Read();
    

    要查看从终端程序发送时实际进入的内容?

    你有没有看过你的范围,看看Rx引脚到底发生了什么?

    delay_ms(10);完全没必要。

答案 1 :(得分:0)

@DiBosco,我尝试使用注册表并使用此代码:

void main() {
char st[] = "PROBA";
int i;
TRISC = 0x00;
TXSTA = 0x24;
RCSTA = 0x80;
SPBRG = 51;
delay_ms(10);
while(1)
{
 for(i=0;st[i]!='\0';i++)
 {
  TXREG = st[i];
  while(!(TXSTA&0x02));
 }
 delay_ms(1000);
}

}

我的计划是:?????

但是当我在mikroC上使用USART终端时,我得到:0xAF 0xAF 0xEB 0xFB 0xFB

PS:在Proteus上,这个例子也很好用:\

答案 2 :(得分:0)

SPBRG = 139

请参阅此link以设置相应的波特率发生器