雷竞技注册
项目

如何使用MAX232在PIC和PC之间进行通信

2015年8月15日经过Jens Christoffersen

这是控制LED,风扇,继电器或电磁阀的一种简单方法和计算机和图片。

这是控制LED,风扇,继电器或电磁阀的一种简单方法和计算机和图片。

推荐水平

中间的

要求

  • 带有Microchip的MPLAB X IDE的计算机,安装了XC8 v1.34编译器。(我使用的是MPLAB X v3.05和XC8 v1.34)
  • PIC16F628A微控制器
  • MAX232驱动程序/接收器
  • 一种编程MCU的方法
  • 来自Eagle的积分列表(见下文)
  • 具有串行端口接口/串行到USB电缆的计算机
  • 如果你想把电路放在一个实验板上,你需要一个实验板和一些跳线

介绍

Maxim集成产品于1987年创建了MAX232 IC。它是一个双驱动器/接收器,通常从/到PC串行端口(最多可以达到25 V)的RX,TX,CTS和RTS信号从/到TTL级别转换(5 V)。使用MAX232 IC,您可以轻松地将PIC微控制器连接到PC。这开辟了很多机会。您可以控制LED,风扇,继电器和螺线管,以命名几个。在这方面,我们将简单地开启,然后关闭LED。这可能听起来很简单,你已经可以建立很多东西!您将需要一个带有串口的计算机或串行到USB转换器。我正在使用USB到RS-232适配器。阅读有关RS-232的更多信息维基百科

关于USART, USART配置和初始化的更深入的阅读,请阅读Microchip的:AN774 - 与PICMICORSUSART的异步通信。对于ASM程序员,此链接为您提供了一些源代码示例。

硬件

我们要做的第一件事是做一个框图。这是我们的小工具的示意图,分成几个块。这是一个很好的帮助,让我们保持在轨道上,它让我们忽略我们想要我们的线路做什么。

框图

我们需要:

  • 介绍了单片机ICSP模块的编程方法
  • 计算机与单片机通信,半双工,计算机块
  • MCU控制LED /输出,MCU块
  • 查看LED/输出模块

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

绘制电路时,您需要组件数据表。可以找到PIC16F628A的数据表这里。当你被卡住时,这将是您的指南。其他IC的数据表在这里:max232cpe.

在该示意图中不考虑硬件握手。为了满足硬件握手,您必须在x2上放一些跳线:

当框图进行后,我们将绘制原理图:

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

块解释

堵塞 描述
力量 该块基于LM7805-稳压器。这是一个线性调节器。使用一些电容器,它调节我们需要稳定的5VDC。
ICSP 这是一个1x5引脚头,用于编程的PIC16F628A。在这个设置中,我使用的是PICkit3。
微控制器 这是我们的PIC16F628A,“大脑”。
输出 这是MAX232 IC,它连接到PIC和计算机。LED也在输出模块下。

partlist.

这是Partlist文件的屏幕截图。该文件由Eaglecad生成。

硬件制作后,它是软件的时候了。

软件

在编写软件时,您必须附近拥有Hardwares数据表。我的设置允许我在一个屏幕上在另一个屏幕上拥有数据表,同时在另一个屏幕上有编程环境。这样,我可以以秒为单位访问数据表。

这是基于MPLAB X IDE和XC8编译器。所有这些都是免费下载的www.microchip.com.。对您的代码发表评论是一种很好的习惯,而您则在写它时。当你写它时,你可能会认为你会记得所有的线路所做的 - 而且你可能在第二天或本周剩余时间。但是从现在起一个月大概了?你还记得吗?使用评论。他们稍后会节省大量工作,其他人会感谢你。以下代码评论得相当好,所以没有必要按行进行线。所以没有进一步的ADO,这里是:

// #include&ltstdlib.h> #include&ltxc.h> #include&ltstdbool.h> // config #pragma config fosc = hs //振荡器选择位(Hs振荡器:高速水晶/RA6 / OSC2 / CLKOUT和RA7 / OSC1 / CLKIN上的谐振器)#Pragma Config WDTE = OFF //看门狗定时器使能位(WDT禁用)#pragma config pwrte =关闭//上电定时器使能位(PWRT禁用)#pragmaConfig MCLRE = ON // RA5 / MCLR / VPP引脚功能选择位(RA5 / MCLR / VPP引脚功能为MCLR)#PRAGMA CONFIG BOREN = ON //棕色输出检测启用位(BOD启用)#pragma配置lvp =上//低压编程使能位(RB4 / PGM引脚具有PGM功能,启用低压编程)#Pragma Config CPD = OFF // Data EE存储器码保护位(数据存储器代码保护OFF)#Pragma Config CP = OFF//闪存程序内存代码保护位(代码保护OFF)//定义#define _Xtal_freq 16000000 //告诉编译器我们正在使用16MHz //全局变量无符号INT选择;// variable以保存用户选择bool getchar_active = false;//布尔变量//函数原型Void中断TC_INT(void);void UART_INIT(无效);unsigned char getch();unsigned char getche(空白); 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); }

main_max232.c.zip.

如果源代码没有错误或警告编译,则可以对MCU进行编程,并将其挂钩到您的计算机上。打开您喜欢的串行通信程序,并为端口设置使用9600-8-N-1。向电路施加电源,您应该在屏幕上看到一个小菜单。它适用于Windows和Linux。在最后看短视频。

结论

我们使用了PIC16F628A和MAX232来使用PC控制LED。我们没有使用大量的硬件,我们没有很多代码。我们没有费令让我们自己的图书馆写入UART-PORT,其中:我们使用了标准PRINTF-函数。我们的代码使用了9%的PIC的数据存储器和21%的程序内存。您可以从本页底部下载源代码。

图片和视频

竞争电路

单片机的部分。

max232部分。

为自己提供这个项目!得到bom。

6个评论
  • 一世
    isabelahtam 2015年10月22日

    谢谢!^ - ^

    喜欢的。 回复
  • S.
    sheina 2016年1月13日

    甜的…。谢谢你的帖子。这就是我一直在寻找的东西。我有很多max232,但我只有pic16f877a我需要在代码上编辑什么。谢谢
    你也可以给我发电子邮件。(必须启用JavaScript以查看此电子邮件地址)

    我很难帮助有人帮助我的项目:(

    喜欢的。 回复
    • j
      Jens Christoffersen 2016年1月16日
      嗨,你为什么不通过代码和数据表,然后比较两个数据表?raybet开户然后你会发现你需要改变的东西。或在论坛上发布一个问题......
      喜欢的。 回复