任务

本项目进行智能电热蚊香器系统的设计与开发,将STM32开发板作为一个微控制器,结合蓝牙技术,通过手机APP软件对电热蚊香器进行灵活的控制,使电热蚊香器的功能更加人性化,更加符合当代人们对家用电器智能化的要求。
使用STM32开发板作为基础,结合PC端(Windows系统)和手机端(Android系统),应用蓝牙技术开发智能电热蚊香器系统,实现智能电热蚊香器的定时开关、蚊香器开关提示音乐、更换蚊香液提醒、灯光提醒等功能,使其具有良好的市场需求。本项目的智能控制系统的开发有效地整合了集蓝牙技术、智能手机、电脑程序智能化操控等多种现代科技技术于一体。在一定程度上提高了各项技术的合理利用程度及蓝牙技术的推广,从而向人们推广一种整合技术创新的思想。具体实现方法如下:

  1. 点击客户端的蓝牙连接按钮使用蓝牙进行对接。
  2. 连接成功后小型系统板反馈当前蚊香液可用时长信息在数码管上。
  3. 用户使用相应的功能,点击开关按钮。
  4. 客户端根据用户的需求发送相应的指令代码,若满足条件,则代码发送成功;否则,发送反馈信息失败,用户重新输入指令。
  5. 系统板通过蓝牙模块接受指令。
  6. 系统板将代码转换成电信号发送到各工作模块。
  7. 各模块根据电信号开始进行工作。
  8. 设置完毕断开蓝牙连接,各模块根据用户需求开始工作。
  9. 语音播放提示

效果

实物图



软件

使用QT开发的跨平台应用,没有太注重布局,略微不太美观哈。但功能齐全。

原理图

设计过程

功能引脚分配

自设置通信指令

源代码

代码工程尽量做模块化,故而较多,不再赘放,下面放置主要代码,用于参考。

/*******************************************************************************\* 文件名称:基于STM32单片机的电热蚊香蓝牙控制系统\* 实验目的:1.\* 2.\* 程序说明:完整程序Q:277 227 2579;@: itworkstation@ hotmail.com\* 日期版本:本项目分享关键细节,熟悉使用单片机的可做参考代码。完整讲解+源代码工程可联系获取,可定制。*******************************************************************************/

蓝牙模块

