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

本文介绍了一种基于PIC24F08KL301单片机的RS232信号发生器制作过程,该发生器通过交替发送'a'、'b'字符来验证信号传输的正确性。

项目涉及到用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 <xc.h>
#include <libpic30.h>//for delay function
#include <uart.h>

#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......的字符,说明你的电路正常工作了!而且你的上下位机也在正常通讯。


最后附一张我电路的照片:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值