4. 单总线协议模块¶
4.1. DS18B20¶
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
更多DS18B20信息请参考:https://baike.baidu.com/item/DS18B20/10295269?fr=aladdin
下图为DS18B20的引脚说明图,DQ引脚为信号输入输出。
4.2. 实验过程¶
在编写DS18B20驱动时,要考虑更改硬件环境的情况。我们把DS18B20信号引脚相关的宏定义到 “bsp_ds18b20.h”文件中, 这样的话在更改或移植的时候只用改宏定义就可以。
在程序中定义PC0引脚连接DS18B20的DQ管脚,定义DS18B20_DQ_0为PC0低电平,DS18B20_DQ_1为PC0高电平。 定义DS18B20_DQ_IN为PC0输入状态。
1 2 3 4 5 6 7 8 9 10 11 12 | /************************** DS18B20 连接引脚定义********************************/
#define DS18B20_DQ_SCK_APBxClock_FUN RCC_APB2PeriphClockCmd
#define DS18B20_DQ_GPIO_CLK RCC_APB2Periph_GPIOC
#define DS18B20_DQ_GPIO_PORT GPIOC
#define DS18B20_DQ_GPIO_PIN GPIO_Pin_0
/************************** DS18B20 函数宏定义********************************/
#define DS18B20_DQ_0 GPIO_ResetBits ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN )
#define DS18B20_DQ_1 GPIO_SetBits ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN )
#define DS18B20_DQ_IN() GPIO_ReadInputDataBit ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN )
|
下面是DS18B20初始化函数,首先需要初始话一下DS18B20用到的引脚DQ,将DQ拉高,主机给从机发送复位脉冲后检测从机给主机返回的存在脉冲, 检测到正确脉冲表明DS18B20初始化成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | uint8_t DS18B20_Init(void)
{
/* 配置DS18B20用到的I/O口 */
DS18B20_GPIO_Config ();
/* DS18B20 DQ拉高*/
DS18B20_DQ_1;
/* 主机给从机发送复位脉冲 */
DS18B20_Rst();
/* 检测从机给主机返回的存在脉冲 */
return DS18B20_Presence ();
}
|
执行匹配 DS18B20 ROM操作,向DS18B20写序列号,发送命令(0x44)开始数据转换,再次执行匹配 DS18B20 ROM操作,向DS18B20写序列号后发送命令(0XBE)读取温度值, 最后将读取到的温度数据格式转换一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
{
uint8_t tpmsb, tplsb, i;
short s_tem;
float f_tem;
DS18B20_MatchRom (); //匹配ROM
for(i=0;i<8;i++)
DS18B20_WriteByte ( ds18b20_id [ i ] );
DS18B20_WriteByte(0X44); /* 开始转换 */
DS18B20_MatchRom (); //匹配ROM
for(i=0;i<8;i++)
DS18B20_WriteByte ( ds18b20_id [ i ] );
DS18B20_WriteByte(0XBE); /* 读温度值 */
tplsb = DS18B20_ReadByte();
tpmsb = DS18B20_ReadByte();
s_tem = tpmsb<<8;
s_tem = s_tem | tplsb;
if( s_tem < 0 ) /* 负温度 */
f_tem = (~s_tem+1) * 0.0625;
else
f_tem = s_tem * 0.0625;
return f_tem;
}
|
最后是在主函数中编写控制程序。
在程序中定义一个ucDs18b20Id[8]数组用来存储DS18B20的序列号,初始化SysTick为1us中断一次,方便后面使用滴答定时器的延时函数, 初始化串口1,初始化DS18B20,读取打印 DS18B20 的序列号,for(;;)为死循环的一种写法,在其中循环打印通过 DS18B20 序列号获取的温度值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | int main(void)
{
uint8_t uc, ucDs18b20Id [ 8 ];
/* 配置SysTick 为1us中断一次 */
SysTick_Init();
/* LED 端口初始化 */
LED_GPIO_Config();
USART_Config(); //初始化串口1
printf("\r\n this is a ds18b20 test demo \r\n");
while( DS18B20_Init() )
printf("\r\n no ds18b20 exit \r\n");
printf("\r\n ds18b20 exit \r\n");
DS18B20_ReadId ( ucDs18b20Id ); // 读取 DS18B20 的序列号
printf("\r\nDS18B20的序列号是: 0x");
for ( uc = 0; uc < 8; uc ++ ) // 打印 DS18B20 的序列号
printf ( "%.2x", ucDs18b20Id [ uc ] );
for(;;)
{
printf ( "\r\n获取该序列号器件的温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
Delay_ms(1000); /* 1s 读取一次温度值 */
LED2_TOGGLE;
}
}
|
程序下载到板子里面之后打开串口调试助手观察调试信息如下
4.3. DHT11温湿度传感器¶
DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。
更多DHT11信息请参考:https://baike.sogou.com/v73984313.htm?fromTitle=DHT11
- 下图为DHT11的引脚说明图,DATA引脚为信号输入输出。
4.4. 例程介绍¶
在编写DHT11驱动时,要考虑更改硬件环境的情况。我们把DHT11信号引脚相关的宏定义到 “bsp_dht11.h”文件中, 这样的话在更改或移植的时候只用改宏定义就可以。
在程序中定义 PE6 引脚连接DHT11的DATA管脚,定义 DHT11_Dout_0 为PE6低电平,DHT11_Dout_1 为PE6高电平。 定义 DHT11_Dout_IN 为PE6输入状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /************************** DHT11 连接引脚定义********************************/
#define DHT11_Dout_SCK_APBxClock_FUN RCC_APB2PeriphClockCmd
#define DHT11_Dout_GPIO_CLK RCC_APB2Periph_GPIOE
#define DHT11_Dout_GPIO_PORT GPIOE
#define DHT11_Dout_GPIO_PIN GPIO_Pin_6
/************************** DHT11 函数宏定义********************************/
#define DHT11_Dout_0 GPIO_ResetBits ( DHT11_Dout_GPIO_PORT, DHT11_Dout_GPIO_PIN )
#define DHT11_Dout_1 GPIO_SetBits ( DHT11_Dout_GPIO_PORT, DHT11_Dout_GPIO_PIN )
#define DHT11_Dout_IN() GPIO_ReadInputDataBit ( DHT11_Dout_GPIO_PORT, DHT11_Dout_GPIO_PIN )
|
下面的代码是初始化DHT11引脚,主要是设置与DHT11连接的IO口为推挽输出,并将IO口的电平设置为高电平
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /**
* @brief DHT11 初始化函数
* @param 无
* @retval 无
*/
void DHT11_Init ( void )
{
DHT11_GPIO_Config ();
DHT11_Dout_1; // 拉高DHT11数据引脚
}
/*
* 函数名:DHT11_GPIO_Config
* 描述 :配置DHT11用到的I/O口
* 输入 :无
* 输出 :无
*/
static void DHT11_GPIO_Config ( void )
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启DHT11_Dout_GPIO_PORT的外设时钟*/
DHT11_Dout_SCK_APBxClock_FUN ( DHT11_Dout_GPIO_CLK, ENABLE );
/*选择要控制的DHT11_Dout_GPIO_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = DHT11_Dout_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DHT11_Dout_GPIO_PORT*/
GPIO_Init ( DHT11_Dout_GPIO_PORT, &GPIO_InitStructure );
}
|
接下来就是要从DHT11读取温湿度数据,该函数代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | /*
* 从DHT11读取一个字节,MSB先行
*/
static uint8_t DHT11_ReadByte ( void )
{
uint8_t i, temp=0;
for(i=0;i<8;i++)
{
/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/
while(DHT11_Dout_IN()==Bit_RESET);
/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
*通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
*/
DHT11_DELAY_US(40); //延时x us 这个延时需要大于数据0持续的时间即可
if(DHT11_Dout_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */
{
/* 等待数据1的高电平结束 */
while(DHT11_Dout_IN()==Bit_SET);
temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1,MSB先行
}
else // x us后为低电平表示数据“0”
{
temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
}
}
return temp;
}
/*
* 一次完整的数据传输为40bit,高位先出
* 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
*/
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{
/*输出模式*/
DHT11_Mode_Out_PP();
/*主机拉低*/
DHT11_Dout_0;
/*延时18ms*/
DHT11_DELAY_MS(18);
/*总线拉高 主机延时30us*/
DHT11_Dout_1;
DHT11_DELAY_US(30); //延时30us
/*主机设为输入 判断从机响应信号*/
DHT11_Mode_IPU();
/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
if(DHT11_Dout_IN()==Bit_RESET)
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(DHT11_Dout_IN()==Bit_RESET);
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(DHT11_Dout_IN()==Bit_SET);
/*开始接收数据*/
DHT11_Data->humi_int= DHT11_ReadByte();
DHT11_Data->humi_deci= DHT11_ReadByte();
DHT11_Data->temp_int= DHT11_ReadByte();
DHT11_Data->temp_deci= DHT11_ReadByte();
DHT11_Data->check_sum= DHT11_ReadByte();
/*读取结束,引脚改为输出模式*/
DHT11_Mode_Out_PP();
/*主机拉高*/
DHT11_Dout_1;
/*检查读取的数据是否正确*/
if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
return SUCCESS;
else
return ERROR;
}
else
return ERROR;
}
|
最后我们再来看看主函数:在主函数中调用DHT11初始化函数并读取数据。此处有一个需要注意的地方是读取数据的时间间隔一般是2S左右,时间不能太短,否则读取数据会出错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
DHT11_Data_TypeDef DHT11_Data;
/* 初始化系统定时器 */
SysTick_Init();
USART_Config();//初始化串口1
printf("\r\n***野火STM32 dht11 温湿度传感器实验***\r\n");
/*初始化DTT11的引脚*/
DHT11_Init ();
while(1)
{
/*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
if( DHT11_Read_TempAndHumidity ( & DHT11_Data ) == SUCCESS)
{
printf("\r\n读取DHT11成功!\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",\
DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
}
else
{
printf("Read DHT11 ERROR!\r\n");
}
Delay_ms(2000);
}
}
|
下载程序之后打开串口调试助手,观察到的现象如下所示
4.5. 1838红外遥控模块¶
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机和手机系统中。
更多红外遥控信息请参考 红外遥控简介
下图为红外遥控模块的引脚说明图,OUT引脚为信号输出。
4.6. 例程介绍¶
在编写1838红外遥控模块驱动时,要考虑更改硬件环境的情况。我们把与模块信号相关的引脚宏定义到 “bsp_irda.h”文件中, 这样的话在更改或移植的时候只用改宏定义就可以。 在程序中定义PD7引脚连接模块的OUT管脚,定义宏IrDa_DATA_IN读取OUT引脚的电平。
下面是模块的初始化函数,主要是打开相应GPIO端口的时钟,设置引脚为浮空输入模式。为了能及时准确的采集到模块输出信号电平的变化,这里开启了外部中断,并设置为下降沿触发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* 初始化红外接收头1838用到的IO */
void IrDa_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* config the extiline clock and AFIO clock */
RCC_APB2PeriphClockCmd(IRDA_GPIO_CLK | RCC_APB2Periph_AFIO,ENABLE);
/* config the NVIC */
NVIC_Configuration();
/* EXTI line gpio config */
GPIO_InitStructure.GPIO_Pin = IRDA_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(IRDA_GPIO_PORT, &GPIO_InitStructure);
/* EXTI line mode config */
GPIO_EXTILineConfig(IRDA_GPIO_PORT_SOURCE, IRDA_GPIO_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line = IRDA_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
|
4.6.1. 红外遥控解码过程¶
以下说明仅针对 野火STM32开发板 配套的遥控器和红外接收头,不过市面上的红外遥控器基本都是这类型的:
遥控 :NEC 编码 960nm的波长 晶振为455KHZ,对应的发射频率(载波频率)为38KHZ,遥控ID为0(即系统识别码),反码为255,不同的遥控ID有可能不一样。
接收头:1838 脉冲型
遥控码由三部分组成
leader code: 9ms的高电平 + 4.5ms 的低电平(发送方的电平跟接收方解调出来的电平是反向的)
系统识别码: 区别不同的红外遥控设备
操作码: 8bit操作码和8bit的操作反码组成
红外接收头接收到遥控器的信号后,输出的数据波形如下图所示,写程序时就根据这个信号的波形来写。
接收数据主要是在外部中断服务函数中进行,函数通过计算引脚高电平的时间来判断接收的数据是0还是1,通过移位操作把接收到的数据存储到frame_data变量中。接收完一帧数据 之后frame_flag变量会置位,主函数中轮询检测该标志位来判断有没有遥控器按键按下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | // IO 线中断, 接红外接收头的数据管脚
void IRDA_EXTI_IRQHANDLER_FUN(void)
{
uint8_t pulse_time = 0;
uint8_t leader_code_flag = 0; /* 引导码标志位,当引导码出现时,表示一帧数据开始 */
uint8_t irda_data = 0; /* 数据暂存位 */
if(EXTI_GetITStatus(IRDA_EXTI_LINE) != RESET) /* 确保是否产生了EXTI Line中断 */
{
while(1)
{
if( IrDa_DATA_IN()== SET ) /* 只测量高电平的时间 */
{
pulse_time = Get_Pulse_Time();
/* >=5ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环 */
if( pulse_time >= 250 )
{
break; /* 跳出while(1)循环 */
}
if(pulse_time>=200 && pulse_time<250) /* 获得前导位 4ms~4.5ms */
{
leader_code_flag = 1;
}
else if(pulse_time>=10 && pulse_time<50) /* 0.56ms: 0.2ms~1ms */
{
irda_data = 0;
}
else if(pulse_time>=50 && pulse_time<100) /* 1.68ms:1ms~2ms */
{
irda_data =1 ;
}
else if( pulse_time>=100 && pulse_time<=200 ) /* 2.1ms:2ms~4ms */
{/* 连发码,在第二次中断出现 */
frame_flag = 1; /* 一帧数据接收完成 */
frame_cnt++; /* 按键次数加1 */
isr_cnt ++; /* 进中断一次加1 */
break; /* 跳出while(1)循环 */
}
if( leader_code_flag == 1 )
{/* 在第一次中断中完成 */
frame_data <<= 1;
frame_data += irda_data;
frame_cnt = 0;
isr_cnt = 1;
}
}
}// while(1)
EXTI_ClearITPendingBit(IRDA_EXTI_LINE); //清除中断标志位
//LED2_TOGGLE;
}
}
|
通过IrDa_Process函数来提取frame_data变量里面键值和遥控器ID等信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /*
* 帧数据有4个字节,第一个字节是遥控的ID,第二个字节是第一个字节的反码
* 第三个数据是遥控的真正的键值,第四个字节是第三个字节的反码
*/
uint8_t IrDa_Process(void)
{
uint8_t first_byte, sec_byte, tir_byte, fou_byte;
first_byte = frame_data >> 24;
sec_byte = (frame_data>>16) & 0xff;
tir_byte = frame_data >> 8;
fou_byte = frame_data;
/* 记得清标志位 */
frame_flag = 0;
if( (first_byte==(uint8_t)~sec_byte) && (first_byte==IRDA_ID) )
{
if( tir_byte == (u8)~fou_byte )
return tir_byte;
}
return 0; /* 错误返回 */
}
|
最后在主函数中轮询检测frame_flag标志是否置位来判断遥控器按键是否按下,通过IrDa_Process函数读取键值并打印出来,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | /**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
uint8_t key_val;
/* config the led */
LED_GPIO_Config();
LED1_ON;
/* 配置SysTick 为10us中断一次 */
SysTick_Init();
/* 重新配置SysTick的中断优先级为最高,要不然SysTick延时中断抢占不了IO EXTI中断
* 因为SysTick初始化时默认配置的优先级是最低的
* 或者当你用其他定时器做延时的时候,要配置定时器的优先级高于IO EXTI中断的优先级
*/
NVIC_SetPriority (SysTick_IRQn, 0);
/* USART1 config 115200 8-N-1 */
USART_Config();
printf("\r\n 这是一个红外遥控发射与接收实验 \r\n");
/* 初始化红外接收头CP1838用到的IO */
IrDa_Init();
for(;;)
{
if( frame_flag == 1 ) /* 一帧红外数据接收完成 */
{
key_val = IrDa_Process();
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 按键次数frame_cnt=%d \r\n",frame_cnt);
printf("\r\n 中断次数isr_cnt=%d \r\n",isr_cnt);
/* 不同的遥控器面板对应不同的键值,需要实际测量 */
switch( key_val )
{
case 0:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n Error \r\n");
break;
case 162:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n POWER \r\n");
break;
case 226:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n MENU \r\n");
break;
case 34:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n TEST \r\n");
break;
case 2:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n + \r\n");
break;
case 194:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n RETURN \r\n");
break;
case 224:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n |<< \r\n");
break;
case 168:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n > \r\n");
break;
case 144:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n >>| \r\n");
break;
case 104:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 0 \r\n");
break;
case 152:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n - \r\n");
break;
case 176:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n C \r\n");
break;
case 48:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 1 \r\n");
break;
case 24:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 2 \r\n");
break;
case 122:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 3 \r\n");
break;
case 16:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 4 \r\n");
break;
case 56:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 5 \r\n");
break;
case 90:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 6 \r\n");
break;
case 66:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 7 \r\n");
break;
case 74:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 8 \r\n");
break;
case 82:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 9 \r\n");
break;
default:
break;
}
}
}
}
|
下载程序之后,打开串口调试助手,对准红外接收头按下遥控器上面的按键,观察到的信息如下图所示
遥控器上面所有按键的键值如下