在本文中,将探讨如何利用Silabs C8051F321微控制器和常见的RF模块TX433与RX433来制作一个具有超过8个按钮的无线遥控器。这种遥控器在电子商店中随处可见,且价格相对便宜。目标是实现一种能够控制垃圾车移动垃圾箱的遥控器,这需要自己编写接收和发送代码来扩展按钮数量。
在电子商店中,经常可以看到TX433和RX433这样的RF模块,它们价格亲民且易于获取。然而,市面上的遥控器通常只有8个按钮,这限制了其应用范围。为了突破这一限制,决定自己编程制作一个具有更多按钮的遥控器。
在实现无线遥控器的过程中,面临的第一个挑战是如何在C语言中读写UART,以实现无线通信。不同于Keil和Silabs等微控制器的常规方法,需要找到一种不会产生回声的方法来读取UART信号。这需要使用低级函数_getkey()和中断来控制IO。
在尝试过程中,最初从hyperterminal接收到的都是无用信号。更换了USB到串口线后,问题得到了解决。这是因为新的线缆具有反向极性,UART信号与RS232信号相反。解决这个问题的一种方法是使用MAX232或晶体管来反转极性,选择了后者。
在硬件设计方面,使用了Silabs的C8051F321微控制器。通过适当的修改,这种控制器也可以用于许多其他Silabs芯片。目标是实现一个传输-接收距离可达50米左右的遥控器,这需要使用15厘米的天线。在实验中,使用了2400波特率的UART,这是推荐的连接速度,以获得更好的噪声/距离比。
遥控器的工作原理基于发送和接收信号。发送端首先发送同步信号,然后是地址和控制字节。接收端在等待同步字符后,读取地址位和控制字节,如果它们匹配,就会触发相应的端口。如果没有按钮被按下,所有继电器都会关闭。
遥控器的软件是在Silabs IDE 3.61.00中编写的,并使用Keil编译器ver. 8.17进行编译。当按下按钮时,c8051F321的UART会写入类似'SW01b\r'的信号,TX433模块会发送代码到接收器RX433。接收器解码后,会点亮相应通道的LED(或者如果是连接到微控制器的匹配端口输出,则脉冲继电器)。
以下是发送端主模块的代码示例:
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
while(1) {
if(LED == 0) {
if(SW00 == 0) {
bSwitch = 1;
printf("SW00a%c", 13);
}
if(SW01 == 0) {
bSwitch = 1;
printf("SW01b%c", 13);
}
// ... 更多按钮的代码 ...
if(bSwitch == 1) {
bSwitch = 0;
LED = 1;
}
}
}
}
接收端的tst_gets模块的行为如下:
void tst_gets(void) {
int i = 2; // temporary int
unsigned long temp_amplitude;
unsigned char chksum;
LED = 0;
while(_getkey() != 'S');
if(_getkey() == 'W') {
LED = 1;
temp_amplitude = hex2char();
chksum = _getkey();
if(temp_amplitude == chksum-97) {
if(temp_amplitude == 0) {
P0 = 1;
P1 = 0;
P2 = 0;
} else {
// ... 更多逻辑 ...
}
counter = 0;
}
}
}