0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用MAX232在PIC和PC之間進(jìn)行通信的過程

科技觀察員 ? 來源:allaboutcircuits ? 作者:Jens Christoffersen ? 2022-04-26 17:28 ? 次閱讀

這是使用計(jì)算機(jī)和 PIC 控制 LED、風(fēng)扇、繼電器或螺線管的一種簡(jiǎn)單方法。

要求

一臺(tái)裝有 Microchip MPLAB X IDE 并安裝了 XC8 v1.34 編譯器的計(jì)算機(jī)。(我使用的是 MPLAB X v3.05 和 XC8 v1.34)

PIC16F628A 微控制器

一個(gè) MAX232 驅(qū)動(dòng)器/接收器

一種對(duì) MCU 進(jìn)行編程的方法

Eagle 的零件清單(見下文)

帶串口接口電腦/串口轉(zhuǎn)USB

如果你想把電路放在面包板上,你需要一塊面包板和一些跳線

介紹

Maxim Integrated Products 于 1987 年創(chuàng)建了 MAX232 IC。它是雙驅(qū)動(dòng)器/接收器,通常將 RX、TX、CTS 和 RTS 信號(hào)從/到 PC 的串行端口(最高可達(dá) 25 v)從/到 TTL 電平(5 伏)。使用 MAX232 IC,您可以輕松地將 PIC 微控制器連接到 PC。這帶來了很多機(jī)會(huì)。您可以控制 LED、風(fēng)扇、繼電器和螺線管等。在此操作方法中,我們將簡(jiǎn)單地打開然后關(guān)閉 LED。這聽起來很簡(jiǎn)單,但有了這些知識(shí),您已經(jīng)可以構(gòu)建很多東西了!您將需要一臺(tái)帶有串行端口或串行到 USB 轉(zhuǎn)換器的計(jì)算機(jī)。我正在使用 USB 轉(zhuǎn) RS-232 適配器。在Wikipedia上閱讀有關(guān) RS-232 的更多信息。

有關(guān) USART、USART 配置和初始化的更深入閱讀,請(qǐng)閱讀 Microchip 的: AN774 - 與 PICmicro USART 的異步通信。對(duì)于 ASM 程序員,此鏈接為您提供了一些源代碼示例。

硬件

我們要做的第一件事是制作框圖。這是我們的小工具的圖表,分成塊。這是一個(gè)很好的幫助,可以讓我們保持在正軌上,它讓我們可以忽略我們想要我們的電路做什么。

jc_blockdia_max232.png

我們需要:

一種對(duì)我們的 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 上放置一些跳線:

jc_max232hh_2.png

制作框圖后,我們將繪制原理圖:

jc_PIC16F628-max232_4.png

單擊圖像以獲得更好的分辨率。

poYBAGJnuyiACicjAAByCFoS5qE617.png

零件清單

這是零件列表文件的屏幕截圖。該文件由 EagleCAD 生成。

jc_PIC16F628-MAX232-parts-2.png

硬件做好之后,就是軟件的時(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í)評(píng)論代碼是一個(gè)好習(xí)慣。當(dāng)你寫它時(shí),你可能會(huì)認(rèn)為你會(huì)記住所有行的作用——你可能會(huì)記住第二天或一周的剩余時(shí)間。但是一個(gè)月后呢?你還會(huì)記得嗎?使用評(píng)論。他們以后會(huì)節(jié)省很多工作,其他人會(huì)感謝你。以下代碼注釋得很好,因此無需逐行查看。因此,事不宜遲,這里是:

// 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ò)誤或警告,您可以對(duì) MCU 進(jìn)行編程,并將其連接到您的計(jì)算機(jī)。打開您喜歡的串行通信程序并使用 9600-8-N-1 進(jìn)行端口設(shè)置。給電路通電,您應(yīng)該會(huì)在屏幕上看到一個(gè)小菜單。它適用于 Windows 和 Linux。見最后的短視頻。

結(jié)論

我們使用 PIC16F628A 和 MAX232 通過 PC 控制 LED。我們沒有使用很多硬件,也沒有很多代碼。我們也沒有費(fèi)心制作自己的庫來寫入 UART 端口:我們使用了標(biāo)準(zhǔn)的 printf 函數(shù)。我們的代碼使用了 PIC 的 9% 的數(shù)據(jù)存儲(chǔ)器和 21% 的程序存儲(chǔ)器。您可以從本頁底部下載源代碼。

圖片

jc_pic16f628-max_complete.JPG

競(jìng)爭(zhēng)電路

jc_pic16f628max_mcu.JPG

微控制器部分。

