這是使用計(jì)算機(jī)和 PIC 控制 LED、風(fēng)扇、繼電器或螺線管的一種簡單方法。
要求
一臺裝有 Microchip MPLAB X IDE 并安裝了 XC8 v1.34 編譯器的計(jì)算機(jī)。(我使用的是 MPLAB X v3.05 和 XC8 v1.34)
PIC16F628A 微控制器
Eagle 的零件清單(見下文)
如果你想把電路放在面包板上,你需要一塊面包板和一些跳線
介紹
Maxim Integrated Products 于 1987 年創(chuàng)建了 MAX232 IC。它是雙驅(qū)動器/接收器,通常將 RX、TX、CTS 和 RTS 信號從/到 PC 的串行端口(最高可達(dá) 25 v)從/到 TTL 電平(5 伏)。使用 MAX232 IC,您可以輕松地將 PIC 微控制器連接到 PC。這帶來了很多機(jī)會。您可以控制 LED、風(fēng)扇、繼電器和螺線管等。在此操作方法中,我們將簡單地打開然后關(guān)閉 LED。這聽起來很簡單,但有了這些知識,您已經(jīng)可以構(gòu)建很多東西了!您將需要一臺帶有串行端口或串行到 USB 轉(zhuǎn)換器的計(jì)算機(jī)。我正在使用 USB 轉(zhuǎn) RS-232 適配器。在Wikipedia上閱讀有關(guān) RS-232 的更多信息。
有關(guān) USART、USART 配置和初始化的更深入閱讀,請閱讀 Microchip 的: AN774 - 與 PICmicro USART 的異步通信。對于 ASM 程序員,此鏈接為您提供了一些源代碼示例。
硬件
我們要做的第一件事是制作框圖。這是我們的小工具的圖表,分成塊。這是一個(gè)很好的幫助,可以讓我們保持在正軌上,它讓我們可以忽略我們想要我們的電路做什么。
我們需要:
一種對我們的 MCU(ICSP 塊)進(jìn)行編程的方法
電腦與單片機(jī)通信,半雙工,電腦塊
MCU 控制 LED/輸出,MCU 塊
查看 LED/ 輸出塊
LED/輸出塊可以是 LED、風(fēng)扇、繼電器或螺線管,或您想要控制的任何其他東西。您需要解決的一個(gè)重要問題是確保您的 MCU 具有 USART 端口。我們使用的是 PIC16F628A,它有一個(gè)端口。IC 支路 7 和 8 分別是 PORTBbits.RB1 和 PORTBbits.RB2。如果您使用不同的 MCU,則必須考慮到這一點(diǎn)。
繪制電路時(shí),您將需要組件數(shù)據(jù)表。PIC16F628A 的數(shù)據(jù)表可在此處找到。當(dāng)您遇到困難時(shí),這將是您的指南。另一個(gè) IC 的數(shù)據(jù)表在這里: MAX232CPE。
此原理圖中未考慮硬件握手。為了滿足硬件握手,您必須在 X2 上放置一些跳線:
制作框圖后,我們將繪制原理圖:
單擊圖像以獲得更好的分辨率。
零件清單
這是零件列表文件的屏幕截圖。該文件由 EagleCAD 生成。
硬件做好之后,就是軟件的時(shí)候了。
軟件
編寫軟件時(shí),您必須在附近有硬件數(shù)據(jù)表。我的設(shè)置允許我在一個(gè)屏幕上顯示數(shù)據(jù)表,而在另一個(gè)屏幕上顯示編程環(huán)境。這樣,我可以在幾秒鐘內(nèi)訪問數(shù)據(jù)表。
這是基于 MPLAB X IDE 和 XC8 編譯器的。所有內(nèi)容均可在www.microchip.com免費(fèi)下載。在編寫代碼時(shí)評論代碼是一個(gè)好習(xí)慣。當(dāng)你寫它時(shí),你可能會認(rèn)為你會記住所有行的作用——你可能會記住第二天或一周的剩余時(shí)間。但是一個(gè)月后呢?你還會記得嗎?使用評論。他們以后會節(jié)省很多工作,其他人會感謝你。以下代碼注釋得很好,因此無需逐行查看。因此,事不宜遲,這里是:
// 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); }
如果源代碼編譯時(shí)沒有錯(cuò)誤或警告,您可以對 MCU 進(jìn)行編程,并將其連接到您的計(jì)算機(jī)。打開您喜歡的串行通信程序并使用 9600-8-N-1 進(jìn)行端口設(shè)置。給電路通電,您應(yīng)該會在屏幕上看到一個(gè)小菜單。它適用于 Windows 和 Linux。見最后的短視頻。
結(jié)論
我們使用 PIC16F628A 和 MAX232 通過 PC 控制 LED。我們沒有使用很多硬件,也沒有很多代碼。我們也沒有費(fèi)心制作自己的庫來寫入 UART 端口:我們使用了標(biāo)準(zhǔn)的 printf 函數(shù)。我們的代碼使用了 PIC 的 9% 的數(shù)據(jù)存儲器和 21% 的程序存儲器。您可以從本頁底部下載源代碼。
圖片
競爭電路
微控制器部分。
-
led
+關(guān)注
關(guān)注
242文章
23277瀏覽量
660893 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7494瀏覽量
87961 -
PIC
+關(guān)注
關(guān)注
8文章
507瀏覽量
87575
發(fā)布評論請先 登錄
相關(guān)推薦
評論