这是使用计算机和 PIC 控制 LED、风扇、继电器或螺线管的一种简单方法。
要求
一台装有 Microchip MPLAB X IDE 并安装了 XC8 v1.34 编译器的计算机。(我使用的是 MPLAB X v3.05 和 XC8 v1.34)
PIC16F628A 微控制器
一个 MAX232 驱动器/接收器
一种对 MCU 进行编程的方法
Eagle 的零件清单(见下文)
带串口接口的电脑/串口转USB线
如果你想把电路放在面包板上,你需要一块面包板和一些跳线
介绍
Maxim Integrated Products 于 1987 年创建了 MAX232 IC。它是双驱动器/接收器,通常将 RX、TX、CTS 和 RTS 信号从/到 PC 的串行端口(最高可达 25 v)从/到 TTL 电平(5 伏)。使用 MAX232 IC,您可以轻松地将 PIC 微控制器连接到 PC。这带来了很多机会。您可以控制 LED、风扇、继电器和螺线管等。在此操作方法中,我们将简单地打开然后关闭 LED。这听起来很简单,但有了这些知识,您已经可以构建很多东西了!您将需要一台带有串行端口或串行到 USB 转换器的计算机。我正在使用 USB 转 RS-232 适配器。在Wikipedia上阅读有关 RS-232 的更多信息。
有关 USART、USART 配置和初始化的更深入阅读,请阅读 Microchip 的: AN774 - 与 PICmicro USART 的异步通信。对于 ASM 程序员,此链接为您提供了一些源代码示例。
硬件
我们要做的第一件事是制作框图。这是我们的小工具的图表,分成块。这是一个很好的帮助,可以让我们保持在正轨上,它让我们可以忽略我们想要我们的电路做什么。

我们需要:
一种对我们的 MCU(ICSP 块)进行编程的方法
电脑与单片机通信,半双工,电脑块
MCU 控制 LED/输出,MCU 块
查看 LED/ 输出块
LED/输出块可以是 LED、风扇、继电器或螺线管,或您想要控制的任何其他东西。您需要解决的一个重要问题是确保您的 MCU 具有 USART 端口。我们使用的是 PIC16F628A,它有一个端口。IC 支路 7 和 8 分别是 PORTBbits.RB1 和 PORTBbits.RB2。如果您使用不同的 MCU,则必须考虑到这一点。
绘制电路时,您将需要组件数据表。PIC16F628A 的数据表可在此处找到。当您遇到困难时,这将是您的指南。另一个 IC 的数据表在这里: MAX232CPE。
此原理图中未考虑硬件握手。为了满足硬件握手,您必须在 X2 上放置一些跳线:

制作框图后,我们将绘制原理图:

单击图像以获得更好的分辨率。

零件清单
这是零件列表文件的屏幕截图。该文件由 EagleCAD 生成。

硬件做好之后,就是软件的时候了。
软件
编写软件时,您必须在附近有硬件数据表。我的设置允许我在一个屏幕上显示数据表,而在另一个屏幕上显示编程环境。这样,我可以在几秒钟内访问数据表。
这是基于 MPLAB X IDE 和 XC8 编译器的。所有内容均可在www.microchip.com免费下载。在编写代码时评论代码是一个好习惯。当你写它时,你可能会认为你会记住所有行的作用——你可能会记住第二天或一周的剩余时间。但是一个月后呢?你还会记得吗?使用评论。他们以后会节省很多工作,其他人会感谢你。以下代码注释得很好,因此无需逐行查看。因此,事不宜迟,这里是:
// INCLUDES
#include
#include
#include
#include
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = ON // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// DEFINITIONS
#define _XTAL_FREQ 16000000 // Tell the compiler that we are useing 16MHz
// GLOBAL VARIABLES
unsigned int choice; // Variable to hold user choice
bool getchar_active = false; // Boolean variable
// FUNCTION PROTOTYPE
void interrupt tc_int(void);
void UART_init(void);
unsigned char getch();
unsigned char getche(void);
void showMenu(void);
// FUNCTIONS
void UART_init(void){
TXSTAbits.BRGH = 0; // Setting BRGH to use LOW speed
TXSTAbits.SYNC = 0; // Setting async mode
TXSTAbits.TX9 = 0; // Setting 8-bit transmission
RCSTAbits.CREN = 1; // Enable continious receive
SPBRG = 25; // Setting the SPBRG register to use 16MHz with BRGH 0
PIE1bits.RCIE = 1; // USART receive interrupt enable
RCSTAbits.SPEN = 1; // Enable serial port
TXSTAbits.TXEN = 1; // Enable transmit
return;
}
unsigned char getch()
{
getchar_active = true; // Boolean variable set to true
while(getchar_active) // While true
continue; // Carry - on
return RCREG; // return the value in RCREG
}
unsigned char getche(void){
unsigned char c;
putch(c = getch());
return c;
}
void putch(unsigned char byte){ // Adding Carrier Return and Line feed
while(!TXSTAbits.TRMT);
TXREG = byte;
if ('\n'==byte){
while (!TXSTAbits.TRMT);
TXREG = '\r';
}
return;
}
void interrupt tc_int(void){
if(RCIE && RCIF) // Check RC Inter bit & Inter Flag
{
getchar_active = false;
RCREG;
}
return;
}
void showMenu(){
printf("\n\n*****************************************************\n");
printf("** PIC, MAX232 and PC communication demo **\n");
printf("*****************************************************\n");
printf("\n\t1. LED on.\n");
printf("\t2. LED off.\n");
printf("Your choice: ");
}
/*
* THIS IS THE MAIN PROGRAM
*/
int main(int argc, char** argv) {
TRISA = 0b00000000; // All output
PORTB = 0b00000000; // All low
TRISB = 0b00000110; // RB1 & RB2 set as input ref datasheet
PORTB = 0b00000000; // All low
UART_init(); // Initialize the UART
INTCONbits.PEIE = 1; // Enable peripheral interrupt
INTCONbits.GIE = 1; // Enable global interrupt
do {
showMenu(); // Show awesome menu
choice = getchar(); // Assign char from getchar to choice
switch(choice){ // Menu options
case '1': printf("\n\n\t\t** Led is ON **\n");
PORTBbits.RB3 = 1;
break;
case '2': printf("\n\n\t\t** Led is OFF **\n");
PORTBbits.RB3 = 0;
break;
default: printf("\n\n\t\t** Invalid choice. RTFM :-D **\n\n");
break;
}
} while (choice !=3);
return (EXIT_SUCCESS);
}
如果源代码编译时没有错误或警告,您可以对 MCU 进行编程,并将其连接到您的计算机。打开您喜欢的串行通信程序并使用 9600-8-N-1 进行端口设置。给电路通电,您应该会在屏幕上看到一个小菜单。它适用于 Windows 和 Linux。见最后的短视频。
结论
我们使用 PIC16F628A 和 MAX232 通过 PC 控制 LED。我们没有使用很多硬件,也没有很多代码。我们也没有费心制作自己的库来写入 UART 端口:我们使用了标准的 printf 函数。我们的代码使用了 PIC 的 9% 的数据存储器和 21% 的程序存储器。您可以从本页底部下载源代码。
图片
竞争电路
微控制器部分。
全部0条评论
快来发表一下你的评论吧 !