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

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


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


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用\[2\]中的内容,51单片机可以通过红外遥控方式来输入信号发射器的信号。红外遥控方式是以红外线作为载体来传送控制信息的,通过红外发射装置(红外发光二极管)将信号转换为红外信号并发射出去。在51单片机中,可以使用数字信号编码和二次调制方式来实现红外遥控系统。这种方式不仅可以实现多路信息的控制,增加遥控功能,提高信号传输的抗干扰性,还可以减少误动作和功率消耗。因此,通过编写相应的程序,可以将输入信号转换为红外信号并通过红外发射装置发送出去。 #### 引用[.reference_title] - *1* [【011】基于51单片机的低频信号发生proteus仿真与实物设计](https://blog.csdn.net/JunDunJunDun/article/details/125413651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [红外测距模块 51单片机_基于51单片机的红外发射和接收程序。](https://blog.csdn.net/weixin_39585886/article/details/110218059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值