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

任务

本项目进行智能电热蚊香器系统的设计与开发,将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 50

typedef 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;
	else
		return 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; //SCLK
	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_13); 
}
 
void DS1302_DATAOUT_init()//配置双向I/O端口为输出态
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //DATA
	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_14);
}
 
void DS1302_DATAINPUT_init()//配置双向I/O端口为输入态
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // DATA
	GPIO_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星期日7
		DS1302_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,在此占位。

猜你喜欢

转载自blog.csdn.net/qq_20467929/article/details/126119240