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