#ifndef __BLUETOOTH_h
#define __BLUETOOTH_h#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include "Def_config.h"#define BLUETOOTH_Buffer_Length 100
#define BLUETOOTH_Length 50typedef struct
{char BLUETOOTH_Rec_Buffer[BLUETOOTH_Buffer_Length];ENUM_JUDGE isGetData;       //是否获取到数据ENUM_JUDGE isParseData;    //是否解析完成ENUM_JUDGE isUsefull;       //信息是否有效char sendMessage[BLUETOOTH_Length];u8 SetOpenTimeHour;u8 SetOpenTimeMin;u8 SetOpenTimeHourEnd;u8 SetOpenTimeMinEnd;uint16_t avilLiquid;u8 avilTime;ENUM_JUDGE is_TimeOpen;ENUM_JUDGE is_HandOpen;
} _BLUETOOTHData;
extern _BLUETOOTHData BLUETOOTH_Data;void BLUETOOTH_sendMessage(void);
void BLUETOOTH_RecHandle(u8 Res);
void BLUETOOTH_Clear_Data(void);
void parseBLUETOOTHBuffer(void);#endif 
#include "bluetooth.h"
#include "ds1302.h"
#include "key01.h"
#include "RELAY.h"
#include "JQ_8400.h"
_BLUETOOTHData BLUETOOTH_Data;
char  BLUETOOTH_RX_BUF[BLUETOOTH_Buffer_Length]; //接收缓冲,最大BLUETOOTH_Buffer_Length个字节.末字节为换行符
u8 point2 = 0;
void BLUETOOTH_RecHandle(u8 Res)
{if(Res == '$'){point2 = 0;    }BLUETOOTH_RX_BUF[point2++] = Res;if(Res == '@')                                       {memset(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer, 0, BLUETOOTH_Buffer_Length);      //清空memcpy(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer, BLUETOOTH_RX_BUF, point2);    //保存数据BLUETOOTH_Data.isGetData = TRUE; point2 = 0;memset(BLUETOOTH_RX_BUF, 0, BLUETOOTH_Buffer_Length);      //清空}        if(point2 >= BLUETOOTH_Buffer_Length){point2 = BLUETOOTH_Buffer_Length;}
}
void BLUETOOTH_Clear_Data(void)
{BLUETOOTH_Data.isGetData = FALSE;BLUETOOTH_Data.isParseData = FALSE;BLUETOOTH_Data.isUsefull = FALSE;memset(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer, 0, BLUETOOTH_Buffer_Length);      //清空memset(BLUETOOTH_Data.sendMessage, 0, BLUETOOTH_Length);      //清空BLUETOOTH_Data.SetOpenTimeHour = 19;BLUETOOTH_Data.SetOpenTimeMin = 0;BLUETOOTH_Data.SetOpenTimeHourEnd = 5;BLUETOOTH_Data.SetOpenTimeMinEnd = 30;BLUETOOTH_Data.avilLiquid = 100;BLUETOOTH_Data.avilTime = 45;BLUETOOTH_Data.is_HandOpen = FALSE;BLUETOOTH_Data.is_TimeOpen = FALSE;
}
u8 BLUETOOTH_Find(char *a)                   // 串口命令识别函数
{ if(strstr(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer,a)!=NULL)return 1;elsereturn 0;
}
void BLUETOOTH_sendMessage(void)
{memset(BLUETOOTH_Data.sendMessage, 0, BLUETOOTH_Length);      //清空printf("$%02d#%02d#%03d#%02d#%01d#%01d#%02d#%02d#@",BLUETOOTH_Data.SetOpenTimeHour,BLUETOOTH_Data.SetOpenTimeMin,BLUETOOTH_Data.avilLiquid,BLUETOOTH_Data.avilTime,BLUETOOTH_Data.is_TimeOpen,BLUETOOTH_Data.is_HandOpen,BLUETOOTH_Data.SetOpenTimeHourEnd,BLUETOOTH_Data.SetOpenTimeMinEnd);
//  sprintf(BLUETOOTH_Data.sendMessage,"$%02d#%02d#%03d#%02d#%01d#%01d#%02d#%02d#@",
//      BLUETOOTH_Data.SetOpenTimeHour,BLUETOOTH_Data.SetOpenTimeMin,
//      BLUETOOTH_Data.avilLiquid,BLUETOOTH_Data.avilTime,
//      BLUETOOTH_Data.is_TimeOpen,BLUETOOTH_Data.is_HandOpen,
//      BLUETOOTH_Data.SetOpenTimeHourEnd,BLUETOOTH_Data.SetOpenTimeMinEnd
//  );
//  printf(BLUETOOTH_Data.sendMessage);
}
void parseBLUETOOTHBuffer(void)
{if (BLUETOOTH_Data.isGetData)  //获得语音模块的数据 --- $1@   : $4@{BLUETOOTH_Data.isGetData = FALSE;if(BLUETOOTH_Find("$T")){BLUETOOTH_Data.isParseData = TRUE;BLUETOOTH_Data.isUsefull = TRUE;if(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[2] == '1'){BLUETOOTH_Data.is_TimeOpen = TRUE;     LED_Control(ON);JQ8400_6x00SendCmd(SELECTE_PLAY,8);}else if(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[2] == '0'){BLUETOOTH_Data.is_TimeOpen = FALSE;LED_Control(OFF);JQ8400_6x00SendCmd(SELECTE_PLAY,9);}else{}BLUETOOTH_Data.SetOpenTimeHour = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[4]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[5]-0x30));BLUETOOTH_Data.SetOpenTimeMin = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[7]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[8]-0x30));BLUETOOTH_Data.SetOpenTimeHourEnd = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[10]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[11]-0x30));BLUETOOTH_Data.SetOpenTimeMinEnd = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[13]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[14]-0x30));  BLUETOOTH_sendMessage();        }else if(BLUETOOTH_Find("$H")){BLUETOOTH_Data.isParseData = TRUE;BLUETOOTH_Data.isUsefull = TRUE;if(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[2] == '1'){BLUETOOTH_Data.is_HandOpen = TRUE;key_struct.is_mode_on = TRUE;                        RELAY_Control(ON);JQ8400_6x00SendCmd(SELECTE_PLAY,3);}else if(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[2] == '0'){BLUETOOTH_Data.is_HandOpen = FALSE;key_struct.is_mode_on = FALSE;RELAY_Control(OFF);JQ8400_6x00SendCmd(SELECTE_PLAY,4);}else{}BLUETOOTH_sendMessage();}else if(BLUETOOTH_Find("$N")){BLUETOOTH_Data.isParseData = TRUE;BLUETOOTH_Data.isUsefull = TRUE;  TimeData_Set.year = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[4]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[5]-0x30));TimeData_Set.month = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[7]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[8]-0x30));TimeData_Set.day = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[10]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[11]-0x30));TimeData_Set.hour = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[14]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[15]-0x30));TimeData_Set.minute = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[17]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[18]-0x30));TimeData_Set.second = ((BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[20]-0x30)*10+(BLUETOOTH_Data.BLUETOOTH_Rec_Buffer[21]-0x30));DS1302_setTime();JQ8400_6x00SendCmd(SELECTE_PLAY,5);}else if(BLUETOOTH_Find("$OK@")){BLUETOOTH_Data.isParseData = TRUE;BLUETOOTH_Data.isUsefull = TRUE;BLUETOOTH_sendMessage();JQ8400_6x00SendCmd(SELECTE_PLAY,1);}else{//          BLUETOOTH_Clear_Data(); //清空接收到的数据---数据帧无效}}
}/*******************参考处理设计,自行添加内容*****************************
void Proc_Bluethooth(void)
{parseBLUETOOTHBuffer();if(BLUETOOTH_Data.isUsefull == TRUE){BLUETOOTH_Data.isUsefull = FALSE;}
}
************************************************/

JQ8400语音模块

#ifndef __JQ_8400_H__
#define __JQ_8400_H__#include "main.h"
#include "usart1.h" #define JQ8400_GPIO_PORT      GPIOA                           /* GPIO端口 */
#define JQ8400_GPIO_CLK         RCC_APB2Periph_GPIOA          /* GPIO端口时钟 */
#define JQ8400_GPIO_PIN         GPIO_Pin_11  //播放时为高电平,其余时间为低电平#define JQ8400_BUSY  GPIO_ReadInputDataBit(JQ8400_GPIO_PORT,JQ8400_GPIO_PIN)//读取判忙状态,是否正在播放#define  JQ8400_SendData   Usart1_SendByte#define SET_CMD    0X00       //仅设置模式,并不送入数据指令#define PLAY_ON    0X02      //  播放
#define PLAY_SUSPEND   0X03         //暂停
#define PLAY_OFF   0X04          //停止
#define PLAY_LAST   0X05          //上一曲
#define PLAY_NEXT   0X06          //下一曲#define SELECTE_PLAY 0X07       //指定曲目  后面要加曲目号#define SET_SOUND  0X13      //音量设置      1-30级,要送16进制即: 0-0X1E
#define SOUND_ADD  0X14    //音量加
#define SOUND_DEC  0X15       //音量减#define SELECTE_MODE  0X18  //模式
#define MODE_DQXH  0X01  //单曲循环
#define MODE_DQTZ  0X02  //单曲停止
#define MODE_SJBF  0X03  //随机播放//sbit JQ8400_BUSY=P2^4;    //播放时为高电平,其余时间为低电平
void JQ8400_Init(void);void JQ8400_6x00SendCmd(u8 cmd,u16 dat);//发送命令#endif
#include "JQ_8400.h"
#include "delay.h"
/*****在线语音合成工具http://tools.bugscaner.com/tts/ ********/
void JQ8400_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;  /*定义一个GPIO_InitTypeDef类型的结构体*/RCC_APB2PeriphClockCmd(JQ8400_GPIO_CLK,ENABLE);//使能PORTB时钟GPIO_InitStructure.GPIO_Pin  = JQ8400_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //设置成上拉输入GPIO_Init(JQ8400_GPIO_PORT, &GPIO_InitStructure);         //初始化JQ8400_6x00SendCmd(SET_SOUND,0X1E);  //设置默认播放声音JQ8400_6x00SendCmd(SELECTE_MODE,MODE_DQTZ);  //设置默认播放模式,单曲停止//   JQ8400_6x00SendCmd(SELECTE_PLAY,7); //选择指定曲目播放
}
void JQ8400_SendMultiByte(u8 *Buff, u8 Len )
{u8 i;for ( i = 0 ; i < Len ; i++ ){JQ8400_SendData( Buff[i] );        }
}
u8 JQ8400_SumCheck ( u8 *Str, u8 len ) //和校验
{u16 xorsum = 0;u8 i;for ( i = 0; i < len; i++ ){xorsum = xorsum + ( *Str++ );}return ( ( u8 ) ( xorsum & 0x00ff ) );
}
void JQ8400_6x00SendCmd(u8 cmd,u16 dat)//发送命令
{u8 pbuff[6];u8 xorsum;pbuff[0]=0xAA;pbuff[1]=cmd;if(cmd==SET_SOUND){pbuff[2]=0x01;pbuff[3]=(u8)dat;xorsum=JQ8400_SumCheck(pbuff,4);pbuff[4]=xorsum;JQ8400_SendMultiByte(pbuff,5);  }else if(cmd==SELECTE_PLAY){pbuff[2]=0x02;pbuff[3]=(u8)(dat>>16)&0xff;pbuff[4]=(u8)(dat&0xff);xorsum=JQ8400_SumCheck(pbuff,5);pbuff[5]=xorsum;JQ8400_SendMultiByte(pbuff,6);   }else if(cmd==SELECTE_MODE){pbuff[2]=0x01;pbuff[3]=(u8)dat;xorsum=JQ8400_SumCheck(pbuff,4);pbuff[4]=xorsum;JQ8400_SendMultiByte(pbuff,5);     }else{ pbuff[2]=0x00;xorsum=JQ8400_SumCheck(pbuff,3);pbuff[3]=xorsum;JQ8400_SendMultiByte(pbuff,4);  }                       Delay_ms(500);   while(JQ8400_BUSY);    //播放时为高电平,其余时间为低电平
} 

