能够进行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, 下载次数: 133)
|