标签:
一、红外线工作原理
1、红外线系统的组成
红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。
2、红外发射管
红外遥控发射装置,也就是通常我们说的红外遥控器是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管。它实际上是一只特殊的发光二极管;由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它便发出的是红外线而不是可见光。目前大量的使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通φ5发光二极管相同。
3、红外遥控器发射
通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。
二进制脉冲码的形式有多种,其中最为常用的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。如果要开发红外接收设备,一定要知道红外遥控器的编码方式和载波频率,我们才可以选取一体化红外接收头和制定解码方案。
4、红外线发射原理图
5、红外线接收
红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处理器。近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VOUT)。在使用时注意成品红外接收头的载波频率,另外在遥控编码芯片输出的波形与接收头端收到的波形。
6、数据格式
数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。
7、位定义
用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM
二、红外线接收
1、数据格式
数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。
2、位定义
用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM
3、例程代码
1 /************************************************************************************************************************************* 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数文件 5 * 6 ***************************************************************************************************************************************/ 7 8 #include "pbdata.h"//调用自定义公共函数库 9 10 11 /********************************************************************************* 12 * 13 * 初始化操作 14 * 15 *********************************************************************************/ 16 void RCC_Configuration(void);//系统时钟初始化函数声明 17 void GPIO_Configuration(void);//GPIO初始化函数声明 18 void NVIC_Configuration(void);//中断优先级配置函数声明 19 void USART_Configuration(void);//串口配置函数声明 20 21 void EXTI_Configuration_HW(void);//红外配置函数声明 22 23 24 25 /******************************************************************************** 26 * 27 * 函数名称:main(void) 28 * 函数功能:主函数 29 * 函数说明:不能用void定义主函数 30 * 31 ********************************************************************************/ 32 int main(void)//void不能void定义主函数 33 { 34 35 RCC_Configuration(); //系统时钟初始化 36 37 GPIO_Configuration();//端口初始化 38 39 USART_Configuration();//串口配置 40 41 NVIC_Configuration();//中断优先级配置 42 43 EXTI_Configuration_HW();//红外配置 44 45 46 while(1) 47 { 48 if(hw_jsbz==1)//收到红外数据 49 { 50 hw_jsbz=0;//标志置0 51 printf("hw_receive=%0.8X\r\n",hw_jsm); 52 53 hw_jsm=0;//清空 54 } 55 56 delay_ms(1000);//延时1s 57 58 } 59 60 } 61 62 63 64 65 /******************************************************************************** 66 * 67 * 函数名称:RCC_Configuration(void) 68 * 函数功能:系统时钟高初始化函数 69 * 70 ********************************************************************************/ 71 void RCC_Configuration(void)//系统时钟高初始化函数 72 { 73 74 SystemInit();//系统初始化 75 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能 76 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//红外对应GPIO时钟使能 77 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能 78 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用 79 80 81 } 82 83 84 85 /******************************************************************************* 86 * 87 * 函数名称:GPIO_Configuration(void) 88 * 函数功能:GPIO初始化函数 89 * 90 ********************************************************************************/ 91 92 void GPIO_Configuration(void)//GPIO初始化函数 93 { 94 95 96 /*串口引脚配置*/ 97 GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 98 99 /*输出引脚配置*/ 100 /*结构体变量赋值*/ 101 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;////引脚配置TX 102 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率 103 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出 104 /*对应的GPIO初始化*/ 105 GPIO_Init(GPIOA,&GPIO_InitStructure); 106 107 108 /*输入引脚配置*/ 109 /*结构体变量赋值*/ 110 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX 111 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入 112 /*对应的GPIO初始化*/ 113 GPIO_Init(GPIOA,&GPIO_InitStructure); 114 115 116 117 /*红外引脚配置*/ 118 /*结构体变量赋值*/ 119 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;////红外接收引脚配置 120 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//发送要配置成上拉输入模式 121 /*对应的GPIO初始化*/ 122 GPIO_Init(GPIOA,&GPIO_InitStructure); 123 124 } 125 126 127 128 129 /**************************************************************************** 130 * 131 * 函数名称:NVIC_Configuration(void) 132 * 函数功能:配置中断优先级 133 * 134 ****************************************************************************/ 135 136 void NVIC_Configuration(void) 137 { 138 NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量 139 140 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组 141 142 143 144 /*串口中断优先级*/ 145 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 146 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级 147 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级 148 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 149 150 151 152 /*红外外部中断优先级*/ 153 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断 154 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级 155 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级 156 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 157 158 NVIC_Init(&NVIC_InitStructure);//初始化 159 160 161 162 163 } 164 165 166 /********************************************************************************* 167 * 168 * 函数名称: 169 * 函数功能:串口配置函数 170 * 171 *********************************************************************************/ 172 void USART_Configuration(void) 173 { 174 /*定义串口配置结构体变量*/ 175 USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量 176 177 178 /*结构体变量赋值*/ 179 USART_InitStructure.USART_BaudRate = 9600;//波特率9600 180 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位 181 USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1 182 USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验 183 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止 184 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能 185 186 187 /*发送串口配置初始化*/ 188 USART_Init(USART1, &USART_InitStructure); 189 190 191 /*打开串口接收中断*/ 192 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断 193 194 195 /*打开串口*/ 196 USART_Cmd(USART1,ENABLE);//串口使能,打开 197 198 /*清空中断标志位*/ 199 USART_ClearFlag(USART1,USART_FLAG_TC); 200 } 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
1 #include "pbdata.h" 2 3 4 5 6 /********************************************** 7 * 8 * 函数名称:EXTI_Configuration(void) 9 * 函数功能:红外触发外部中断配置 10 * 11 **********************************************/ 12 13 void EXTI_Configuration_HW(void) 14 { 15 EXTI_InitTypeDef EXTI_InitStructure;//定义一个中断配置的结构体变量 16 17 EXTI_ClearITPendingBit(EXTI_Line3);//使用前清除中断 18 19 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);//选择GPIO管脚作为外部中断线路 20 21 22 EXTI_InitStructure.EXTI_Line = EXTI_Line3; 23 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式 24 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发方式,下降沿 25 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能 26 27 28 EXTI_Init(&EXTI_InitStructure);//初始化进行配置 29 } 30 31 32 33 34 35 36 37 38 39 40 u8 HW_jssj(void) 41 { 42 u8 t=0; 43 while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==1)//说明是高电平 44 { 45 t++; 46 delay_us(20); 47 48 if(t>=250)//高电平最长450ms,250*20=5ms,超时溢出 49 return t; 50 51 } 52 return t; 53 }
1 #ifndef _HW_JS_H 2 #define _HW_JS_H 3 4 #include "pbdata.h" 5 6 7 u8 HW_jssj(void); 8 9 10 void EXTI_Configuration_HW(void); 11 12 #endif
1 /**************************************************************************************************************** 2 * 3 * 文件名称:pbdata.c 4 * 文件功能:自定义函数或者全局变量的初始化 5 * 6 ****************************************************************************************************************/ 7 8 /*头文件声明*/ 9 #include "pbdata.h" 10 11 12 13 14 /******************************************************************************************** 15 * 16 * 自定义全局变量 17 * 18 ********************************************************************************************/ 19 u8 dt=0; 20 21 22 u32 hw_jsm=0; 23 u8 hw_jsbz=0; 24 25 26 27 28 /****************************************************************************************** 29 * 30 * 自定义函数 31 * 32 ******************************************************************************************/ 33 34 35 36 /************************************************** 37 * 38 * 函数名称:delay_us(u32 nus) 39 * 函数功能:微秒延时函数 40 * 输入参数:输入值为延时us 41 * 42 ***************************************************/ 43 void delay_us(u32 nus) 44 { 45 u32 temp; 46 SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次 47 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 48 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 49 50 do 51 { 52 temp=SysTick->CTRL;//标志位,等到一直减到0 53 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 54 55 SysTick->CTRL=0x00; //关闭计数器 56 SysTick->VAL =0X00; //清空计数器 57 } 58 59 60 61 62 63 64 65 /*************************************************** 66 * 67 * 函数名称:delay_ms(u16 nms) 68 * 函数功能:毫秒级延时 69 * 输入参数:输入值位延时ms 70 * 71 ****************************************************/ 72 void delay_ms(u16 nms) 73 { 74 u32 temp; 75 SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次 76 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 77 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 78 79 do 80 { 81 temp=SysTick->CTRL;//标志位,等到一直减到0 82 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 83 84 SysTick->CTRL=0x00; //关闭计数器 85 SysTick->VAL =0X00; //清空计数器 86 } 87 88 89 90 /**************************************************** 91 * 92 * 重定义printf函数部分 93 * 94 ****************************************************/ 95 int fputc(int ch,FILE *F) 96 { 97 98 USART_SendData(USART1,(u8)ch); 99 100 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位 101 102 return ch; 103 }
1 /*pbdata.h*/ 2 /*************************************************************************************************** 3 * 4 * 文件名称:pbdata.h 5 * 文件功能:自定义的函数和全局变量的声明头文件 6 * 7 ***************************************************************************************************/ 8 9 #ifndef _pbdata_H 10 #define _pbdata_H 11 12 13 14 15 16 /******************************************************************** 17 * 18 * 调用的头文件放在这里 19 * 20 ********************************************************************/ 21 #include "stm32f10x.h" 22 23 24 #include "stm32f10x_rcc.h" 25 #include "stm32f10x_gpio.h" 26 #include "misc.h" 27 #include "stm32f10x_adc.h" 28 #include "stm32f10x_bkp.h" 29 #include "stm32f10x_can.h" 30 #include "stm32f10x_cec.h" 31 #include "stm32f10x_dac.h" 32 #include "stm32f10x_dbgmcu.h" 33 #include "stm32f10x_dma.h" 34 #include "stm32f10x_exti.h" 35 #include "stm32f10x_flash.h" 36 #include "stm32f10x_fsmc.h" 37 #include "stm32f10x_i2c.h" 38 #include "stm32f10x_iwdg.h" 39 #include "stm32f10x_pwr.h" 40 #include "stm32f10x_rtc.h" 41 #include "stm32f10x_sdio.h" 42 #include "stm32f10x_spi.h" 43 #include "stm32f10x_tim.h" 44 #include "stm32f10x_usart.h" 45 #include "stm32f10x_wwdg.h" 46 47 48 #include "stdio.h" 49 50 51 #include "hw_fs.h" 52 53 /******************************************************************** 54 * 55 * 自定义全局变量声明 56 * 57 ********************************************************************/ 58 extern u8 dt; 59 60 extern u8 flag; 61 extern u16 js_count; 62 63 64 65 /******************************************************************** 66 * 67 * 自定义全函数声明 68 * 69 ********************************************************************/ 70 void delay(u32 nCount); 71 void delay_us(u32 nus); 72 void delay_ms(u16 nms); 73 int fputc(int ch,FILE *F); 74 75 76 77 #endif
1 /** 2 ****************************************************************************** 3 * @file GPIO/IOToggle/stm32f10x_it.c 4 * @author MCD Application Team 5 * @version V3.0.0 6 * @date 04/06/2009 7 * @brief Main Interrupt Service Routines. 8 * This file provides template for all exceptions handler and 9 * peripherals interrupt service routine. 10 ****************************************************************************** 11 * @copy 12 * 13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 14 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 15 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 16 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 17 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 18 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 19 * 20 * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2> 21 */ 22 23 /* Includes ------------------------------------------------------------------*/ 24 #include "stm32f10x_it.h" 25 #include "stm32f10x_exti.h" 26 #include "stm32f10x_rcc.h" 27 #include "stm32f10x_tim.h" 28 #include "misc.h" 29 #include "pbdata.h" 30 31 void NMI_Handler(void) 32 { 33 } 34 35 36 37 /** 38 * @brief This function handles Hard Fault exception. 39 * @param None 40 * @retval : None 41 */ 42 void HardFault_Handler(void) 43 { 44 /* Go to infinite loop when Hard Fault exception occurs */ 45 while (1) 46 { 47 } 48 } 49 50 /** 51 * @brief This function handles Memory Manage exception. 52 * @param None 53 * @retval : None 54 */ 55 void MemManage_Handler(void) 56 { 57 /* Go to infinite loop when Memory Manage exception occurs */ 58 while (1) 59 { 60 } 61 } 62 63 /** 64 * @brief This function handles Bus Fault exception. 65 * @param None 66 * @retval : None 67 */ 68 void BusFault_Handler(void) 69 { 70 /* Go to infinite loop when Bus Fault exception occurs */ 71 while (1) 72 { 73 } 74 } 75 76 /** 77 * @brief This function handles Usage Fault exception. 78 * @param None 79 * @retval : None 80 */ 81 void UsageFault_Handler(void) 82 { 83 /* Go to infinite loop when Usage Fault exception occurs */ 84 while (1) 85 { 86 } 87 } 88 89 /** 90 * @brief This function handles SVCall exception. 91 * @param None 92 * @retval : None 93 */ 94 void SVC_Handler(void) 95 { 96 } 97 98 /** 99 * @brief This function handles Debug Monitor exception. 100 * @param None 101 * @retval : None 102 */ 103 void DebugMon_Handler(void) 104 { 105 } 106 107 /** 108 * @brief This function handles PendSV_Handler exception. 109 * @param None 110 * @retval : None 111 */ 112 void PendSV_Handler(void) 113 { 114 } 115 116 /** 117 * @brief This function handles SysTick Handler. 118 * @param None 119 * @retval : None 120 */ 121 void SysTick_Handler(void) 122 { 123 } 124 125 126 127 /**************************************************************************** 128 * 129 * 函数名称:void TIM3_IRQHandler(void) 130 * 外部中断处理函数 131 * 132 ****************************************************************************/ 133 134 135 void TIM3_IRQHandler(void) 136 { 137 138 } 139 140 141 142 143 /**************************************************************************** 144 * 145 * 函数名称:void EXTI9_5_IRQHandler(void) 146 * 外部中断处理函数 147 * 148 ****************************************************************************/ 149 150 void EXTI9_5_IRQHandler(void) 151 { 152 if(EXTI_GetITStatus(EXTI_Line5)==SET) //判断是否产生了中断 153 { 154 EXTI_ClearITPendingBit(EXTI_Line5);//中断清除 155 156 delay_ms(10);//延时消抖 157 158 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖 159 { 160 if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮 161 { 162 GPIO_SetBits(GPIOB,GPIO_Pin_5); //则熄灭 163 } 164 else 165 { 166 GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮 167 } 168 } 169 } 170 } 171 172 173 174 175 176 177 178 179 180 /**************************************************************************** 181 * ? ?úvoid EXTI1_IRQHandler(void) 182 * ? ?úEXTI2???m?? 183 * ????ú? 184 * ????ú? 185 * ? ?ú 186 * ????ú? 187 ****************************************************************************/ 188 void EXTI1_IRQHandler(void) 189 { 190 191 } 192 193 /**************************************************************************** 194 * ? ?úvoid EXTI2_IRQHandler(void) 195 * ? ?úEXTI2???m?? 196 * ????ú? 197 * ????ú? 198 * ? ?ú 199 * ????ú? 200 ****************************************************************************/ 201 void EXTI2_IRQHandler(void) 202 { 203 204 } 205 206 /**************************************************************************** 207 * 208 * 函数名称:void EXTI3_IRQHandler(void) 209 * 函数功能:外部中断XTI3中断处理函数 210 * 211 ****************************************************************************/ 212 void EXTI3_IRQHandler(void) 213 { 214 u8 Tim=0,ok=0,Num=0,Data=0; 215 216 while(1) 217 { 218 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==1) 219 { 220 Tim=HW_jssj();//获得高电平时间 221 222 if(Tim>=250)//超时,非法信号 223 break; 224 225 if(Tim>=200 && Tim<250)//4ms-5ms之间,起始码 226 { 227 ok=1;//收到起始新号 228 } 229 230 else if(Tim>=60 && Tim<90)//1.2ms-1.8ms之间,数据1 231 { 232 Data=1;//收到数据1 233 } 234 235 else if(Tim>=10 && Tim<50)//0.2ms-1.0ms之间,数据0 236 { 237 Data=0;//收到数据0 238 } 239 240 if(ok==1)//收到起始信号,开始接收数据 241 { 242 hw_jsm<<=1; 243 hw_jsm+=Data; 244 245 if(Num>=32)//接收完,共32位 246 { 247 hw_jsbz=1;//标志置1 248 break; 249 } 250 251 Num++; 252 } 253 } 254 255 EXTI_ClearITPendingBit(EXTI_Line3); 256 257 } 258 259 } 260 261 262 /**************************************************************************** 263 * 264 * 函数名称:USART1_IRQHandler(void) 265 * 函数功能:串口中断1处理函数 266 * 267 ****************************************************************************/ 268 void USART1_IRQHandler(void) 269 { 270 271 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生了串口中断 272 { 273 274 USART_SendData(USART1,USART_ReceiveData(USART1));//从串口中读取数据,然后发送出去 275 276 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位 277 278 } 279 }
4、工程下载:
http://download.csdn.net/detail/a1181803348/8777117
三、红外发送
1、红外线发射原理图
2、数据格式
数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。
3、位定义
用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM
4、例程代码:
1 /************************************************************************************************************************************* 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数文件 5 * 6 ***************************************************************************************************************************************/ 7 8 #include "pbdata.h"//调用自定义公共函数库 9 10 11 /********************************************************************************* 12 * 13 * 初始化操作 14 * 15 *********************************************************************************/ 16 void RCC_Configuration(void);//系统时钟初始化函数声明 17 void GPIO_Configuration(void);//GPIO初始化函数声明 18 void NVIC_Configuration(void);//中断优先级配置函数声明 19 void USART_Configuration(void);//串口配置函数声明 20 21 void TIM2_Configuration(void);//定时器T2配置函数声明 22 void hw_fs(u32 dt);//红外线发射数据函数声明 23 24 25 /******************************************************************************** 26 * 27 * 函数名称:main(void) 28 * 函数功能:主函数 29 * 函数说明:不能用void定义主函数 30 * 31 ********************************************************************************/ 32 int main(void)//void不能void定义主函数 33 { 34 u32 dt=0x00FFD2AD;//红外线发射的数据 35 36 RCC_Configuration(); //系统时钟初始化 37 38 GPIO_Configuration();//端口初始化 39 40 USART_Configuration();//串口配置 41 42 NVIC_Configuration();//中断优先级配置 43 44 TIM2_Configuration();//定时器T2配置 45 46 47 hw_fs(dt);//红外线发射数据 48 49 50 while(1) 51 { 52 printf("fashe=%X\n",dt); 53 54 delay_ms(3000); 55 } 56 57 } 58 59 60 61 62 /******************************************************************************** 63 * 64 * 函数名称:RCC_Configuration(void) 65 * 函数功能:系统时钟高初始化函数 66 * 67 ********************************************************************************/ 68 void RCC_Configuration(void)//系统时钟高初始化函数 69 { 70 71 SystemInit();//系统初始化 72 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能 73 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//红外发送对应GPIO时钟使能 74 RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//定时器T2时钟使能 75 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能 76 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用 77 78 } 79 80 81 82 /******************************************************************************* 83 * 84 * 函数名称:GPIO_Configuration(void) 85 * 函数功能:GPIO初始化函数 86 * 87 ********************************************************************************/ 88 89 void GPIO_Configuration(void)//GPIO初始化函数 90 { 91 92 93 /*串口引脚配置*/ 94 GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 95 96 /*输出引脚配置*/ 97 /*结构体变量赋值*/ 98 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;////引脚配置TX 99 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率 100 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出 101 /*对应的GPIO初始化*/ 102 GPIO_Init(GPIOA,&GPIO_InitStructure); 103 104 105 /*输入引脚配置*/ 106 /*结构体变量赋值*/ 107 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX 108 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入 109 /*对应的GPIO初始化*/ 110 GPIO_Init(GPIOA,&GPIO_InitStructure); 111 112 113 } 114 115 116 /**************************************************************************** 117 * 118 * 函数名称:NVIC_Configuration(void) 119 * 函数功能:配置中断优先级 120 * 121 ****************************************************************************/ 122 123 void NVIC_Configuration(void) 124 { 125 NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量 126 127 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组 128 129 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 130 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级 131 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级 132 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 133 134 NVIC_Init(&NVIC_InitStructure);//初始化 135 } 136 137 138 /********************************************************************************* 139 * 140 * 函数名称: 141 * 函数功能:串口配置函数 142 * 143 *********************************************************************************/ 144 void USART_Configuration(void) 145 { 146 /*定义串口配置结构体变量*/ 147 USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量 148 149 150 /*结构体变量赋值*/ 151 USART_InitStructure.USART_BaudRate = 9600;//波特率9600 152 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位 153 USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1 154 USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验 155 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止 156 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能 157 158 159 /*发送串口配置初始化*/ 160 USART_Init(USART1, &USART_InitStructure); 161 162 163 /*打开串口接收中断*/ 164 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断 165 166 167 /*打开串口*/ 168 USART_Cmd(USART1,ENABLE);//串口使能,打开 169 170 /*清空中断标志位*/ 171 USART_ClearFlag(USART1,USART_FLAG_TC); 172 } 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
1 #include "pbdata.h" 2 3 4 5 6 /********************************************** 7 * 8 * 函数名称:TIM2_Configuration(void) 9 * 函数功能:配置定时器 10 * 11 ***********************************************/ 12 void TIM2_Configuration(void) 13 { 14 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义一个结构体配置变量 15 16 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//使用前清空标志位 17 18 19 20 /*38k,周期26.316us,一个中断13.16us时间;CPU72M,一个周期1/72us*/ 21 TIM_TimeBaseStructure.TIM_Period = 947;//初值:26.316/(1/72)=947个周期产生一次中断,初值为947 22 TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频 23 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟 24 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 25 26 TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);//初始化配置 27 28 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//打开中断(中断方式) 29 30 TIM_Cmd(TIM3,ENABLE);//打开定时器 31 } 32 33 34 35 36 void hw_fs(u32 dt) 37 { 38 u8 i=0; 39 flag=0;//初始化管脚 40 js_count=683;//起始信号持续9ms低电平,9ms/13.16us=683 41 flag=1;//管脚高电平 42 while(js_count);//一直到等于0 43 44 js_count=341;//持续4.5ms高电平,4.5ms/13.16us=341 45 flag=0;//初始化管脚 46 while(js_count);//一直到等于0 47 48 /*发送数据*/ 49 for(i=0;i<32;i++) 50 { 51 js_count=42;//持续0.56ms低电平,0.56ms/13.16us=42 52 flag=1;//管脚高电平 53 while(js_count);//一直到等于0 54 55 if((dt & 0x80000000)==0)//如果dt最高位为0,发射0 56 { 57 js_count=43;//持续0.565ms,0.565ms/13.16us=43 58 } 59 else//dt最高位为1,发射1 60 { 61 js_count=128;//持续1.69ms,1.69ms/13.16us=128 62 63 } 64 65 flag=0; 66 while(js_count);//一直到等于0 67 68 dt<<=1;//依次从高到低发送,总共32位 69 } 70 71 js_count=20;//0.263ms 72 flag=1; 73 while(js_count);//一直到等于0 74 flag=0;//恢复管脚状态 75 }
1 #ifndef _HW_FS_H 2 #define _HW_FS_H 3 4 #include "pbdata.h" 5 6 void TIM2_Configuration(void); 7 void hw_fs(u32 dt); 8 9 10 #endif
1 /** 2 ****************************************************************************** 3 * @file GPIO/IOToggle/stm32f10x_it.c 4 * @author MCD Application Team 5 * @version V3.0.0 6 * @date 04/06/2009 7 * @brief Main Interrupt Service Routines. 8 * This file provides template for all exceptions handler and 9 * peripherals interrupt service routine. 10 ****************************************************************************** 11 * @copy 12 * 13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 14 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 15 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 16 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 17 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 18 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 19 * 20 * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2> 21 */ 22 23 /* Includes ------------------------------------------------------------------*/ 24 #include "stm32f10x_it.h" 25 #include "stm32f10x_exti.h" 26 #include "stm32f10x_rcc.h" 27 #include "stm32f10x_tim.h" 28 #include "misc.h" 29 #include "pbdata.h" 30 31 void NMI_Handler(void) 32 { 33 } 34 35 36 37 /** 38 * @brief This function handles Hard Fault exception. 39 * @param None 40 * @retval : None 41 */ 42 void HardFault_Handler(void) 43 { 44 /* Go to infinite loop when Hard Fault exception occurs */ 45 while (1) 46 { 47 } 48 } 49 50 /** 51 * @brief This function handles Memory Manage exception. 52 * @param None 53 * @retval : None 54 */ 55 void MemManage_Handler(void) 56 { 57 /* Go to infinite loop when Memory Manage exception occurs */ 58 while (1) 59 { 60 } 61 } 62 63 /** 64 * @brief This function handles Bus Fault exception. 65 * @param None 66 * @retval : None 67 */ 68 void BusFault_Handler(void) 69 { 70 /* Go to infinite loop when Bus Fault exception occurs */ 71 while (1) 72 { 73 } 74 } 75 76 /** 77 * @brief This function handles Usage Fault exception. 78 * @param None 79 * @retval : None 80 */ 81 void UsageFault_Handler(void) 82 { 83 /* Go to infinite loop when Usage Fault exception occurs */ 84 while (1) 85 { 86 } 87 } 88 89 /** 90 * @brief This function handles SVCall exception. 91 * @param None 92 * @retval : None 93 */ 94 void SVC_Handler(void) 95 { 96 } 97 98 /** 99 * @brief This function handles Debug Monitor exception. 100 * @param None 101 * @retval : None 102 */ 103 void DebugMon_Handler(void) 104 { 105 } 106 107 /** 108 * @brief This function handles PendSV_Handler exception. 109 * @param None 110 * @retval : None 111 */ 112 void PendSV_Handler(void) 113 { 114 } 115 116 /** 117 * @brief This function handles SysTick Handler. 118 * @param None 119 * @retval : None 120 */ 121 void SysTick_Handler(void) 122 { 123 } 124 125 126 127 /**************************************************************************** 128 * 129 * 函数名称:void TIM3_IRQHandler(void) 130 * 外部中断处理函数 131 * 132 ****************************************************************************/ 133 134 135 void TIM3_IRQHandler(void) 136 { 137 TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 138 139 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) 140 { 141 if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET) 142 { 143 //LED 熄灭 144 GPIO_SetBits(GPIOB,GPIO_Pin_5); 145 } 146 else 147 { 148 //LED 发光 149 GPIO_ResetBits(GPIOB,GPIO_Pin_5); 150 } 151 } 152 153 } 154 155 156 157 158 /**************************************************************************** 159 * 160 * 函数名称:void EXTI9_5_IRQHandler(void) 161 * 外部中断处理函数 162 * 163 ****************************************************************************/ 164 void EXTI9_5_IRQHandler(void) 165 { 166 if(EXTI_GetITStatus(EXTI_Line5)==SET) //判断是否产生了中断 167 { 168 EXTI_ClearITPendingBit(EXTI_Line5);//中断清除 169 170 delay_ms(10);//延时消抖 171 172 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖 173 { 174 if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮 175 { 176 GPIO_SetBits(GPIOB,GPIO_Pin_5); //则熄灭 177 } 178 else 179 { 180 GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮 181 } 182 } 183 } 184 } 185 186 187 188 189 190 191 192 193 194 /**************************************************************************** 195 * ? ?úvoid EXTI1_IRQHandler(void) 196 * ? ?úEXTI2???m?? 197 * ????ú? 198 * ????ú? 199 * ? ?ú 200 * ????ú? 201 ****************************************************************************/ 202 void EXTI1_IRQHandler(void) 203 { 204 205 } 206 207 /**************************************************************************** 208 * ? ?úvoid EXTI2_IRQHandler(void) 209 * ? ?úEXTI2???m?? 210 * ????ú? 211 * ????ú? 212 * ? ?ú 213 * ????ú? 214 ****************************************************************************/ 215 void EXTI2_IRQHandler(void) 216 { 217 218 } 219 220 /**************************************************************************** 221 * 222 * 函数名称:void EXTI3_IRQHandler(void) 223 * 函数功能:外部中断XTI3中断处理函数 224 * 225 ****************************************************************************/ 226 void EXTI3_IRQHandler(void) 227 { 228 229 230 } 231 232 233 /**************************************************************************** 234 * 235 * 函数名称:USART1_IRQHandler(void) 236 * 函数功能:串口中断1处理函数 237 * 238 ****************************************************************************/ 239 void USART1_IRQHandler(void) 240 { 241 242 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生了串口中断 243 { 244 245 USART_SendData(USART1,USART_ReceiveData(USART1));//从串口中读取数据,然后发送出去 246 247 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位 248 249 } 250 } 251 252 253 /**************************************************************************** 254 * 255 * 函数名称:void TIM2_IRQHandler(void) 256 * 定时器T2中断处理函数 257 * 258 ****************************************************************************/ 259 260 261 void TIM2_IRQHandler(void) 262 { 263 if(flag==1)//发送载波频率 264 { 265 GPIO_WriteBit(GPIOD,GPIO_Pin_12,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_12))));//进入中断,管脚置反 266 } 267 else 268 { 269 GPIO_ResetBits(GPIOD,GPIO_Pin_12); 270 } 271 272 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清中断 273 274 }
1 /**************************************************************************************************************** 2 * 3 * 文件名称:pbdata.c 4 * 文件功能:自定义函数或者全局变量的初始化 5 * 6 ****************************************************************************************************************/ 7 8 /*头文件声明*/ 9 #include "pbdata.h" 10 11 12 13 14 /******************************************************************************************** 15 * 16 * 自定义全局变量 17 * 18 ********************************************************************************************/ 19 u8 dt=0; 20 u8 flag=0; 21 u16 js_count=0; 22 23 24 25 /****************************************************************************************** 26 * 27 * 自定义函数 28 * 29 ******************************************************************************************/ 30 31 32 33 /************************************************** 34 * 35 * 函数名称:delay_us(u32 nus) 36 * 函数功能:微秒延时函数 37 * 输入参数:输入值为延时us 38 * 39 ***************************************************/ 40 void delay_us(u32 nus) 41 { 42 u32 temp; 43 SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次 44 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 45 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 46 47 do 48 { 49 temp=SysTick->CTRL;//标志位,等到一直减到0 50 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 51 52 SysTick->CTRL=0x00; //关闭计数器 53 SysTick->VAL =0X00; //清空计数器 54 } 55 56 57 58 59 60 61 62 /*************************************************** 63 * 64 * 函数名称:delay_ms(u16 nms) 65 * 函数功能:毫秒级延时 66 * 输入参数:输入值位延时ms 67 * 68 ****************************************************/ 69 void delay_ms(u16 nms) 70 { 71 u32 temp; 72 SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次 73 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 74 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 75 76 do 77 { 78 temp=SysTick->CTRL;//标志位,等到一直减到0 79 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 80 81 SysTick->CTRL=0x00; //关闭计数器 82 SysTick->VAL =0X00; //清空计数器 83 } 84 85 86 87 /**************************************************** 88 * 89 * 重定义printf函数部分 90 * 91 ****************************************************/ 92 int fputc(int ch,FILE *F) 93 { 94 95 USART_SendData(USART1,(u8)ch); 96 97 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位 98 99 return ch; 100 }
1 /*pbdata.h*/ 2 /*************************************************************************************************** 3 * 4 * 文件名称:pbdata.h 5 * 文件功能:自定义的函数和全局变量的声明头文件 6 * 7 ***************************************************************************************************/ 8 9 #ifndef _pbdata_H 10 #define _pbdata_H 11 12 13 14 15 16 /******************************************************************** 17 * 18 * 调用的头文件放在这里 19 * 20 ********************************************************************/ 21 #include "stm32f10x.h" 22 23 24 #include "stm32f10x_rcc.h" 25 #include "stm32f10x_gpio.h" 26 #include "misc.h" 27 #include "stm32f10x_adc.h" 28 #include "stm32f10x_bkp.h" 29 #include "stm32f10x_can.h" 30 #include "stm32f10x_cec.h" 31 #include "stm32f10x_dac.h" 32 #include "stm32f10x_dbgmcu.h" 33 #include "stm32f10x_dma.h" 34 #include "stm32f10x_exti.h" 35 #include "stm32f10x_flash.h" 36 #include "stm32f10x_fsmc.h" 37 #include "stm32f10x_i2c.h" 38 #include "stm32f10x_iwdg.h" 39 #include "stm32f10x_pwr.h" 40 #include "stm32f10x_rtc.h" 41 #include "stm32f10x_sdio.h" 42 #include "stm32f10x_spi.h" 43 #include "stm32f10x_tim.h" 44 #include "stm32f10x_usart.h" 45 #include "stm32f10x_wwdg.h" 46 47 48 #include "stdio.h" 49 50 51 #include "hw_fs.h" 52 53 /******************************************************************** 54 * 55 * 自定义全局变量声明 56 * 57 ********************************************************************/ 58 extern u8 dt; 59 60 extern u8 flag; 61 extern u16 js_count; 62 63 64 65 /******************************************************************** 66 * 67 * 自定义全函数声明 68 * 69 ********************************************************************/ 70 void delay(u32 nCount); 71 void delay_us(u32 nus); 72 void delay_ms(u16 nms); 73 int fputc(int ch,FILE *F); 74 75 76 77 #endif
5、工程下载:
http://download.csdn.net/detail/a1181803348/8777119
标签:
原文地址:http://www.cnblogs.com/STM32bo/p/4555558.html