DS1302模块

#ifndef __DS1302_H
#define __DS1302_H  #include "main.h"#define DS1302_GPIOPIN_SCLK    GPIO_Pin_13
#define DS1302_GPIOPIN_DATA    GPIO_Pin_14
#define DS1302_GPIOPIN_RST     GPIO_Pin_15#define SCLK_L GPIO_ResetBits(GPIOB,GPIO_Pin_13)//拉低时钟线
#define SCLK_H  GPIO_SetBits(GPIOB,GPIO_Pin_13)//拉高时钟线
#define DATA_L  GPIO_ResetBits(GPIOB,GPIO_Pin_14)//拉低数据线
#define DATA_H  GPIO_SetBits(GPIOB,GPIO_Pin_14)//拉高数据线
#define CE_L GPIO_ResetBits(GPIOB,GPIO_Pin_15)//拉低使能位
#define CE_H GPIO_SetBits(GPIOB,GPIO_Pin_15)//拉高使能位struct TIMEData
{u16 year;u8  month;u8  day;u8  hour;u8  minute;u8  second;u8  week;
};//创建TIMEData结构体方便存储时间日期数据
extern struct TIMEData TimeData,TimeData_Set;//全局变量void DS1302_Init(void);//DS1302初始化函数void DS1302_setTime(void);
void DS1302_gpio_init(void);//DS1302端口初始化
void DS1302_write_onebyte(u8 data);//向DS1302发送一字节数据
void DS1302_wirte_rig(u8 address,u8 data);//向指定寄存器写一字节数据
u8 DS1302_read_rig(u8 address);//从指定寄存器读一字节数据
void DS1302_DATAOUT_init(void);//IO端口配置为输出
void DS1302_DATAINPUT_init(void);//IO端口配置为输入
void DS1302_read_time(void);//从DS1302读取实时时间(BCD码)
void DS1302_read_realTime(void);//将BCD码转化为十进制数据#endif
#include "ds1302.h"
#include "delay.h"struct TIMEData TimeData,TimeData_Set;
u8 read_time[7];
/********************************8421BCD码到十进制转换*****************************/
uint8_t BCD_DEC_conv(uint8_t x)
{uint8_t dec;dec =  0x0f & x;x = x >> 4;dec = dec + x * 10;return(dec);
}
/********************************十进制到8421BCD码转换*****************************/
uint8_t DEC_BCD_conv(uint8_t x)
{uint8_t bcd;bcd =  x % 10;x = x / 10;x = x << 4;bcd   = bcd | x ;return(bcd);
}
void DS1302_gpio_init()//CE,SCLK端口初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_ResetBits(GPIOB,GPIO_Pin_15); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //SCLKGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}void DS1302_DATAOUT_init()//配置双向I/O端口为输出态
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //DATAGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}void DS1302_DATAINPUT_init()//配置双向I/O端口为输入态
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // DATAGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
}void DS1302_write_onebyte(u8 data)//向DS1302发送一字节数据
{u8 count=0;DS1302_DATAOUT_init();SCLK_L;for(count=0;count<8;count++){   SCLK_L;if(data&0x01){DATA_H;}else{DATA_L;}//先准备好数据再发送SCLK_H;//拉高时钟线,发送数据data>>=1;}
}void DS1302_wirte_rig(u8 address,u8 data)//向指定寄存器地址发送数据
{u8 temp1=address;u8 temp2=data;CE_L;SCLK_L;Delay_us(1);CE_H;Delay_us(2);DS1302_write_onebyte(temp1);DS1302_write_onebyte(temp2);CE_L;SCLK_L;Delay_us(2);
}u8 DS1302_read_rig(u8 address)//从指定地址读取一字节数据
{u8 temp3=address;u8 count=0;u8 return_data=0x00;CE_L;SCLK_L;Delay_us(3);CE_H;Delay_us(3);DS1302_write_onebyte(temp3);DS1302_DATAINPUT_init();//配置I/O口为输入Delay_us(2);for(count=0;count<8;count++){Delay_us(2);//使电平持续一段时间return_data>>=1;SCLK_H;Delay_us(4);//使高电平持续一段时间SCLK_L;Delay_us(14);//延时14us后再去读取电压,更加准确if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)){return_data=return_data|0x80;}}Delay_us(2);CE_L;DATA_L;return return_data;
}
void DS1302_setTime(void)
{DS1302_wirte_rig(0x8e,0x00);//关闭写保护DS1302_wirte_rig(0x80,DEC_BCD_conv(TimeData_Set.second));//seconds 秒DS1302_wirte_rig(0x82,DEC_BCD_conv(TimeData_Set.minute));//minutes分DS1302_wirte_rig(0x84,DEC_BCD_conv(TimeData_Set.hour));//hours时DS1302_wirte_rig(0x86,DEC_BCD_conv(TimeData_Set.day));//date日DS1302_wirte_rig(0x88,DEC_BCD_conv(TimeData_Set.month));//months月DS1302_wirte_rig(0x8a,DEC_BCD_conv(TimeData_Set.week));//days 星期一 1 - 7星期日7DS1302_wirte_rig(0x8c,DEC_BCD_conv(TimeData_Set.year));//year2020年DS1302_wirte_rig(0x8e,0x80);//关闭写保护
}
void DS1302_Init()
{TimeData.second = 10;TimeData.minute = 44;TimeData.hour= 16;TimeData.day= 1;TimeData.month= 4;TimeData.week= 5;TimeData.year= 22;TimeData_Set.second = 10;TimeData_Set.minute = 44;TimeData_Set.hour= 16;TimeData_Set.day= 1;TimeData_Set.month= 4;TimeData_Set.week= 5;TimeData_Set.year= 22;DS1302_gpio_init();DS1302_DATAINPUT_init();if((DS1302_read_rig(0x80) & 0x80) == 0x00)  //  秒寄存器最高位:0的时候 时钟停止,1的时候时钟运行{DS1302_setTime();}else   //时钟运行的话就不初始化了{//      DS1302_wirte_rig(0x8e,0x00);//关闭写保护
//      DS1302_wirte_rig(0x80,DEC_BCD_conv(TimeData.second));//seconds 秒
//      DS1302_wirte_rig(0x82,DEC_BCD_conv(TimeData.minute));//minutes分
//      DS1302_wirte_rig(0x84,DEC_BCD_conv(TimeData.hour));//hours时
//      DS1302_wirte_rig(0x86,DEC_BCD_conv(TimeData.day));//date日
//      DS1302_wirte_rig(0x88,DEC_BCD_conv(TimeData.month));//months月
//      DS1302_wirte_rig(0x8a,DEC_BCD_conv(TimeData.week));//days 星期一 1 - 7星期日7
//      DS1302_wirte_rig(0x8c,DEC_BCD_conv(TimeData.year));//year2020年
//      DS1302_wirte_rig(0x8e,0x80);//关闭写保护}
}void DS1302_read_time()
{read_time[0]=DS1302_read_rig(0x81);//读秒read_time[1]=DS1302_read_rig(0x83);//读分read_time[2]=DS1302_read_rig(0x85);//读时read_time[3]=DS1302_read_rig(0x87);//读日read_time[4]=DS1302_read_rig(0x89);//读月read_time[5]=DS1302_read_rig(0x8B);//读星期read_time[6]=DS1302_read_rig(0x8D);//读年
}void DS1302_read_realTime()
{DS1302_read_time();  //BCD码转换为10进制TimeData.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);TimeData.minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);TimeData.hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);TimeData.day=(read_time[3]>>4)*10+(read_time[3]&0x0f);TimeData.month=(read_time[4]>>4)*10+(read_time[4]&0x0f);TimeData.week=read_time[5];TimeData.year=(read_time[6]>>4)*10+(read_time[6]&0x0f);
}

QT制作APP

后期有时间整理了会开源到github,在此占位。

B40 - 基于STM32单片机的电热蚊香蓝牙控制系统相关推荐

  1. 毕业设计 基于STM32单片机的水箱水位控制系统

    基于STM32单片机的水箱水位控制系统 用32单片机完成对MPX10DP压差传感器的数据采集,然后将采集的信号在OLED12864显示屏上,然后可以用按键设定上下限值,当超过上下值得时候分别控制继电器 ...

  2. 基于stm32单片机智能温控风扇控制系统Proteus仿真

    资料编号:103  下面是相关功能视频演示: 103-基于stm32单片机智能温控风扇控制系统Proteus仿真(源码+仿真+全套资料) 功能介绍:采用stm32单片机.ds18b20温度传感器采集温 ...

  3. STM32开发实例 基于STM32单片机的教师灯光控制系统

    一.系统设计 本次设计的是基于STM32F103C8T6单片机设计的一款教室灯光控制系统,系统内有光敏电阻模块采集教室内的光照强度,光电管检测教室内是否有人,通过按键可以直接控制开灯和关灯,通过ESP ...

  4. 基于STM32单片机的风力摆控制系统

    摘    要  本系统采用STM32F103V开发板作为控制中心,与万向节.摆杆.直流风机(无刷电机+扇叶).激光头.反馈装置一起构成摆杆运动状态与风机速度分配的双闭环调速系统.单片机输出可变的PWM ...

  5. 基于STM32单片机的智能鱼缸控制系统原理图PCB

    功能介绍: 0.本系统采用STM32F103C8T6作为单片机 1.采用DS1302时钟芯片可实时显示时间,通过四个功能按键可设置投喂等操作定时时间 2.具有WiFi模块可以与手机进行数据传输通信 3 ...

  6. 基于STM32单片机智能蓝牙PWM温控风扇带定时APP控制

    实践制作DIY- GC0009-智能蓝牙PWM温控风扇 一.功能说明: 基于STM32单片机设计-智能蓝牙PWM温控风扇 功能介绍: 1.基于STM32F103C系列,OLED,DHT11温度湿度传感 ...

  7. STM32开发实例 基于STM32单片机的蓝牙手环

    一.系统设计 本次是基于STM32单片机的简易蓝牙手环,手指放在心率检测处,心率传感器就能实时的检测使用者的心率的变化,并在显示屏上进行显示:通过DS18B20检测体温,体温数值也会在显示屏上进行显示 ...

  8. STM32单片机WIFI教室灯光控制系统人数自动灯光温度时间

    实践制作DIY- GC0135-WIFI教室灯光控制系统 一.功能说明: 基于STM32单片机设计-WIFI教室灯光控制系统 二.功能介绍: 电路:STM32F103C最小系统板+DS18B20温度传 ...

  9. 基于STM32单片机窗帘窗户晾衣架雨滴光照检测控制系统电子代

    基于STM32单片机窗帘窗户晾衣架雨滴光照检测控制系统电子代 硬件构成: STM32单片机+最小系统+液晶LCD1602显示+蜂鸣器报警模块+设置按键+雨滴检测模块+光敏电阻模块5516+ULN200 ...

最新文章

  1. LeetCode实战:逆波兰表达式求值
  2. NYOJ 14 会场安排问题
  3. 误删/etc/passwd的修复
  4. python文件写入字典格式输出_Python把对应格式的csv文件转换成字典类型存储脚本的方法...
  5. 利用FS寄存器获取KERNEL32.DLL基址算法的证明(ZZ)
  6. 通过css裁切图片为菱形图片
  7. 为什么BERT在商业环境碰壁?
  8. linux安装mysql.rpm软件包_Linux环境安装MySQL数据库(RPM格式的软件包)
  9. 《连线》杂志专访李彦宏:百度all in AI 欲引领智能革命
  10. 利用WinDriver开发PCI设备驱动程序
  11. 谱曲软件-MuseScore
  12. HanLp的应用 - 真实使用
  13. TVDI中线性拟合干湿边的步骤
  14. 20164305徐广皓 - Exp1 PC平台逆向破解(5)M
  15. Solr_专题:shema 之 types
  16. 在VS中给源文件用文件夹分类/在VS中变更源文件路径
  17. 临近下班又开会,熬夜加班写纪要,语音转写还收费……
  18. W7 关闭 ss 无法上网 解决方法
  19. 新玺配资:多空短兵相接 警惕短线调整
  20. 知识图谱技术发展详解(一)

热门文章

  1. Win11麦克风测试在哪里?Win11测试麦克风的方法
  2. vector<int> v 与 vector<int> v(n) 的区别
  3. html5微信语音转文字,文字转换语音软件:我有个朋友不会识字 怎么能把微信上别人发给他的文字转换成语音...
  4. Android开发之简易音乐播放器(一)
  5. 深入探索Linux虚拟化KVM-Qemu分析之CPU虚拟化
  6. DSP28335:多功能复用引脚GPIO
  7. 2020 NOC 编程猫创新编程全国决赛小学组第一部分(客观题)
  8. Java 10正式发布,带来了这些新特性
  9. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part7(Redis常见使用(部署)方式:单机模式、主从模式、哨兵模式、集群模式)~整起
  10. 布袋除尘器有关matlab编程,布袋除尘器工作原理结构图及使用注意事项