这是使用计算机和 PIC 控制 LED、风扇、继电器或螺线管的一种简单方法。
要求
一台装有 Microchip MPLAB X IDE 并安装了 XC8 v1.34 编译器的计算机。(我使用的是 MPLAB X v3.05 和 XC8 v1.34)
PIC16F628A 微控制器
Eagle 的零件清单(见下文)
如果你想把电路放在面包板上,你需要一块面包板和一些跳线
介绍
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% 的程序存储器。您可以从本页底部下载源代码。
图片
竞争电路
微控制器部分。
-
led
+关注
关注
242文章
23252浏览量
660558 -
计算机
+关注
关注
19文章
7488浏览量
87849 -
PIC
+关注
关注
8文章
507浏览量
87540
发布评论请先 登录
相关推荐
评论