65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 c8051 和 433MHz 无线模块的遥控器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (17投票s)

2010 年 2 月 4 日

CPOL

5分钟阅读

viewsIcon

73291

downloadIcon

4160

基于c8051和433MHz射频模块的遥控器。

引言

本文介绍的是非常知名的射频模块TX433RX433,这些模块(或类似的)几乎在所有电子商店都能找到,一对价格约15美元。

433-modules.JPG

使用Silicon Labs的C8051F321微控制器。

MLP28.jpg

我在网上搜索“射频遥控器”,但没有找到超过8个按钮的。所以我决定自己编程一个。起初,这看起来是一项简单的任务,因为我之前编程过微控制器。

查看我关于Silicon Labs c8051的其他文章

幸运的是,我从阅读其他一些例子中获得了这项任务的灵感

问题在于找到一个适用于射频通信的UART通信协议解决方案。你需要知道如何在C语言中读写UART,这与Keil和Silicon Labs等MCU不同。问题在于找到一个在读取UART信号时不回显的解决方案。要读取UART信号,必须使用低级函数(_getkey)并使用中断来触发控制IO的定时器。

// SFR Paged version of _getkey
char _getkey ()  {
   char c;
   while (!RI0);  //wait UART receive interrupt to trigger
   c = SBUF0;     //read char from UART
   RI0 = 0;       //signal recieve ready 
   return (c);
}

起初,我从超级终端只收到乱码。然后,我决定使用另一个USB转串口线,它起作用了。它具有反向极性(UART信号与RS232信号相比是反向的)。一个解决方案是使用MAX232或一个晶体管来反转极性——我选择了后一种方法。

这是结果。

TX

大图请见: RX1, RX2, TX

我的目标是使用超过8个按钮,这是常见模块中的按钮数量,例如:Wellmann目录(VM118)。按钮数量受限于制造控制器-加密/解密模块芯片的限制。通过自己编写接收-传输代码可以绕过此限制。为了实现这一目标,我使用了广为人知的Silicon Labs MCU C8051F321,但通过一些小修改,它也可以用于许多其他Silicon Labs芯片。

当使用15厘米天线时,传输-接收距离可达约50米。在我这里,我使用了2400波特率的UART。最高为4800bps。但正如网上许多地方所述,以及从模块测试来看,为了获得更好的噪声/距离比,推荐的连接速度是2400bps。

许多模块在最大波特率下使用,距离很近,约10米左右,即使有天线。我认为这不够。

所以,我首先查看了这里的示例代码: 使用AVR微控制器运行TX433和RX433射频模块。它解释了这些模块的无线数据包结构基础(协议)。

  1. 发送数据包同步 - 它可以是任何字符
  2. 发送地址
  3. 发送控制(验证)字节
  4. ---------------

  5. 发送回车字符“13”或“\r”
  6. 等待几毫秒~10毫秒
  7. 如果按下按钮:则重复相同的过程

接收器等待同步字符(我将其设置为“SW”作为缩写,例如,开关),因为接收器在等待时读取大量噪声(我们不希望误触发)。在此之后

  1. 读取地址位(两位,例如,“00”或“21”)
  2. 读取控制字节字符
  3. 将控制字节与地址进行比较,如果匹配,则将地址端口触发为高电平
  4. 等待约100毫秒,然后将所有端口切换回低电平(端口脉冲切换)
  5. 如果在超时发生前读取到另一个信号,则将新信号对应的端口设置为高电平,并将旧端口关闭

基本上,在没有按下按钮时,所有继电器都关闭。

该模块的目的是控制垃圾箱搬运车辆的起重机运动。(您在商店购买的模块中找不到任何修改过的代码)。在这些模块中,您不必担心与其他范围内的遥控器发生干扰。

背景

要通过串行端口(COM端口)读取UART脉冲,您必须使用晶体管或MAX232反转信号的极性。如果不反转极性,可以建立连接并使设备工作,但无法通过超级终端读取信号。这意味着没有调试功能。为了调试程序,我使用了一个USB转串口适配器,就像'基于计数器的c8051'中的USB-UART接口一样,并使用Silicon Labs调试适配器读取信号,为此,固件已更新。此外,为了读取,我使用我的USB终端'usbhidio3.exe'

usbhidio.JPG

硬件示意图

