我尝试将数据从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]!=' ';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没有响应,我的程序中有任何错误吗?
您有几个步骤:初始化UART、初始化LED、通过UART通信以及设置PC的UART。您成功编写和测试了哪些组件?你说你是一个初学者,那么你在PIC上成功执行的最小功能程序是什么?我已经使用微控制器多年了,但我仍然安排大约一整天的时间来打开一个LED,因为这可能是软件问题、硬件问题、电压问题、振荡器问题、PCB问题或编译器问题。
以下是我对微芯片提出的步骤:
- 查看数据表中的振荡器部分、配置位部分、看门狗部分和引脚输出部分(查找
VDD
和VSS
)。这些是最难纠正的部分。(关于振荡器的一个问题是:仅仅因为你可以对芯片进行编程,并不意味着振荡器可以工作,因为程序员提供了自己的时钟。) - 编写最低限度的代码以打开单个LED
- 编写最简单的代码以使LED闪烁(现在只需使用for循环延迟,计时器稍后会出现)
- 编写UART初始化代码并传输单个字符,我使用标题U,因为它是二进制的。
TXREG = 'U';
- 将UART连接到PC,查看超级终端是否看到
U
。如果没有,我会在线路上连接一个示波器,以确保PIC正在传输,PC在我键入字符时传输,并且边缘的时间匹配 - 在PIC代码中,具有来自终端的UART回波字符。(
TXREG = RXREG;
),然后键入超级端子并确保字符得到回显
还有一个注意事项:
不要让PIC执行SPBRG
计算。PIC16是8位处理器,10000000需要32位存储。整数除数可能会出现问题。它可能没有错误,但没有必要让PIC每次都计算它。先计算一下,然后硬编码。