欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機433M無線收發數據程序
[打印本頁]
作者:
ReyAllen
時間:
2023-10-24 22:22
標題:
單片機433M無線收發數據程序
# 433 發送和接收模塊
## 1. 433發送
* 433發送過程:
(1)電平時間設置 **Witty433_Init()**
(2)發送內容和次數設置 **SendInput_433()**
(3)發送 **StartSend_433()**
* 433自定義內容:
芯片類型、管腳操作、延時函數**delay_us_433**、**delay_ms_433**及芯片ID隨芯片/操作系統不同由用戶定義。
* 433的各個電平時間,433的地址碼,433的控制碼,433的發送次數由用戶自定義。
## 2. 433接收
* 433接收過程:
(1)電平時間設置,定時器初始化為PWM輸入模式(注意CLK大小)
(2)定時器pwm輸入捕獲低電平時長,接收傳輸的433數據
(3)在433信號處理線程 **deal433_entry()** 中對接收的數據進行處理
* 433自定義內容:
定時器PWM輸入模式的初始化,各個電平時間初始化,接收校驗次數,數據處理。
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <433_receive.h>
/**
* 遙控器使用說明:使用433遙控器前要進行配對,將遙控器的地址碼獲取到存在flash當中,每次控制時進行校驗。
* 配對時,設備上長按配對按鍵,配對遙控器的LED燈開始閃爍,此時連續按遙控器上的配對按鍵,直到設備上的配對燈滅
* 則表示配對完成
*/
/**
* 程序名稱:接收并處理433信號
* 433接收過程:利用定時器的PWM捕獲,捕獲PWM信號,捕獲完成后在deal433_entry(void *parameter)線程中進行處理
* 433接收自定義內容:高低電平時長,地址碼長度,控制碼長度,控制指令處理相關內容
* 其它:華泰自己的433信號沒有結束碼
*/
TIM_HandleTypeDef htim2;
int add_low_level(unsigned int low_level, unsigned int * re_Data);
static unsigned int RxData = 0xFF; //433接收數據
static int RxOk = 0; //433接收標志位
/* 433電平時長定義(自定義部分)*/
#define start_high 4 //起始碼高電平時長,單位CLK,CLK大小通過定時器分頻系數來改,默認100us
#define start_low 124 //起始碼低電平時長
#define one_high 4 //數字1的高電平時長
#define one_low 4 //數字1的低電平時長
#define zero_high 4 //數字0的高電平時長
#define zero_low 12 //數字0的低電平時長
//#define stop_high 10 //結束碼的高電平時長
//#define stop_low 0 //結束碼的低電平時長
#define time_range 2 //電平時長有效范圍
/* 數據長度定義(自定義部分)*/
/* || 起始碼 || 數據碼(地址碼和控制代碼)(自定義部分)|| */
#define data_full_len 32 //數據碼總長(位)地址碼和控制代碼加起來的長度
#define addr_len 24 //地址碼長度(位)
#define control_len 8 //控制代碼(位)
/* 已配對的433遙控器地址(自定義部分) */
unsigned int remote_addr=0x000001;
/**
* 捕獲回調函數
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t m_pulse;
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
m_pulse = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2); //得到低電平的時間
add_low_level(m_pulse, &RxData); //獲取數據
}
}
/**
* 433輸入信號處理
* @parm1 出入參數,低電平時間
* @parm2 傳出參數,接收成功就是接收成功的數據
* @return (0---沒有一個完整的數據)(1---有一個完整的數據)
*/
int add_low_level(unsigned int low_level, unsigned int * re_Data)
{
static int Start = 0;
static unsigned int Num;
static unsigned int Data = 0; //最新數據
static unsigned int Data1 = 0; //上次數據
static unsigned int Data2 = 0; //上上次數據
if(low_level>start_low-time_range*2) // 確定起始碼
{
Start = 1;
Data = 0;
Num = 0;
}
else if((Start == 1)&&(low_level>zero_low-time_range)&&(low_level<zero_low+time_range)) //數據0
{
Data = Data<<1;
Num++;
}
else if((Start == 1)&&(low_level>one_low-time_range)&&(low_level<one_low+time_range)) //數據1
{
Data = Data<<1;
Data = Data +1;
Num++;
}
else //錯誤數據
{
Start = 0;
}
if((Num == data_full_len)&&(Start == 1)) //收到全部數據
{
Start = 0;
if(((Data == Data1)||(Data == Data2))&&(Data != 0xFF)) //收到兩遍相同的
{
*re_Data = Data; //得到數據
RxOk = 1;
Data = 0xFF;
Data1 = 0xFF;
Data2 = 0xFF;
}
else
{
Data2 = Data1;
Data1 = Data;
}
}
return 0;
}
/**
* 定時器初始化為pwm輸入捕獲(CLK為100us)
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_IC_InitTypeDef sConfigIC = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7200-1; //CLK大小改這里,現在為100us
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 50000;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1;
sSlaveConfig.TriggerFilter = 0;
if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); //打開定時器中斷
/* USER CODE END TIM2_Init 2 */
}
/**
* 433通信處理線程
*/
void deal433_entry(void *parameter)
{
unsigned int receive_addr; //接收到433信號的地址
unsigned int receive_control; //接收到433信號的功能代碼
MX_TIM2_Init();
while(1)
{
if(RxOk == 1) //接收完成
{
RxOk = 0;
/*接收到數據進行數據處理*/
rt_kprintf("receive data is %#X\n",RxData);
receive_addr = RxData >> control_len ; //得到433信號地址
receive_control = RxData & 0xFF ; //得到433信號的功能代碼(根據需要的功能碼位數可能需要修改)
/*對遙控器地址進行校驗*/
if(receive_addr==remote_addr) //校驗通過
{
/********************(自定義部分)***********************/
/*執行相應的功能*/
switch(receive_control)
{
case 0x11:
{
}break ;
}
/*********************************************************/
}
}
rt_thread_mdelay(1);
}
}
復制代碼
#include "433_send.h"
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
//#include "delay.h"
//#include "gpio.h"
/**
* 程序名稱: 433信號發送
* 433發送過程:1.電平時間設置 Witty433_Init(unsigned int set_level_buf[8]) -->
* 2.發送內容和次數設置 SendInput_433(unsigned char *data,unsigned int dataBitNum,unsigned char sendNum) -->
* 3.發送 StartSend_433()
* 433自定義內容: 芯片類型、管腳操作、延時函數delay_us_433、delay_ms_433及芯片ID隨芯片/操作系統不同由用戶定義。
* 433的各個電平時間,433的地址碼,433的控制碼,433的發送次數由用戶自定義。
*/
/* 選擇芯片類型(用戶自定義) */
#define STM32FL151
/* 433發射管腳操作函數(用戶自定義) */
#define Pin_433_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_SET)
#define Pin_433_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_RESET)
/* 433延時函數 */
static void (*delay_us_433)(unsigned int us);
static void (*delay_ms_433)(unsigned short ms);
static void delay_long_us(unsigned int long_us);
/* 433地址碼默認設置*/
static unsigned int GetAddrFromChipID(unsigned char *addr);
static Witty433 witty433;
static unsigned char addr[3];
static unsigned int addr_len = 24;
void delay_long_us(unsigned int long_us)
{
unsigned short ms = long_us/1000;
unsigned int us = long_us%1000;
if(ms)delay_ms_433(ms);
if(us)delay_us_433(us);
}
unsigned int GetAddrFromChipID(unsigned char *addr)
{
#ifdef STM32F10X
addr[0]=*(unsigned char*)(0x1ffff7ed); //芯片ID第5、6、7位作為addr
addr[1]=*(unsigned char*)(0x1ffff7ee);
addr[2]=*(unsigned char*)(0x1ffff7ef);
#elif defined STM32FL151
addr[0]=*(unsigned char*)(0x1ff80055);
addr[1]=*(unsigned char*)(0x1ff80056);
addr[2]=*(unsigned char*)(0x1ff80057);
#elif defined ESP32 //esp32用戶自定義選擇--默認隨機數
addr[0]=srand()%255;
addr[1]=srand()%255;
addr[2]=srand()%255;
#else
addr[0]=srand()%255; //未選擇芯片類型則隨機指定地址
addr[1]=srand()%255;
addr[2]=srand()%255;
#endif
return 3*8; //地址碼位數
}
/**********************************電平時間參數設置初始化(自定義部分)************************************/
void Witty433_Init(unsigned int set_level_buf[8]) //這個set_level_buf[8]數組保存的是各個電平時間,單位是us
{
SetStartLevelTime_433(set_level_buf[0],set_level_buf[1]); //設置起始碼 高 低 電平時間
SetOneLevelTime_433(set_level_buf[2],set_level_buf[3]); //設置bit1 高 低 電平時間
SetZeroLevelTime_433(set_level_buf[4],set_level_buf[5]); //設置bit0 高 低 電平時間
SetEndLevelTime_433(set_level_buf[6],set_level_buf[7]); //設置結束碼 高 低 電平時間
addr_len = GetAddrFromChipID(addr); //默認選擇芯片ID的24Bit作為433地址碼,用戶可自行更改
SetAddr_433(addr,addr_len);
delay_us_433 = delay_us; //設置433微秒延時函數(自定義部分)
delay_ms_433 = delay_ms; //設置433毫秒延時函數(自定義部分)
witty433.delay_433 = delay_long_us;
}
/************************************* 433電平時間參數設置函數 ****************************************/
/* 設置起始碼電平時間 */
void SetStartLevelTime_433(unsigned int time_H,unsigned int time_L)
{
witty433.StartLevelTime_H = time_H;
witty433.StartLevelTime_L = time_L;
}
/* 設置結束碼電平時間 */
void SetEndLevelTime_433(unsigned int time_H,unsigned int time_L)
{
witty433.EndLevelTime_H = time_H;
witty433.EndLevelTime_L = time_L;
}
/* 設置bit0電平時間 */
void SetZeroLevelTime_433(unsigned int time_H,unsigned int time_L)
{
witty433.ZeroLevelTime_H = time_H;
witty433.ZeroLevelTime_L = time_L;
}
/* 設置bit1電平時間 */
void SetOneLevelTime_433(unsigned int time_H,unsigned int time_L)
{
witty433.OneLevelTime_H = time_H;
witty433.OneLevelTime_L = time_L;
}
/******************************* 433發送參數設置函數 ****************************************/
/* 設置地址碼 */
void SetAddr_433(unsigned char *addr,unsigned int addrBitNum)
{
witty433.Addr = addr;
witty433.AddrBitNum = addrBitNum;
}
/* 設置數據域 */
void SetSendData_433(unsigned char *sendData,unsigned int sendDataBitNum)
{
witty433.SendData = sendData;
witty433.SendDataBitNum = sendDataBitNum;
}
/* 設置連續發送次數 */
void SetSendNumber_433(unsigned char sendNumber)
{
witty433.SendNumber = sendNumber;
}
/******************************* 發送初始化函數 ****************************************/
/* 傳入發送參數內容--數據域及發送次數 */
void SendInput_433(unsigned char *data,unsigned int dataBitNum,unsigned char sendNum)
{
SetSendNumber_433(sendNum); //設置sendNum連續發送次數,不同廠商的可能不一樣,需要注意
SetSendData_433(data,dataBitNum); //data數組是具體的控制數據,dataBitNum是數據的位數
}
/*******************************發送一次433信號***************************************/
void StartSend_433() //先傳入發送參數,再發送
{
int i = 0;
for(i = 0; i < witty433.SendNumber; i++)
{
SendStart_433();
SendAddr();
SendData();
}
SendEnd_433();
}
/************************************************************************************/
/* 發送起始碼 */
void SendStart_433()
{
Pin_433_H;
witty433.delay_433(witty433.StartLevelTime_H);
Pin_433_L;
witty433.delay_433(witty433.StartLevelTime_L);
}
/* 發送地址碼 */
void SendAddr()
{
unsigned char byteNum = witty433.AddrBitNum/8;
unsigned char bitNum = witty433.AddrBitNum%8;
unsigned char i = 0;
for(i = 0; i < byteNum; i++)
{
SendBit_433(witty433.Addr[i],8);
}
SendBit_433(witty433.Addr[i],bitNum);
}
/* 發送數據域 */
void SendData()
{
unsigned char byteNum = witty433.SendDataBitNum/8;
unsigned char bitNum = witty433.SendDataBitNum%8;
unsigned char i = 0;
for(i = 0; i < byteNum; i++)
{
SendBit_433(witty433.SendData[i],8);
}
SendBit_433(witty433.SendData[i],bitNum);
}
/* 發送結束碼 */
void SendEnd_433()
{
Pin_433_H;
witty433.delay_433(witty433.EndLevelTime_H);
Pin_433_L;
witty433.delay_433(witty433.EndLevelTime_L);
}
/* 發送bit0 */
void SendBit0_433()
{
Pin_433_H;
witty433.delay_433(witty433.ZeroLevelTime_H);
Pin_433_L;
witty433.delay_433(witty433.ZeroLevelTime_L);
}
/* 發送bit1 */
void SendBit1_433()
{
Pin_433_H;
witty433.delay_433(witty433.OneLevelTime_H);
Pin_433_L;
witty433.delay_433(witty433.OneLevelTime_L);
}
/* 發送16進制數據--1Byte */
void SendHex_433(unsigned char byte)
{
SendBit_433(byte,8);
}
/* 發送bit數據--待發送數據及待發送數據bit數0~8 */
void SendBit_433(unsigned char byte,unsigned char bitNum)
{
unsigned short data = (0x01<<bitNum)>>1; //
unsigned char i = 0;
for(i = 0;i < bitNum;i++)
{
if(byte & data)
{
SendBit1_433();
}
else
{
SendBit0_433();
}
data=data>>1;
}
}
復制代碼
51hei.png
(4.79 KB, 下載次數: 21)
下載附件
2023-10-25 02:55 上傳
程序不完整:
deal433-master.zip
(18.93 KB, 下載次數: 17)
2023-10-24 22:21 上傳
點擊文件名下載附件
作者:
devcang
時間:
2023-10-25 13:20
直接當低速率的串口傳輸
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1