要更新固件和调试,请使用Silicon Labs“Toolstick Base Adapter”

Program_s.JPG

Debug_s.JPG

使用代码

微控制器的代码在Silicon Labs IDE 3.61.00中编写,并使用Keil编译器版本8.17进行编译。如果按下任何按钮,信号(例如“SW01b\r”)将被写入c8051F321的UART,TX433模块会将代码发送到接收器RX433。相应地,接收器解码并点亮该通道的LED(或脉冲继电器——如果它连接到微控制器的匹配端口输出)。

这是基本的Tx主模块

void main (void) 
{

   PCA0MD &= ~0x40;       // WDTE = 0 (clear watchdog timer 
   Timer0_Init ();            // Initialize the Timer0 enable)

   PORT_Init();               // Initialize Port I/O
   SYSCLK_Init ();            // Initialize Oscillator
   UART0_Init();

   EA = 1;                    // Enable global interrupts
//LED =0;
   while (1)
   {
       if(LED==0)
       {
            if(SW00==0){
                bSwitch=1;
                printf ("SW00a%c",13);
            }
            if(SW01==0){
                bSwitch=1;
                printf ("SW01b%c",13);
                }
            if(SW02==0){
                bSwitch=1;
                printf ("SW02c%c",13);
                }
            if(SW03==0) {
                bSwitch=1;
                printf ("SW03d%c",13);
                }
            if(SW06==0){
                bSwitch=1;
                printf ("SW06g%c",13);
                }
            if(SW07==0) {
                bSwitch=1;
                printf ("SW07h%c",13);
                }
            if(SW10==0) {
                bSwitch=1;
                printf ("SW10k%c",13);
                }
            if(SW11==0) {
                bSwitch=1;
                printf ("SW11l%c",13);
                }
            if(SW12==0) {
                bSwitch=1;
                printf ("SW12m%c",13);
                }
            if(SW13==0) {
                bSwitch=1;
                printf ("SW13n%c",13);
                }
            if(SW14==0) {
                bSwitch=1;
                printf ("SW14o%c",13);
                }
            if(SW15==0) {
                bSwitch=1;
                printf ("SW15p%c",13);
                }
            if(SW16==0) {
                bSwitch=1;
                printf ("SW16q%c",13);
                }
            if(SW17==0) {
                bSwitch=1;
                printf ("SW17r%c",13);
                }
            if(SW20==0) {
                bSwitch=1;
                printf ("SW20u%c",13);
                }
            if(SW21==0) {
                bSwitch=1;
                printf ("SW21v%c",13);
                }
            //if(SW22==0) printf (" SW22w\n");
            if(SW23 == 0) {
                bSwitch=1;
                printf ("SW23x%c",13);
                }
        //printf ("\nSW%ca",cOut);
                if(bSwitch == 1){
                    bSwitch= 0;
                    LED = 1;
                }
        }//end of IF LED=0;
    }//end while
}

接收器tst_gets模块的行为如下

void tst_gets (void) {

//char c; // temporary char

int i = 2; // temporary int
unsigned long temp_amplitude;
unsigned char chksum;

LED = 0;
    while( _getkey() != 'S' ); // ignore all characters until
    if(_getkey() == 'W')
    {
        LED = 1;
        temp_amplitude = hex2char();
        chksum = _getkey();
        //printf("NR:%ld: %c - %bd\r", temp_amplitude, chksum,chksum-97);
        if(temp_amplitude == chksum-97)
        {
            //printf ("EQ\r");
            if(temp_amplitude==0){
                P0=1;
                P1=0;    
                P2=0;
            }else{
                if (temp_amplitude < 10) {
                //temp_amplitude = temp_amplitude;
                    P0 = SINE_TABLE[temp_amplitude];
                    P1=0;
                    P2=0;    
                } else if (temp_amplitude < 20) {
                    temp_amplitude -= 10;
                    P1 = SINE_TABLE[temp_amplitude];
                    P0=0;
                    P2=0;
                } else if (temp_amplitude < 30) {
                    temp_amplitude -= 20;
                    P2 = SINE_TABLE[temp_amplitude];
                    P0=0;
                    P1=0;
                }//temp_amplitude < 10    
            }//if(temp_amplitude==0
            counter = 0;
        }//if(temp_amplitude == chksum-97)
    }
}

软件链接

© . All rights reserved.