基于 c8051 和 433MHz 无线模块的遥控器
基于c8051和433MHz射频模块的遥控器。
引言
本文介绍的是非常知名的射频模块TX433和RX433,这些模块(或类似的)几乎在所有电子商店都能找到,一对价格约15美元。
使用Silicon Labs的C8051F321微控制器。
我在网上搜索“射频遥控器”,但没有找到超过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或一个晶体管来反转极性——我选择了后一种方法。
这是结果。
我的目标是使用超过8个按钮,这是常见模块中的按钮数量,例如:Wellmann目录(VM118)。按钮数量受限于制造控制器-加密/解密模块芯片的限制。通过自己编写接收-传输代码可以绕过此限制。为了实现这一目标,我使用了广为人知的Silicon Labs MCU C8051F321,但通过一些小修改,它也可以用于许多其他Silicon Labs芯片。
当使用15厘米天线时,传输-接收距离可达约50米。在我这里,我使用了2400波特率的UART。最高为4800bps。但正如网上许多地方所述,以及从模块测试来看,为了获得更好的噪声/距离比,推荐的连接速度是2400bps。
许多模块在最大波特率下使用,距离很近,约10米左右,即使有天线。我认为这不够。
所以,我首先查看了这里的示例代码: 使用AVR微控制器运行TX433和RX433射频模块。它解释了这些模块的无线数据包结构基础(协议)。
- 发送数据包同步 - 它可以是任何字符
- 发送地址
- 发送控制(验证)字节
- 发送回车字符“13”或“\r”
- 等待几毫秒~10毫秒
- 如果按下按钮:则重复相同的过程
---------------
接收器等待同步字符(我将其设置为“SW”作为缩写,例如,开关),因为接收器在等待时读取大量噪声(我们不希望误触发)。在此之后
- 读取地址位(两位,例如,“00”或“21”)
- 读取控制字节字符
- 将控制字节与地址进行比较,如果匹配,则将地址端口触发为高电平
- 等待约100毫秒,然后将所有端口切换回低电平(端口脉冲切换)
- 如果在超时发生前读取到另一个信号,则将新信号对应的端口设置为高电平,并将旧端口关闭
基本上,在没有按下按钮时,所有继电器都关闭。
该模块的目的是控制垃圾箱搬运车辆的起重机运动。(您在商店购买的模块中找不到任何修改过的代码)。在这些模块中,您不必担心与其他范围内的遥控器发生干扰。
背景
要通过串行端口(COM端口)读取UART脉冲,您必须使用晶体管或MAX232反转信号的极性。如果不反转极性,可以建立连接并使设备工作,但无法通过超级终端读取信号。这意味着没有调试功能。为了调试程序,我使用了一个USB转串口适配器,就像'基于计数器的c8051'中的USB-UART接口一样,并使用Silicon Labs调试适配器读取信号,为此,固件已更新。此外,为了读取,我使用我的USB终端'usbhidio3.exe'。
硬件示意图
要更新固件和调试,请使用Silicon Labs“Toolstick Base Adapter”
使用代码
微控制器的代码在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)
}
}
软件链接
- Silicon Labs IDE: http://www.silabs.com/products/mcu/Pages/SiliconLaboratoriesIDE.aspx
- http://www.silabs.com/Support%20Documents/Software/mcu_ide.zip
- Keil编译器: http://www.keil.com/demo/download.asp。C51评估软件。您可以使用评估软件进行编译,因为代码大小小于4K。