jc_pic16f628max_max232.JPG

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    23072

    瀏覽量

    657076
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7372

    瀏覽量

    87636
  • PIC
    PIC
    +關(guān)注

    關(guān)注

    8

    文章

    507

    瀏覽量

    87427
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    兩個(gè)單片機(jī)通過max232串口通信,max232如何連線???

    請(qǐng)教高手:兩個(gè)單片機(jī)通過max232串口通信,max232如何連線???
    發(fā)表于 07-20 21:02

    PC機(jī)通過USB轉(zhuǎn)串口然后與MAX232連接進(jìn)行PC機(jī)與單片機(jī)的多機(jī)

    PC機(jī)通過USB轉(zhuǎn)串口連接MAX232,該MAX232與3個(gè)單片機(jī)的再用MAX232并聯(lián)進(jìn)行多機(jī)通信
    發(fā)表于 04-17 12:11

    只用串口座和max232可以進(jìn)行燒錄嗎

    上網(wǎng)查了好多,看了好多u***轉(zhuǎn)串口的,什么p***啊,ch340了,max232了,已經(jīng)暈了,有哪位大神可以告訴我這些有什么區(qū)別嗎?,ch340和max232是必須同時(shí)用嗎?如果只用串口座,max232可以
    發(fā)表于 04-18 19:24

    關(guān)于stm32使用max232進(jìn)行串口通信問題

    各位大神,小弟剛剛接觸stm32不久,最近學(xué)習(xí)串口通信時(shí)遇到了一些問題。還望大神們賜教。關(guān)于這個(gè)stm32,使用了max232之后還能不能使用串口線來進(jìn)行串口通信啊?還有就是這個(gè)u**
    發(fā)表于 08-08 21:24

    max232的串口通信和燒錄

    通信,max232如何連線啊?max232pcb中無法生成?!max232能用0.1uf電容嗎求max
    發(fā)表于 08-29 17:18

    PIC16f886 USART使用MAX485代替MAX232

    我有一個(gè)工作通信電路之間的兩個(gè)PIC(使用16f886的硬件通用技術(shù))寫在匯編和連接兩個(gè)MAX232。我想用MAX485代替。我必須改變密碼
    發(fā)表于 10-08 10:12

    MAX232使用的時(shí)候須注意問題

    MAX232使用的時(shí)候須注意的問題 把MAX232232端口和TTL端口搞反發(fā)現(xiàn)還能工作... 只是有的電腦能行,有的電腦不行... 大家一定要注意了...
    發(fā)表于 11-08 10:16 ?1785次閱讀
    <b class='flag-5'>MAX232</b><b class='flag-5'>在</b>使用的時(shí)候須注意問題

    max232 串口電路

    max232 串口電路
    發(fā)表于 01-05 09:05 ?2.1w次閱讀
    <b class='flag-5'>max232</b> 串口電路

    max232芯片介紹

    max232芯片介紹 有一種hin232芯片,與max232芯片比較的話,價(jià)格相對(duì)要便宜很多。 該產(chǎn)品是
    發(fā)表于 09-22 21:47 ?2w次閱讀
    <b class='flag-5'>max232</b>芯片介紹

    202單片機(jī)和PC的串行MAX232接口原理圖

    202單片機(jī)和PC的串行MAX232接口原理圖
    發(fā)表于 04-02 12:18 ?2671次閱讀
    202單片機(jī)和<b class='flag-5'>PC</b>的串行<b class='flag-5'>MAX232</b>接口原理圖

    MAX232數(shù)據(jù)手冊(cè)

    MAX232
    發(fā)表于 03-04 17:51 ?76次下載

    基于MAX232實(shí)現(xiàn)PC機(jī)與CPU通信

    本文介紹了基于MAX232實(shí)現(xiàn)PC機(jī)與CPU通信,介紹了MAX232芯片的應(yīng)用及利用MAX232芯片制作的硬件接口電路,通過串口將它們讀到
    發(fā)表于 12-18 09:45 ?7498次閱讀
    基于<b class='flag-5'>MAX232</b>實(shí)現(xiàn)<b class='flag-5'>PC</b>機(jī)與CPU<b class='flag-5'>通信</b>

    max232芯片介紹_max232接線圖

    本文對(duì)max232芯片進(jìn)行了簡(jiǎn)單介紹,同時(shí)也分享了max232芯片接線圖。
    發(fā)表于 01-05 16:05 ?4w次閱讀
    <b class='flag-5'>max232</b>芯片介紹_<b class='flag-5'>max232</b>接線圖

    MAX232與51單片機(jī)如何連接_MAX232與51單片機(jī)連接圖

    當(dāng)用單片機(jī)和PC機(jī)通過串口進(jìn)行通信,盡管單片機(jī)有串行通信的功能,但單片機(jī)提供的信號(hào)電平和RS232的標(biāo)準(zhǔn)不一樣,因此要通過
    發(fā)表于 01-19 08:51 ?3w次閱讀
    <b class='flag-5'>MAX232</b>與51單片機(jī)如何連接_<b class='flag-5'>MAX232</b>與51單片機(jī)連接圖

    MAX232的引腳說明及工作原理

    MAX232是一種廣為人知的IC,用于微控制器和個(gè)人計(jì)算機(jī)(PC之間建立串行通信。該 IC 用于
    的頭像 發(fā)表于 07-02 14:21 ?9711次閱讀
    <b class='flag-5'>MAX232</b>的引腳說明及工作原理