利用单片机自制简单的RS232信号发射装置

2019-04-15 12:18发布

项目涉及到用PC机读取RS232信号。以前一直没有对这部分知识系统的准备。今天做了一个RS232信号发生器,交替发出"a"、“b”字符。以这个装置作为基准,来检验其他设备是否正确的接收RS232信号。 准备如下材料: 单片机 PIC24F08KL301 TTL到EIA的转换芯片 MAX232IN,Ti出品 运放芯片LM358 3节1.5V电池,串联输出4.5V 供电芯片 LM1086,将4.5V电池电压转换成3.3V 5个1uF电容 1个100nF电容 1个10千欧电阻 3个LED
另备电池盒、洞洞板等配件。 电路图如下:

在实际调试中,我发现MAX232的针脚容易反烧单片机的Tx口。所以在两者之间加了LM358作为跟随器。另外在跟随器之前还放了两个LED,作为“第二道保障”。一旦MAX232的针脚电压过高,比如说8V,上方的LED就会导通。LED的导通电压约0.7伏,而且上方LED的阴极接在3.3V上,所以MAX232的针脚电压就被拉低到3.3+0.7 = 4V。同理,下方的LED在MAX232电压过低时起作用。比如-8V时,下方LED导通,因为下方LED的阳极接地,所以MAX232的针脚电压就被拉到0-0,7 = -0,7V。

单片机的烧录代码如下: #define FCY 4000000ULL //4000000*2 = 8MHz #include "p24F08KL301.h" #include #include //for delay function #include #pragma config MCLRE = OFF #pragma config FNOSC = FRC//8MHz void uart_setup(void) { TRISAbits.TRISA3 = 0; TRISBbits.TRISB2 = 1;//Rx TRISBbits.TRISB7 = 0;//Tx ANSBbits.ANSB2 = 0;//Rx U1BRG = 25; //Baud rate set to 9600 //IPC2bits.U1RXIP = 4; //interrupt priority level for receive //IPC3bits.U1TXIP = 4; //interrupt ptiority level for transmit U1STA = 0; U1MODE = 0; //8-bit data, no parity, 1 stop bit U1MODEbits.UARTEN = 1; //enable the module U1STAbits.UTXISEL0 = 0; U1STAbits.UTXISEL1 = 1; //interrupt generated transmit is complete IFS0bits.U1RXIF = 0; //clear receive interrupt flag U1STAbits.UTXEN = 1; //enable transmission IEC0bits.U1RXIE = 0; //UART receiver interrupt enabled IEC0bits.U1TXIE = 0; //UART transmitter interrupt enabled } void uart1putchar(char ch) { while(U1STAbits.UTXBF); //transmit only if TX buffer is empty; better use U1TXIF U1TXREG = ch; } char uart1getchar() { char temp; while(IFS0bits.U1RXIF == 0); //wait for the buffer to fill one character temp = U1RXREG; //copy char IFS0bits.U1RXIF = 0; //reset interrupt return temp; //return received char } int main(void) { uart_setup(); while(1){ LATAbits.LATA3 = 1; __delay_ms(500); uart1putchar(97); LATAbits.LATA3 = 0; __delay_ms(500); uart1putchar(98); } }

单片机每隔0.5秒发送一个ASCII字符,同时针脚RA3电平变化一次。与之相连的LED因此闪烁不停。将一个公头的RS232口与电路做如下连接:
给电路上电,然后将公头和上位机的RS232母口相连(具体的上下位机联系方式,以及Python的serial库如何安装,参考我前面的博客《利用python发出rs232信号》)。 上电后,你应该会看到电路的LED灯闪烁。如果没有,那么你的电路很可能有问题。 启动上位机的Python环境,输入如下命令:
假如你收到了交替的abab......的字符,说明你的电路正常工作了!而且你的上下位机也在正常通讯。
最后附一张我电路的照片: