使用编译器高科技从PC接收数据到PIC 16F877A

时间:2014-01-13 02:36:12

标签: microcontroller pic uart

我尝试将数据从pc发送到pic微控制器。我是PIC的初学者。 我从超级终端发送数据,数据将显示在PIC的端口B的led中。

我使用了10Mhz时钟和9600波特率的连接。

这是我的uart.h程序:

 char UART_Init(const long int baudrate)
 {
unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if(x>255)
{
    x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
    BRGH = 1;
}
if(x<256)
{
  SPBRG = x;
  SYNC = 0;
  SPEN = 1;
  TRISC7 = 1;
  TRISC6 = 1;
  CREN = 1;
  TXEN = 1;
  return 1;
}
return 0;
}

 char UART_TX_Empty()
{
  return TRMT;
 }

char UART_Data_Ready()
 {
  return RCIF;
 }
 char UART_Read()
{

   while(!RCIF);
   return RCREG;
 }

 void UART_Read_Text(char *Output, unsigned int length)
 {
    int i;
for(int i=0;i<length;i++)
    Output[i] = UART_Read();
  }

 void UART_Write(char data)
 {
  while(!TRMT);
 TXREG = data;
 }

 void UART_Write_Text(char *text)
 {
  int i;
   for(i=0;text[i]!='\0';i++)
      UART_Write(text[i]);
 }

这是我的主要计划:

 #include<htc.h>
 #include<pic.h>
 #define _XTAL_FREQ 10000000 //Clock Frequency
 #include "uart.h"

void main()
{
   TRISB = 0x00; //PORTB as Output
   UART_Init(9600);
do
   {
    if(UART_Data_Ready())       
    PORTB = UART_Read();
 __delay_ms(1000);

   }while(1);
 }

在超级终端我发送数据说10010010但是端口B中的led没有响应,我的程序中是否有任何错误?

1 个答案:

答案 0 :(得分:0)

您有几个步骤:初始化UART,初始化LED,通过UART进行通信以及设置PC的UART。您成功编写和测试了哪些组件?你说你是初学者,那么你在PIC上成功执行的最小功能程序是什么?多年来我一直在使用微控制器,但我仍然安排了一整天才能启动单个LED,因为它可能是软件问题,硬件问题,电压问题,振荡器问题,PCB问题或编译问题。

以下是我为微芯片提出的步骤:

  1. 浏览数据表中的振荡器部分,配置位部分,看门狗部分和引脚分配部分(寻找VDDVSS)。这些是最难实现的部分。 (关于振荡器的问题:只是因为你可以编程芯片,并不意味着振荡器正在工作,因为程序员提供了它自己的时钟。)
  2. 写下最小的代码以打开一个LED。
  3. 写下极小的代码,使LED闪烁(现在只使用for循环延迟,定时器会更晚)
  4. 写UART初始化代码并传输单个字符,我使用captial U,因为它非常漂亮。 TXREG = 'U';
  5. 将UART连接到PC,查看超级终端是否看到U。如果没有,我将一个示波器连接到线路,以确保PIC正在发送,当我输入字符时PC发送,并且边缘的时间匹配。
  6. 在PIC代码中,从终端获取UART回音字符。 (TXREG = RXREG;),然后键入超级终端并确保回显字符。
  7. 还有一点需要注意:

    不要让PIC执行SPBRG计算。 PIC16是8位处理器,10000000需要32位才能存储。整数divison可能会出现打嗝。它可能没有错误,但是没有必要让PIC每次都计算它。事先计算并硬编码值。