能夠進行315m無線信號的學習與發送,需要配合相應的硬件
單片機源程序如下:
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "exti.h"
- #include "timer.h"
- #include "IR_SendData.h"
- /************************************************
- 接收315無線模塊數據
-
- 1、輸入腳PA15
- 2、PA15下降沿觸發外部中斷
- 3、采用定時器TIM3計算脈寬
- ************************************************/
- extern u8 USART_RX_BUF[USART_REC_LEN];
- extern u8 WiRecBuff[5];
- int main(void)
- {
- unsigned char i=0,t=0,len=0;
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為115200
- EXTIX_Init(); //外部中斷初始化
- TIM3_Int_Init(49999,71);//10Khz的計數頻率,計數到5000為500ms
- TIM7_Int_Init(59999,71);
- send_init();
- KEY_Init();
- while(1)
- {
- //按鍵315發送數據
- if(KEY0==0)
- {
- EXTI->IMR &= ~(EXTI_Line15); //315無線關閉接收中斷
- EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中斷標志位
- delay_ms(10); //按鍵消抖
- senddata(); //發送315無線信號
- for(i=0;i<3;i++)
- {
- printf("\r\n發送數據:%x \r\n\r\n",WiRecBuff[i]);
- }
- }
- else
- {
- EXTI->IMR |= EXTI_Line15; //開啟315無線接手卸險
- EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中斷標志位
- }
- /** 315無線發送數據 **/
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度
- if((USART_RX_BUF[0]!=0x30)) //判斷首位不等于0x30,以及接收數據完成
- {
- for(i=0;i<3;i++)
- {
- WiRecBuff[i]=USART_RX_BUF[i];
- delay_ms(10); //按鍵消抖
- }
- //
- EXTI->IMR &= ~(EXTI_Line15); //315無線關閉接收中斷
- EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中斷標志位
- senddata(); //發送315無線信號
- }
- else
- {
- EXTI->IMR |= EXTI_Line15; //開啟315無線接手卸險
- EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中斷標志位
- }
-
- USART_RX_STA=0;
- memset(USART_RX_BUF, '\0', sizeof(USART_RX_BUF)); //清除串口接收數組
- }
-
-
-
- }
- }
復制代碼
IR_SendData.c
- /*******************************************************************
- 使用定時器發送315無線數據
- *******************************************************************/
- #include "IR_SendData.h"
- #include "delay.h"
- #include "led.h"
- #include "usart.h"
- /********************************************************************
- 1、315發送: 24位 數據
- 2、A: 0x0c
- 3、B:0xc0
- 4、C:0x03
- 5、D:0x30
-
- *********************************************************************/
- u8 WiRecBuff[5];
- extern unsigned char send_bit; //定時器溢出中斷標志位
- unsigned char REM_Table[14]={1,0,1,0,1,0,1,0,1,0,1,0,1,0};//發送高低電緩沖區
- /********************************************************************
- 1、 14ms :0x36af 14000-1
- 2、 1.2ms :0x4af 1200-1
- 3、 600us :0X257 600-1
- *********************************************************************/
- unsigned int Time_Table[14]={0x36af,0x36af,0x4af,0X257,0x4af};// 14ms 1`2ms 600us
- extern u8 USART_RX_BUF[USART_REC_LEN];
- /*串口接收數據 轉為發送*/
- //void RecBuff_change(void)
- //{
- // unsigned char i=0;
- // if(USART_RX_BUF[0]!=0x30)
- // {
- // for(i=0;i<3;i++)
- // {
- // WiRecBuff[i]=USART_RX_BUF[i];
- // delay_us(100);
- // }
- // }
- //}
- /********************************************************************
- 315無線發送IO口初始化
- *********************************************************************/
- void send_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口時鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PC.0 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOC, &GPIO_InitStructure); //根據設定參數初始化GPIOC.0
- GPIO_SetBits(GPIOC,GPIO_Pin_0); //PC.0 輸出高
- }
- void send_foot(void) //發送14ms的引導嗎
- {
- unsigned char i;
- for(i=0;i<2;i++)
- {
- Send=REM_Table[i]; //發送高低電
- send_bit=0; //定時器溢出中斷標志位清零
- TIM7->CNT = 0; //計數器數值清零
- TIM7->ARR = Time_Table[i]; //設置定時器計數值
- TIM7->CR1 |= 0x01; //開啟TIM3定時器
- while(send_bit==0); //等待溢出中斷
- //TIM3->CR1 &= ~(0x01); //關閉定時器3
- }
- }
- void bit_1(void) //高電平1.2ms+低電平500us表示:邏輯1
- {
- unsigned char i;
- for(i=0;i<2;i++)
- {
- Send=REM_Table[i];
- send_bit=0;
- TIM7->CNT = 0;
- TIM7->ARR = Time_Table[i+2];
- TIM7->CR1 |= 0x01; //開啟TIM3定時器
- while(send_bit==0);
- // while(TIM_GetITStatus(TIM3, TIM_IT_Update) == RESET);
- }
- }
- void bit_0(void) //高電平500us+低電平1.2ms 表示:邏輯0
- {
- unsigned char i;
- for(i=0;i<2;i++)
- {
- Send=REM_Table[i];
- send_bit=0;
- TIM7->CNT = 0;
- TIM7->ARR = Time_Table[i+3];
- TIM7->CR1 |= 0x01; //開啟TIM3定時器
- while(send_bit==0);
- // while(TIM_GetITStatus(TIM3, TIM_IT_Update) == RESET);
-
- }
- }
- void senddata(void) //發送引導碼+24數據
- {
- u8 i,j;
- // RecBuff_change();
- send_foot(); //發送引導碼
- for(i=0;i<25;i++)
- {
- // for(j=0;j<8;j++)
- {
- if(((WiRecBuff[i/8]<<i%8)&0x80)) //從高位到低位,判斷邏輯0還是邏輯1
- {
- bit_1(); //發送邏輯1脈沖
- }
- else
- {
- bit_0(); //發送邏輯0脈沖
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
315學習 315發送.zip
(330.6 KB, 下載次數: 135)
2018-10-20 09:11 上傳
點擊文件名下載附件
|