本项目进行智能电热蚊香器系统的设计与开发,将STM32开发板作为一个微控制器,结合蓝牙技术,通过手机APP软件对电热蚊香器进行灵活的控制,使电热蚊香器的功能更加人性化,更加符合当代人们对家用电器智能化的要求。
使用STM32开发板作为基础,结合PC端(Windows系统)和手机端(Android系统),应用蓝牙技术开发智能电热蚊香器系统,实现智能电热蚊香器的定时开关、蚊香器开关提示音乐、更换蚊香液提醒、灯光提醒等功能,使其具有良好的市场需求。本项目的智能控制系统的开发有效地整合了集蓝牙技术、智能手机、电脑程序智能化操控等多种现代科技技术于一体。在一定程度上提高了各项技术的合理利用程度及蓝牙技术的推广,从而向人们推广一种整合技术创新的思想。具体实现方法如下:
使用QT开发的跨平台应用,没有太注重布局,略微不太美观哈。但功能齐全。
代码工程尽量做模块化,故而较多,不再赘放,下面放置主要代码,用于参考。
/*******************************************************************************
\* 文件名称:基于STM32单片机的电热蚊香蓝牙控制系统
\* 实验目的:1.
\* 2.
\* 程序说明:完整程序Q:277 227 2579;@: itworkstation@ hotmail.com
\* 日期版本:本项目分享关键细节,熟悉使用单片机的可做参考代码。完整讲解+源代码工程可联系获取,可定制。
*******************************************************************************/
#ifndef __BLUETOOTH_h
#define __BLUETOOTH_h
#include "stm32f10x.h"
#include
#include
#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;
}
}
************************************************/
#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); //播放时为高电平,其余时间为低电平
}
#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);
}
后期有时间整理了会开源到github,在此占位。