使用MAX232在PIC和PC之间进行通信的过程

描述

 这是使用计算机和 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 程序员,此链接为您提供了一些源代码示例。

  硬件

  我们要做的第一件事是制作框图。这是我们的小工具的图表,分成块。这是一个很好的帮助,可以让我们保持在正轨上,它让我们可以忽略我们想要我们的电路做什么。

  led

  我们需要:

  一种对我们的 MCU(ICSP 块)进行编程的方法

  电脑与单片机通信,半双工,电脑块

  MCU 控制 LED/输出,MCU 块

  查看 LED/ 输出块

  LED/输出块可以是 LED、风扇、继电器或螺线管,或您想要控制的任何其他东西。您需要解决的一个重要问题是确保您的 MCU 具有 USART 端口。我们使用的是 PIC16F628A,它有一个端口。IC 支路 7 和 8 分别是 PORTBbits.RB1 和 PORTBbits.RB2。如果您使用不同的 MCU,则必须考虑到这一点。

  绘制电路时,您将需要组件数据表。PIC16F628A 的数据表可在此处找到。当您遇到困难时,这将是您的指南。另一个 IC 的数据表在这里: MAX232CPE。

  此原理图中未考虑硬件握手。为了满足硬件握手,您必须在 X2 上放置一些跳线:

  led

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

  led

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

  led

  零件清单

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

  led

  硬件做好之后,就是软件的时候了。

  软件

  编写软件时,您必须在附近有硬件数据表。我的设置允许我在一个屏幕上显示数据表,而在另一个屏幕上显示编程环境。这样,我可以在几秒钟内访问数据表。

  这是基于 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

  竞争电路

  led

  微控制器部分。

  led

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分