项目涉及到用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......的字符,说明你的电路正常工作了!而且你的上下位机也在正常通讯。
最后附一张我电路的照片: