1、按键电路
在系统中SW1按键与STM32F103的PB3引脚相连接,SW2按键与STM32F103的PA15引脚相连接。
2、PB3、PA15引脚配置程序
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3、PB3、PA15外部IO中断配置程序
void Exti_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
4、PB3、PA15外部IO中断服务程序
unsigned char bz=0;
//PB3的中断服务程序
void EXTI3_IRQHandler(void)//按键1,右边的,控制温度
{
if (EXTI_GetITStatus(EXTI_Line3) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line3);
bz=0;//温度标志
}
}
//PA15的中断服务程序
void EXTI15_10_IRQHandler(void)//按键2,左边的,控制湿度
{
if (EXTI_GetITStatus(EXTI_Line15) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15);
bz=1;//湿度标志
}
}
注:上述所有程序全部编写在exit.c文件中。
5 按键控制DHT11显示温度和湿度的主程序
在main.c中编写如下代码:
//功能概要:STM32f103C8 滴达定时中断和温湿度DHT11传感器
//通过按键可以控制显示温度还是显示湿度
//PB12 LED灯 工作指示灯 2秒周期
//PC13 DHT11 DATA引脚
//数码管接口,TM1650
//SCL PB10
//SDA PB11 */
//两个按键 通过中断实现
//PA15 SW2
//PB3 SW1
//SysTick中断在stm32f10x_it.c中
#include "gpio.h"
#include "DHT11.h"
#include "exti.h"
#include "delay.h"
#include "systick.h"
#include "I2C.h"
#include "tm1650.h"
extern unsigned char bz;
void disp(u8 i,u8 flage)
{
u8 gw=0;//个位
u8 sw=0;//十位
u8 bw=0;//百位
u8 qw=0;//百位
gw=i%10;
sw=(i/10)%10;
bw=(i/100)%10;
qw=(i/1000)%10;
if(qw==0)
{
TM1650_Set(0x68,0);
}else{
TM1650_Set(0x68,CODE[qw]);
}
if(bw==0 && qw==0)
{
TM1650_Set(0x6A,0);
}else{
TM1650_Set(0x6A,CODE[bw]);
}
if(sw==0 && bw==0 && qw==0)
{
TM1650_Set(0x6C,0);
}else{
TM1650_Set(0x6C,CODE[sw]);
}
TM1650_Set(0x6E,CODE[gw]); //最右边
if(flage==0)
{
TM1650_Set(0x68,CODE[1]); //最左边 温度
}else{
TM1650_Set(0x68,CODE[2]); //最左边 湿度
}
}
int main(void)
{
u16 AD_value=0;
u8 dht_dat[5]={0,0,0,0,0};
u8 tm_dt=0x01;//亮度
u8 i=0;
SystemInit();
SYSTICK_Init();
Exti_Config();//初始化中断配置,必须放在前面
Nvic_Config();//初始化中断向量,必须放在前面
LED_GPIO_Config();
KEY_GPIO_Config();
I2C_Config();
Delay_ms(50);
TM1650_Set(0x48,tm_dt); //初始化为5级灰度,开显示
while(1)
{
Delay_ms(500);
if (i==1)
{ i=0;
LED1_OFF;
}else{
i=1;
LED1_ON;
}
read_temp(dht_dat);
if(bz==0)
{
AD_value=dht_dat[2]; //温度
}else{
AD_value=dht_dat[0]; //湿度
}
disp(AD_value,bz);
}
}
6、其它程序
系统时钟配置、嘀哒时钟配置、LED配置、DHT11引脚配置、TM650引脚配置等其它程序请自行参考本博客相应的文章。
1、按键电路
在系统中SW1按键与STM32F103的PB3引脚相连接,SW2按键与STM32F103的PA15引脚相连接。
2、PB3、PA15引脚配置程序
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3、PB3、PA15外部IO中断配置程序
void Exti_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
4、PB3、PA15外部IO中断服务程序
unsigned char bz=0;
//PB3的中断服务程序
void EXTI3_IRQHandler(void)//按键1,右边的,控制温度
{
if (EXTI_GetITStatus(EXTI_Line3) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line3);
bz=0;//温度标志
}
}
//PA15的中断服务程序
void EXTI15_10_IRQHandler(void)//按键2,左边的,控制湿度
{
if (EXTI_GetITStatus(EXTI_Line15) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15);
bz=1;//湿度标志
}
}
注:上述所有程序全部编写在exit.c文件中。
5 按键控制DHT11显示温度和湿度的主程序
在main.c中编写如下代码:
//功能概要:STM32f103C8 滴达定时中断和温湿度DHT11传感器
//通过按键可以控制显示温度还是显示湿度
//PB12 LED灯 工作指示灯 2秒周期
//PC13 DHT11 DATA引脚
//数码管接口,TM1650
//SCL PB10
//SDA PB11 */
//两个按键 通过中断实现
//PA15 SW2
//PB3 SW1
//SysTick中断在stm32f10x_it.c中
#include "gpio.h"
#include "DHT11.h"
#include "exti.h"
#include "delay.h"
#include "systick.h"
#include "I2C.h"
#include "tm1650.h"
extern unsigned char bz;
void disp(u8 i,u8 flage)
{
u8 gw=0;//个位
u8 sw=0;//十位
u8 bw=0;//百位
u8 qw=0;//百位
gw=i%10;
sw=(i/10)%10;
bw=(i/100)%10;
qw=(i/1000)%10;
if(qw==0)
{
TM1650_Set(0x68,0);
}else{
TM1650_Set(0x68,CODE[qw]);
}
if(bw==0 && qw==0)
{
TM1650_Set(0x6A,0);
}else{
TM1650_Set(0x6A,CODE[bw]);
}
if(sw==0 && bw==0 && qw==0)
{
TM1650_Set(0x6C,0);
}else{
TM1650_Set(0x6C,CODE[sw]);
}
TM1650_Set(0x6E,CODE[gw]); //最右边
if(flage==0)
{
TM1650_Set(0x68,CODE[1]); //最左边 温度
}else{
TM1650_Set(0x68,CODE[2]); //最左边 湿度
}
}
int main(void)
{
u16 AD_value=0;
u8 dht_dat[5]={0,0,0,0,0};
u8 tm_dt=0x01;//亮度
u8 i=0;
SystemInit();
SYSTICK_Init();
Exti_Config();//初始化中断配置,必须放在前面
Nvic_Config();//初始化中断向量,必须放在前面
LED_GPIO_Config();
KEY_GPIO_Config();
I2C_Config();
Delay_ms(50);
TM1650_Set(0x48,tm_dt); //初始化为5级灰度,开显示
while(1)
{
Delay_ms(500);
if (i==1)
{ i=0;
LED1_OFF;
}else{
i=1;
LED1_ON;
}
read_temp(dht_dat);
if(bz==0)
{
AD_value=dht_dat[2]; //温度
}else{
AD_value=dht_dat[0]; //湿度
}
disp(AD_value,bz);
}
}
6、其它程序
系统时钟配置、嘀哒时钟配置、LED配置、DHT11引脚配置、TM650引脚配置等其它程序请自行参考本博客相应的文章。
举报