#include "SHT30.h"
#define SHT30I2C_SCL GPIO_PIN_2
#define SHT30I2C_SDA GPIO_PIN_3
#define GPIO_I2C GPIOC
#define I2C_SCL_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SCL)
#define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SCL)
#define I2C_SDA_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SDA)
#define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SDA)
#define SDA_IN GPIO_ReadInputDataBit(GPIO_I2C,SHT30I2C_SDA)
#define write 0 //第8位是写命令
#define read 1 //第8位是读命令
//定义温湿度存储变量
u8 humiture_buff1[20];
float Temperature = 0.000000;
float Humidity = 0.000000;
//初始化IIC
void SHT30_Init(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出
GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA;
GPIO_InitStructure.Pin = SHT30I2C_SCL | SHT30I2C_SDA;
GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure);
I2C_SCL_H;
I2C_SDA_H;
}
//设置为输出模式
static void I2C_SDA_OUT(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出
GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA;
GPIO_InitStructure.Pin = SHT30I2C_SDA;
GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure);
}
//设置为输入模式
static void I2C_SDA_IN(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = SHT30I2C_SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure);
}
//主机发送确认字符ACK
void IIC_ACK(void)
{
I2C_SDA_OUT();
I2C_SCL_L;
Delayus(2);
I2C_SDA_L;
Delayus(2);
I2C_SCL_H;
Delayus(2);
I2C_SCL_L;
Delayus(1);
}
//主机不发送确认字符ACK
void IIC_NACK(void)
{
I2C_SDA_OUT();//输出模式
I2C_SCL_L;
Delayus(2);
I2C_SDA_H;
Delayus(2);
I2C_SCL_H;
Delayus(2);
I2C_SCL_L;
Delayus(1);
}
//主机等待从机的确认字符ACK
u8 IIC_wait_ACK(void)
{
u8 t = 200;
I2C_SDA_OUT();
I2C_SDA_H;
Delayus(1);
I2C_SCL_L;
Delayus(1);
I2C_SDA_IN();
Delayus(1);
while(SDA_IN)//等待SHT30应答
{
t--;
Delayus(1);
if(t == 0)
{
I2C_SCL_L;
return 1;
}
Delayus(1);
}
Delayus(1);
I2C_SCL_H;
Delayus(1);
I2C_SCL_L;
Delayus(1);
return 0;
}
//启动IIC通讯
void IIC_Start(void)
{
I2C_SDA_OUT();
I2C_SDA_H;
I2C_SCL_H;
Delayus(4);
I2C_SDA_L;
Delayus(4);
I2C_SCL_L;
}
//结束IIC总线通讯
void IIC_Stop(void)
{
I2C_SDA_OUT();
I2C_SCL_L;
I2C_SDA_L;
Delayus(4);
I2C_SCL_H;
Delayus(4);
I2C_SDA_H;
Delayus(4);
}
//将byte数据发送出去
void IIC_SendByte(u8 byte)
{
u8 Count;
I2C_SDA_OUT();
I2C_SCL_L;
for(Count = 0; Count < 8; Count++) //要传送的数据长度为8位
{
if(byte & 0x80)
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
byte <<= 1;
Delayus(2);
I2C_SCL_H;
Delayus(2);
I2C_SCL_L;
Delayus(2);
}
}
//用来接收从器件传来的数据
u8 IIC_RcvByte(void)
{
u8 retc;
u8 Count;
retc = 0;
I2C_SDA_IN();//配置数据线为输入方式
Delayus(1);
for(Count = 0; Count < 8; Count++)
{
I2C_SCL_L;
Delayus(2);
I2C_SCL_H;
retc = retc << 1;
if(SDA_IN) retc |= 1;
Delayus(1);
}
I2C_SCL_L;
return(retc);
}
//读取系列号
u8 ReadHumitureSensorType(u8 addr)
{
u32 SerialNumber = 0;
u8 type = TYPE_SHT40;//默认是TYPE_SHT30
// u8 type = TYPE_SHT30;//默认是TYPE_SHT30
#if 0
u8 buff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
IIC_Start();
IIC_SendByte(addr << 1 | write);
IIC_wait_ACK();
IIC_SendByte(0x89);
IIC_wait_ACK();
IIC_Stop();
Delayms(50);
IIC_Start();
IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位
if(!IIC_wait_ACK())
{
Delayus(1);
buff[0] = IIC_RcvByte(); //返回系列号的高8位
IIC_ACK();
buff[1] = IIC_RcvByte(); //返回系列号的高8位
IIC_ACK();
buff[2] = IIC_RcvByte(); //温度crc校验位
IIC_ACK();
buff[3] = IIC_RcvByte(); //返回湿度高8位
IIC_ACK();
buff[4] = IIC_RcvByte(); //返回湿度低8位
IIC_ACK();
buff[5] = IIC_RcvByte(); //湿度crc校验位
IIC_NACK();
IIC_Stop();
}
else
{
SerialNumber = 0;
IIC_Stop();
Delayms(50);
}
SerialNumber = buff[0];
SerialNumber <<= 8;
SerialNumber |= buff[1];
SerialNumber <<= 8;
SerialNumber |= buff[3];
SerialNumber <<= 8;
SerialNumber |= buff[4];
if(SerialNumber > 0)
{
type = TYPE_SHT40;
}
#endif
return type;
}
//读出温湿度
void SHT30_read_result(u8 addr, u8 type)
{
int ret = 0;
u16 tem, hum;
u16 buff[6];
//发送指令为0x2C06(默认)
IIC_Start();
IIC_SendByte(addr << 1 | write); //写7位I2C设备地址加0作为写取位,1为写取位
IIC_wait_ACK();
if(type == TYPE_SHT40)
{
//SHT40
IIC_SendByte(0xFD);
IIC_wait_ACK();
}
else
{
//SHT30
IIC_SendByte(0x2c);
IIC_wait_ACK();
IIC_SendByte(0x06);
IIC_wait_ACK();
}
IIC_Stop();
Delayms(50);
IIC_Start();
IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位
ret = IIC_wait_ACK();
if(!ret)
{
Delayus(1);
buff[0] = IIC_RcvByte(); //返回温度高8位
IIC_ACK();
buff[1] = IIC_RcvByte(); //返回温度低8位
IIC_ACK();
buff[2] = IIC_RcvByte(); //温度crc校验位
IIC_ACK();
buff[3] = IIC_RcvByte(); //返回湿度高8位
IIC_ACK();
buff[4] = IIC_RcvByte(); //返回湿度低8位
IIC_ACK();
buff[5] = IIC_RcvByte(); //湿度crc校验位
IIC_NACK();
IIC_Stop();
}
tem = ((buff[0] << 8) | buff[1]);
hum = ((buff[3] << 8) | buff[4]);
if(type == TYPE_SHT40)
{
//温湿度的计算方法如下
Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ;
Humidity = 125.0 * (float)hum / 65535.0 - 6;
}
else
{
//温湿度的计算方法如下
Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ;
Humidity = 100.0 * (float)hum / 65535.0;
}
hum = 0;
tem = 0;
}
#ifndef __TYPE_H
#define __TYPE_H
#include "main.h"
typedef enum
{
RANG_70DB = 0x00,
RANG_100DB = 0x01,
RANG_130DB = 0x02
} MEA_RANGE_TypeDef;
//typedef enum
//{
// POINT_100DB = 0x00,
// POINT_70DB = 0x01,
// POINT_40DB = 0x02
//} CAL_POINT_TypeDef;
typedef enum
{
SHORT_PRESS = 0x00,
LONG_PRESS = 0x01,
} PRESS_MODE_TypeDef;
typedef enum
{
A_WEIGHT = 0x00,
C_WEIGHT = 0x01,
} FREQ_WEIGHT_TypeDef;
typedef enum
{
FAST_RESP = 0x00,
SLOW_RESP = 0x01,
} FREQ_RESP_TypeDef;
typedef enum
{
MAIN_STATE = 0x00,
SET_STATE = 0x01,
} SYS_STATE_TypeDef;
typedef enum
{
SET_ALM = 0x00 ,//原噪音,现在作为温度使用
SET_ALM2 ,//新增:作为湿度使用
SET_ALM_TIME ,
SET_ALM_Type ,
SET_YEAR ,
SET_MONTH ,
SET_DAY ,
SET_HOUR ,
SET_MINUTE ,
SET_SECOND ,
SET_ALM_CLOCK_HOUR ,
SET_ALM_CLOCK_MINUTE ,
SET_ALM_CLOCK_EN ,
} SET_STATE_TypeDef;
typedef enum
{
NO_OUT_RANGE = 0x00,
OVER_RANGE = 0x01,
UNDER_RANGE = 0x02,
} OUT_RANGE_TypeDef;
typedef struct
{
u8 KeyAge : 8;
u8 KeyPress : 4;
u8 KeyProcessed : 4;
GPIO_Module *KeyPort;
uint16_t KeyPin;
void (*fun) (PRESS_MODE_TypeDef);
} SysKey;
typedef struct
{
u8 First_Press;
u8 Mea_OK;
u8 EEPROM_ERR;
u8 SPIFlashErr;
u8 Cal_Finish;
// u8 Cal_DB_Finish;
u8 Cal_En;
u8 DispSetEn;
u8 LCDFlick;
u8 FlickEn;
u8 RecFull;
u8 Alarms;
u8 UpOver;
u8 ClockSoundEn;
u8 GetRec;
u8 BiBiBi;
u8 Nop;
u8 GetDate;
u8 Test;
u8 PWD, PWDErr;
u8 EraseDoing;
u8 UsbCmdLen;
u8 SensorType; //温湿度传感器类型
u8 DMA_OK;
u8 shutdown;
u8 showLcd;
u8 Negative;
} FLAG_TYPE;
typedef struct
{
double ADC_VALUE[3];
double ADC_Sum_Value;
u32 ADC_INT_Value;
u16 ADC_CNT;
// u16 DB_Disp;
u16 TEMP_Disp;
u16 HUMI_Disp;
u32 ADC_INT_Value_TAB[8];
u32 CAL_INT_Value;
u16 Disp_ALM;
//CAL
u8 ADC_TAB_CNT;
u8 Cal_Mode;
//系统状态
// CAL_POINT_TypeDef Cal_DB_Point;
FREQ_WEIGHT_TypeDef Freq_Weight;
FREQ_RESP_TypeDef Freq_Resp;
SYS_STATE_TypeDef Sys_State;
OUT_RANGE_TypeDef Mea_Range;
MEA_RANGE_TypeDef Adc_Range;
SET_STATE_TypeDef Set_State;
FunctionalState ALM_EN;
u8 SaveCnt_2s;
u16 Wait;
// u8 DispDB_Cnt;
u8 DispTEMP_Cnt;
u8 DispHUMI_Cnt;
u8 CalEn;
s16 SET_Value;
u16 Save_2s_Data[14];
u32 Start_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1
u32 End_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1
u8 Cal_Step;
u8 Save_Cnt;
u8 FlashNum;
u8 WaitReleaseKey;
u32 OverCntt[3];
u8 Alm_Time;
u8 Alm_Type;
int16_t Alm;
int16_t Alm2;
// u16 MaxDB_Save;
u16 MaxTEMP_Save;
u16 MaxHUMI_Save;
u8 SaveTime2s;
u8 DMA_Group;
u8 BattCnt;
u16 BattBuff[64];
u32 Batt;
u8 Units; // 0:摄氏度, 1:华氏度
} DATA_TYPE;
typedef struct
{
unsigned char year ;
unsigned char month ;
unsigned char day ;
unsigned char hour ;
unsigned char minute ;
unsigned char second ;
} DATE_TIME;
typedef struct
{
unsigned char hour ;
unsigned char minute ;
unsigned char second ;
unsigned char enabled ;
} TIME_INFO;
typedef union
{
u32 Mem[2];
struct
{
int16_t Alm_Value : 16;
int16_t Alm2_Value : 16;
u8 Alm_Switch : 4;
u8 Alm_Type : 4;
u8 Alm_Time : 8;
} Struct_Para;
} UNION_PARA;
typedef struct
{
u16 ID;
u16 ChipStart;
u32 REC_HalfPages;//从0开始 0至MAX_REC_Pages-1
int16_t Cal_Adc[3];
// int16_t Cal_DB[3];
int32_t Cal_Adc_Squ[3];
UNION_PARA AlmPara;
u8 PWRON_Erase;
u8 AlarmClockOk;//产生报警
TIME_INFO AlarmClockInfo;
} SYS_INFO;
//128
typedef struct
{
u8 Header;
u8 Machine_State;
u8 Year ;
u8 Month ;
u8 Day ;
u8 Hour ;
u8 Minute ;
u8 Second ;
u16 Result[60]; //Noise_Result: Freq_Weight + Freq_Respon + DB_Value 存储用
} STORAGE;
#endif
#include <stdio.h>
#include "main.h"
FLAG_TYPE SysFlag;
DATA_TYPE SysData;
double Phasea;
u32 Phaseb;
SYS_INFO SysInfo;
STORAGE Storage, Rec_Data;
uint8_t Report_buf[MY_DEF_PACKET]; //usb接收BUFF
uint8_t Send_Buffer[MY_DEF_PACKET]; //usb发射BUFF
u8 SysClock, Clock_150, Clock_500, Clock_750, test;
u8 USB_Device_dev;
uint16_t TEMP = 0, TEMP2 = 0, TEMP3 = 0, TEMP4 = 0;
uint16_t DMA_Test_Value[5], DMA_Test_Value1[5];
uint16_t ADC1ConvertedValue1[5];
#define HUMIMAX 32
float humi_bak[HUMIMAX];
unsigned char humi_pt=0;
//const u32 CAL_DB[3] = {10000, 7000, 4000};
RCC_ClocksType RCC_Clocks_;//获得时钟频率
u8 RedLelOnFlag;
void timeTempCompensation(void)
{
static u16 powerOnTime = 0;
static u8 second = 0;
if(Time_Dec.second != second)
{
if(powerOnTime < 900) //10分钟
{
powerOnTime++;
}
}
second = Time_Dec.second;
if(powerOnTime < 600)
{
Temperature = Temperature - powerOnTime * (2.0 / 600.0f);
}
else
{
Temperature = Temperature - (2.0 + (powerOnTime - 600) * (0.5 / 300.0f));
}
}
u8 TwinkleControl(void)
{
static unsigned char second = 0;
static unsigned char showFlag = 0;
static s16 SET_Value = 0;
static unsigned char enabled = 0;
if(second != Time_Dec.second)
{
second = Time_Dec.second;
if((SET_Value != SysData.SET_Value) || (SysInfo.AlarmClockInfo.enabled != enabled))
{
showFlag = 1;
SET_Value = SysData.SET_Value;
enabled = SysInfo.AlarmClockInfo.enabled;
}
else
{
if(showFlag)
{
showFlag = 0;
}
else
{
showFlag = 1;
}
}
}
return showFlag;
}
#
//温湿度时间处理
void humitureTaskPro()
{
unsigned char showFlag = 0,loopi;
float tmp[HUMIMAX];
Get_Time();
if((SysData.Sys_State != SET_STATE) || ((SysData.Sys_State == SET_STATE) && (SysData.Set_State < SET_ALM_CLOCK_HOUR)))
{
SHT30_read_result(0x44, SysFlag.SensorType);
for(loopi=1;loopi<(HUMIMAX);loopi++)
{
humi_bak[loopi-1]=humi_bak[loopi];
tmp[loopi-1]=humi_bak[loopi-1];
}
humi_bak[HUMIMAX-1]=Humidity;
tmp[HUMIMAX-1]=Humidity;
bubble_float(tmp,HUMIMAX);
Humidity=(tmp[HUMIMAX>>1]+tmp[(HUMIMAX>>1)+1])/2.0f;
timeTempCompensation();
}
}
void AlarmSettingTaskPro()
{
unsigned char showFlag = 0;
if((SysData.Sys_State == SET_STATE) && (SysData.Set_State > SET_SECOND))
{
showFlag = TwinkleControl();
switch(SysData.Set_State)
{
case SET_ALM_CLOCK_HOUR:
Disp_AL();
if(!showFlag)
{
ClearHour();
}
break;
case SET_ALM_CLOCK_MINUTE:
Disp_AL();
if(!showFlag)
{
ClearMinute();
}
break;
case SET_ALM_CLOCK_EN:
if(showFlag)
{
if(SysInfo.AlarmClockInfo.enabled)
{
Disp_ON();
}
else
{
Disp_OFF();
}
}
else
{
Disp_Clear();
}
break;
default:
break;
}
// ClearTemp();
// ClearHumi();
if(showFlag)
{
displayAlarmClockTime(SysInfo.AlarmClockInfo.hour, SysInfo.AlarmClockInfo.minute);
SysFlag.showLcd = 0;
}
RefreshDisplay();
}
}
void GreenLedOn(void)//电量指示灯
{
LED_Green_ON;
}
void GreenLedOff(void)
{
LED_Green_OFF;
}
void RedLedOn(void)
{
LED_Red_ON;
}
void RedLedOff(void)
{
LED_Red_OFF;
}
void Led_2_On(void)//报警指示灯
{
LED_2_ON;
}
void Led_2_Off(void)
{
LED_2_OFF;
}
void Led_3_On(void)//摄氏度指示灯
{
LED_3_ON;
}
void Led_3_Off(void)
{
LED_3_OFF;
}
void Led_4_On(void)//华氏度指示灯
{
LED_4_ON;
}
void Led_4_Off(void)
{
LED_4_OFF;
}
void RedLedTwinkleOnce(u16 period)
{
static u16 count = 0;
static u8 LedOnFlag = 0;
count++;
if(count > period)
{
LED_Green_OFF;
RedLedOn();
RedLelOnFlag = 1;
}
if(count > (period + 1))
{
RedLedOff();
count = 0;
RedLelOnFlag = 0;
}
}
void RedLedTwinkle(u16 period)
{
static u16 count = 0;
static u8 LedOnFlag = 0;
count++;
if(count > period)
{
if(LedOnFlag)
{
LED_Green_OFF;
Led_2_On();
SysFlag.LCDFlick = 1;
LedOnFlag = 0;
}
else
{
LED_Green_OFF;
Led_2_Off();
SysFlag.LCDFlick = 0;
LedOnFlag = 1;
}
count = 0;
}
}
void GreenLedTwinkle(u16 period)
{
static u16 count = 0;
static u8 LedOnFlag = 0;
count++;
if(count > period)
{
if(LedOnFlag)
{
GreenLedOn();
LedOnFlag = 0;
}
else
{
GreenLedOff();
LedOnFlag = 1;
}
count = 0;
}
}
void GreenLedTwinkle_USBCHECK_ON(u16 period)//debug
{
static u16 count = 0;
static u8 LedOnFlag = 0;
count++;
if(count > period)
{
if(LedOnFlag)
{
RedLedOff();
GreenLedOn();
SysFlag.LCDFlick = 1;
LedOnFlag = 0;
}
else
{
RedLedOff();
GreenLedOff();
SysFlag.LCDFlick = 0;
LedOnFlag = 1;
}
count = 0;
}
}
void RedGreenLedTwinkle(u16 period)
{
static u16 count = 0;
static u8 GreenLedOnFlag = 0;
static u8 RedLedOnFlag = 0;
static u16 periodCnt = 0;
periodCnt++;
if(periodCnt > period)
{
if(RedLedOnFlag)
{
GreenLedOff();
RedLedOff();
RedLedOnFlag = 0;
}
else
{
count++;
if(count == 3)
{
RedLedOn();
RedLedOnFlag = 1;
count = 0;
}
else
{
GreenLedOn();
RedLedOnFlag = 1;
}
}
periodCnt = 0;
}
}
void alarmLedEvent(void)
{
if(SysData.ALM_EN == ENABLE)
{
if(SysFlag.Alarms)
{
RedLedTwinkle(0);
}
else
{
// RedLedTwinkleOnce(7);
Led_2_On();
}
}
else
{
Led_2_Off();
}
}
//LED控制 500ms调用一次
void LedControl(void)
{
if(VUSB_CHECK)
{
RedLedOff();
if(CHARGE_FULL)
// if(1) //test
{
//充满
GreenLedOn();
// if(!SysFlag.shutdown)
// {
// alarmLedEvent();
// }
}
else
{
//未充满
/*
if((SysData.ALM_EN==ENABLE)&&(SysFlag.Alarms)&&(!SysFlag.shutdown))
{
alarmLedEvent();
}
else
{
GreenLedTwinkle(1);
}
*/
if(SysData.ALM_EN == ENABLE)
{
if(SysFlag.Alarms)
{
// alarmLedEvent();
GreenLedTwinkle_USBCHECK_ON(0);
}
else
{
#ifdef NO_RED_LED
GreenLedTwinkle(0);//debug
#else
RedGreenLedTwinkle(1);
#endif
}
}
else
{
GreenLedTwinkle(0);
}
}
}
else
{
GreenLedOff();
if((SysData.ALM_EN == ENABLE) && (SysFlag.Alarms))
{
alarmLedEvent();
}
else
{
if(SysData.Batt < BattLOW)
{
RedLedOn();
if(SysData.Batt < BattSHUT)
{
Shut_Down();
}
}
else
{
alarmLedEvent();
}
}
}
}
//报警任务
void AlarmClockTask(void)
{
if((SysInfo.AlarmClockInfo.hour == Time_Dec.hour)
&& (SysInfo.AlarmClockInfo.minute == Time_Dec.minute)
&& (SysInfo.AlarmClockInfo.second == Time_Dec.second)
&& (SysInfo.AlarmClockInfo.enabled))
{
if(!SysInfo.AlarmClockOk)
{
SysInfo.AlarmClockOk = 1;
SysFlag.ClockSoundEn = 1;
}
}
}
void AlarmClockControl(void)
{
static unsigned char second = 0;
static unsigned char AlarmClocksecond = 0;
static unsigned char AlarmClockcvt = 0;
if(SysInfo.AlarmClockOk)
{
if(second != Time_Dec.second)
{
AlarmClocksecond++;
second = Time_Dec.second;
}
if(AlarmClocksecond < 30)
{
SysFlag.ClockSoundEn = 1;
}
else
{
SysFlag.ClockSoundEn = 0;
if(AlarmClocksecond > 35)
{
AlarmClocksecond = 0;
AlarmClockcvt++;
if(AlarmClockcvt > 2)
{
SysInfo.AlarmClockOk = 0;
SysFlag.ClockSoundEn = 0;
}
}
}
}
else
{
second = 0;
AlarmClocksecond = 0;
AlarmClockcvt = 0;
SysFlag.ClockSoundEn = 0;
}
}
void ResetAlarmClockTime(void)
{
if((SysInfo.AlarmClockInfo.hour > 23) ||
(SysInfo.AlarmClockInfo.minute > 59) ||
(SysInfo.AlarmClockInfo.second > 59))
{
SysInfo.AlarmClockInfo.hour = Time_Dec.hour;
SysInfo.AlarmClockInfo.minute = Time_Dec.minute;
SysInfo.AlarmClockInfo.second = 0;
}
}
int main(void)
{
uint8_t ret = 0;
uint8_t keyUpFlag = 0;
Init_Pro();
Init_Var();
LED_Red_OFF;
LED_Green_OFF;
ResetAlarmClockTime();
while (1)
{
if(!SysFlag.shutdown)
{
if(SysFlag.UsbCmdLen)
{
USB_Decode();
SysFlag.UsbCmdLen = 0;
USB_Pro();
}
if(SysClock)
{
SysClock = 0;
Key_Pro();
AlarmSettingTaskPro();
}
if(Clock_150 > 2)
{
Clock_150 = 0;
humitureTaskPro();
AlarmClockTask();
Data_Pro();
Disp_Set();
AlarmClockControl();
if(Clock_750 > 14)
{
Clock_750 = 0;
if(((SysFlag.UpOver==1)||(SysFlag.ClockSoundEn))&&(Turn_On_Wait>=5))//开机等待一段时间再报警
{
switch(SysInfo.AlmPara.Struct_Para.Alm_Type)
{
case 1:
bi(2);
break;
case 2:
bi(3);
break;
case 3:
bi(4);
break;
}
}
if((SysData.Sys_State==SET_STATE)&&(SysData.Set_State==SET_ALM_Type)&&(SysFlag.FlickEn))
{
switch(SysData.SET_Value)
{
case 1:
bi(2);
break;
case 2:
bi(3);
break;
case 3:
bi(4);
break;
}
}
}
}
else
{
if(VUSB_CHECK)
{
Disp_Clear();
ClearTimeDisplay();
// ClearTempDisplay();
}
else
{
Shut_Down();
}
}
if(Clock_500 > 9)
{
Clock_500 = 0;
if(!SysFlag.shutdown)
{
if(SysFlag.PWD == 1)
{
SysFlag.PWDErr++;
//隔了1s还是处于低电 未关机状态 认为判断失败
//重新归零 恢复正常
if(SysFlag.PWDErr > 1)
{
SysFlag.PWDErr = 0;
SysFlag.PWD = 0;
}
}
LCD_Disp();
Clock_500_Pro();
}
else
{
//如果充电的情况下关机,在按电源键正常开机
if(GPIO_ReadInputDataBit(KEy[Num_Power].KeyPort, KEy[Num_Power].KeyPin) == 0)
{
KEy[Num_Power].KeyAge++;
if(KEy[Num_Power].KeyAge > 0)
{
if(keyUpFlag)
{
SysFlag.shutdown = 0;
KEy[Num_Power].KeyAge = 0;
keyUpFlag = 0;
SysData.Sys_State = MAIN_STATE;
SysFlag.First_Press = 1;
Disp_All();
Delayms(500);
}
}
}
else
{
KEy[Num_Power].KeyAge = 0;
keyUpFlag = 1;
}
}
LedControl();
}
}
}
}
void Delayms(u32 Cnt)
{
u32 i, j;
for(j = 0; j < Cnt; j++)
{
for(i = 0; i < 29760; i++);
}
}
void Delayus(u32 Cnt)
{
u32 i, j;
for(j = 0; j < Cnt; j++)
{
for(i = 0; i < 35; i++);
}
}
void Init_Var(void)
{
SysFlag.First_Press = 1;
SysFlag.Mea_OK = 0;
SysData.ALM_EN = ENABLE;
SysData.ADC_CNT = 0;
SysData.Freq_Weight = A_WEIGHT;
SysData.Freq_Resp = FAST_RESP;
SysData.Sys_State = MAIN_STATE;
switch(SysData.Freq_Weight)
{
case A_WEIGHT:
FREQ_WEIGHT_A;
break;
case C_WEIGHT:
FREQ_WEIGHT_C;
break;
}
SysData.DispTEMP_Cnt = 0;
SysData.DispHUMI_Cnt = 0;
SysData.TEMP_Disp = 0;
SysData.ADC_CNT = 0;
SysData.Wait = 0;
SysData.Save_Cnt = 0;
SysFlag.EEPROM_ERR = 0;
Init_Para();
SysData.Alm = SysInfo.AlmPara.Struct_Para.Alm_Value;
SysData.ALM_EN = SysInfo.AlmPara.Struct_Para.Alm_Switch;
SysData.Alm_Type = SysInfo.AlmPara.Struct_Para.Alm_Type;
SysData.Alm_Time = SysInfo.AlmPara.Struct_Para.Alm_Time;
if(SysData.ALM_EN) //yanggj
{
LED_2_ON;
}
else
{
LED_2_OFF;
}
SPI_FLASH_Dec();
if(SysInfo.PWRON_Erase)
{
SysInfo.PWRON_Erase = 0;
Save_Param(&SysInfo.PWRON_Erase, sizeof(SysInfo.PWRON_Erase));
SysData.FlashNum = 1;
SPI_Flash_EraseChip();
if(SysInfo.ChipStart == 0)
SysInfo.ChipStart = 1; //FLASH2为起始
else
SysInfo.ChipStart = 0; //FLASH1为起始
Save_Param(&SysInfo.ChipStart, sizeof(SysInfo.ChipStart));
}
Buzzer_Init();
Buzzer_Setup(0);
SysData.FlashNum = 1;
if(SysInfo.REC_HalfPages > W25X_MAX_PAGE * 2)
{
SysData.FlashNum = 2;
}
Check_REC_Valid();
SysFlag.RecFull = 0;
Clock_150 = 0;
Clock_500 = 0;
SysClock = 0;
SysData.Cal_Mode = 0;
SysFlag.Cal_En = 0;
Delayms(500);
if((SysFlag.EEPROM_ERR) || (SysFlag.SPIFlashErr))
{
Disp_Err();
Delayms(500);
}
//获取温湿度传感器类型
SysFlag.SensorType = ReadHumitureSensorType(0x44);
SysInfo.AlarmClockOk = 0;
}
void LCD_Disp(void)
{
switch(SysData.Sys_State)
{
case MAIN_STATE:
displayTime(Time_Dec.hour, Time_Dec.minute, Time_Dec.second);
Disp_TempHumi();
Disp_Date();
break;
case SET_STATE:
break;
}
RefreshDisplay();
}
void Get_AD_SUM(void)
{
uint64_t Sum[3] = {0, 0, 0};
//这里有3种计算,分别是sum[0],sum[1],sum[2]
u8 Ratio;
u16 loopi, *Data;
u32 Temp;
Data = Noise_Data.Buff1;//将DMA移过来的地址给Data
if(SysData.DMA_Group != 0)
Data = Noise_Data.Buff0;//将DMA移过来的地址给Data
SysData.BattCnt = 0;
//sum[0]
for(loopi = 0; loopi < DMA_CAL_BUFF_SIZE; loopi += 4) //循环480/3=150次
{
Temp = (u32)(*Data); //将Noise_Data.Buff1的值给Temp
Data++;//地址++
if(Temp > ADC_HLimit) SysData.OverCntt[0]++; //如果Temp>2482,数据溢出的标志位++,这个数据溢出的标志位也有3种,用数组来表示
Temp = Temp + (s32)SysInfo.Cal_Adc[0];// 这个应该是存放校准后的ADC
if(Temp > 0x80000000)Temp = 0;
Temp = Temp * Temp; //不知道平方一次是用来干啥的
Sum[0] += (uint64_t)Temp; //计算总和,存到sum[0]
//sum[1]
Temp = (u32)(*Data);
Data++;
if(Temp > ADC_HLimit_H) SysData.OverCntt[1]++;
Temp = Temp + (s32)SysInfo.Cal_Adc[1];
if(Temp > 0x80000000)Temp = 0;
Temp = Temp * Temp;
Sum[1] += (uint64_t)Temp; //计算总和,存到sum[1]
//sum[2]
Temp = (u32)(*Data);
Data++;
Temp = Temp + (s32)SysInfo.Cal_Adc[2];
if(Temp > 0x80000000)
Temp = 0;
Temp = Temp * Temp;
Sum[2] += (uint64_t)Temp; //计算总和,存到sum[2]
if(SysData.BattCnt < 64)
{
SysData.BattBuff[SysData.BattCnt++] = *Data;
}
Data++;
}
SysData.Batt = 0;
for(loopi = 0; loopi < 64; loopi++)
{
SysData.Batt += SysData.BattBuff[loopi];
}
SysData.Batt = SysData.Batt / 64;
//报警时低于3.3V不关机问题,电源检测这里添加关机
if(SysData.Batt < BattSHUT)
{
Shut_Down();
}
//将计算的总和,存到SysData.ADC_VALUE
SysData.ADC_VALUE[0] += (double)Sum[0];
SysData.ADC_VALUE[1] += (double)Sum[1];
SysData.ADC_VALUE[2] += (double)Sum[2];
SysData.ADC_CNT++;
Ratio = SysData.Freq_Resp * 7 + 1; //不知道这2句是干嘛的
if(SysData.ADC_CNT >= (SMP_DMA_CNT * Ratio))
{
SysData.ADC_CNT = 0;
// if(SysData.Cal_Mode == 0)
// {
// if(SysData.OverCntt[0] < MIN_OVER_CNT) //溢出计数判断
// {
// SysData.Adc_Range = RANG_70DB;
// }
// else if(SysData.OverCntt[1] < MIN_OVER_CNT)
// {
// SysData.Adc_Range = RANG_100DB;
// }
// else
// {
// SysData.Adc_Range = RANG_130DB;
// }
// }
SysData.ADC_Sum_Value = (SysData.ADC_VALUE[SysData.Adc_Range] / (float)Ratio) + SysInfo.Cal_Adc_Squ[SysData.Adc_Range];
if(SysData.ADC_Sum_Value < 0)
{
;
}
else
{
// Get_Noise_Data();
}
SysData.ADC_VALUE[0] = 0;
SysData.ADC_VALUE[1] = 0;
SysData.ADC_VALUE[2] = 0;
SysData.OverCntt[0] = 0;
SysData.OverCntt[1] = 0;
SysData.OverCntt[2] = 0;
}
}
//void Get_Noise_Data(void)
//{
// Phasea = SysData.ADC_Sum_Value;
// /*
// 523公式:10*log10(SysData.ADC_Sum_Value) *10 //是为了扩大10倍 用于获取小数部分,来显示
// */
// Phasea = log10(Phasea);
// Phasea = Phasea * 1000;
// Phaseb = (u32)Phasea;
// SysData.CAL_INT_Value = Phaseb + SysInfo.Cal_DB[SysData.Adc_Range];
// SysData.ADC_INT_Value = SysData.CAL_INT_Value / 10;
// if(SysData.Cal_Mode == 0)
// {
// if(SysData.ADC_TAB_CNT == 0)
// {
// SysData.ADC_TAB_CNT = 1;
// SysData.ADC_INT_Value_TAB[1] = SysData.ADC_INT_Value;
// SysData.ADC_INT_Value_TAB[2] = SysData.ADC_INT_Value;
// SysData.ADC_INT_Value_TAB[3] = SysData.ADC_INT_Value;
// }
// else
// {
// SysData.ADC_INT_Value_TAB[3] = SysData.ADC_INT_Value_TAB[2];
// SysData.ADC_INT_Value_TAB[2] = SysData.ADC_INT_Value_TAB[1];
// SysData.ADC_INT_Value_TAB[1] = SysData.ADC_INT_Value_TAB[0];
// }
// SysData.ADC_INT_Value_TAB[0] = SysData.ADC_INT_Value;
// }
// else
// {
// SysData.CalEn = 1;
// if(SysData.Adc_Range == RANG_130DB)
// {
// if(SysData.ADC_INT_Value == 1300)
// {
// SysFlag.FlickEn = 1;
// }
// else
// {
// SysFlag.FlickEn = 0;
// }
// }
// }
//}
void HexToBcd(int32_t Data)
{
if (Data < 0)
{
HexData[0] = 0x0b;
u32 absData = -Data;
if (absData >= 10)
{
HexData[1] = absData / 10 % 10;
HexData[2] = absData % 10;
}
else
{
HexData[1] = 0x0a;
HexData[2] = absData;
}
}
else
{
HexData[0] = Data / 100 % 10;
HexData[1] = Data / 10 % 10;
HexData[2] = Data % 10;
}
}
void Copy_Data(u8 *Src, u8 *Des, u8 Num)
{
u8 loopi;
u8 *S = Src, *D = Des;
for(loopi = 0; loopi < Num; loopi++)
{
*D = *S;
D ++;
S ++;
}
}
void Fill_Data(void)
{
Copy_Data(HexData, MainData, 3);//这里改为3进入设置模式只有前三位显示
}
u32 MAX(u32 *src, u8 Num)
{
u8 loopi;
u32 MaxValue;
MaxValue = 0;
for(loopi = 0; loopi < Num; loopi++)
{
if(MaxValue < (*src))
{
MaxValue = *src;
}
src++;
}
return MaxValue;
}
u16 MAX_HalfWorld(u16 *src, u8 Num)
{
u8 loopi;
u16 MaxValue;
MaxValue = 0;
for(loopi = 0; loopi < Num; loopi++)
{
if(MaxValue < (*src))
{
MaxValue = *src;
}
src++;
}
return MaxValue;
}
void Get_DispData(void)
{
static u8 AlarmClockOver = 0;
if(SysData.Sys_State == SET_STATE)
return;//设置时不存储
//校准模式直接送显
if(SysData.Cal_Mode)
{
SysData.TEMP_Disp = SysData.ADC_INT_Value;
return;
}
//获取一次结果
if(SysData.Freq_Resp == FAST_RESP)
{
//450ms获取一次数据送显示
SysData.TEMP_Disp = MAX(SysData.ADC_INT_Value_TAB, 4); //求最大
}
else
{
//1s获取一次
SysData.DispTEMP_Cnt = 0;
SysData.TEMP_Disp = SysData.ADC_INT_Value_TAB[0];
}
if(SysFlag.UpOver == 0)
{
if(SysData.Wait > 0) //这是测量时间
{
SysData.Wait--;
if(!SysInfo.AlarmClockOk)
{
SysData.TEMP_Disp = SysData.Disp_ALM;
}
}
else if((SysData.TEMP_Disp > SysData.Alm) && (SysData.ALM_EN == ENABLE))
{
SysData.Disp_ALM = SysData.TEMP_Disp;
SysInfo.AlarmClockOk = 0;
SysFlag.UpOver = 1;
SysFlag.Alarms = 1;
}
else
{
ALM_OUT_EN(DISABLE);
SysFlag.Alarms = 0;
}
}
else
{
//报警显示
SysData.TEMP_Disp = SysData.Disp_ALM;
}
//每两秒存储一次
if(SysData.MaxTEMP_Save < SysData.TEMP_Disp)
{
SysData.MaxTEMP_Save = SysData.TEMP_Disp;
}
}
void Data_Pro(void)
{
Get_DispData();
}
void bubble(unsigned int a[], unsigned char n)
{
unsigned char i, j;
unsigned int k;
for(i = 1; i < n; i++)
for(j = 0; j < n - i; j++)
if(a[j] > a[j + 1])
{
k = a[j];
a[j] = a[j + 1];
a[j + 1] = k;
}
}
void bubble_float( float a[], unsigned char n)
{
unsigned char i, j;
float k;
for(i = 1; i < n; i++)
for(j = 0; j < n - i; j++)
if(a[j] > a[j + 1])
{
k = a[j];
a[j] = a[j + 1];
a[j + 1] = k;
}
}
void Cal_Pro(void)//校准
{
// u32 Limit, Tmp;
// Limit = CAL_DB[SysData.Cal_DB_Point]; //这个是校准点,有4000,7000,10000
// if(SysData.CAL_INT_Value == Limit) //如果 SysData.CAL_INT_Value==4000/7000/10000
// {
// SysFlag.Cal_Finish = 1; //校准完成标志=1
// SysData.CalEn = 0;
// if(SysFlag.Cal_DB_Finish == 0)
// {
// //这里要采集下一通道的差值
// switch(SysData.Cal_DB_Point)//通过按键,会对SysData.Cal_DB_Point++,从而来判断当前校准哪个点
// {
// case POINT_100DB:
// SysData.Adc_Range = RANG_100DB; //将这个范围给到SysData.Adc_Range
// Delayms(300);
// break;
// case POINT_70DB:
// SysData.Adc_Range = RANG_70DB;
// Delayms(300);
// break;
// case POINT_40DB:
// Para_Save();
// Delayms(300);
// Shut_Down();
// break;
// }
// SysFlag.Cal_DB_Finish = 1;
// }
// }
// if((SysData.CalEn) && (SysFlag.Cal_Finish == 0))
// {
// SysFlag.FlickEn = 0;
// SysData.CalEn = 0;
// if(SysData.CAL_INT_Value > Limit)
// {
// Tmp = SysData.CAL_INT_Value - Limit;
// if(Tmp < 10)
// {
// SysData.Cal_Step = 2;
// }
// switch(SysData.Cal_Step)
// {
// case 0:
// SysData.Cal_Step = 1;
// SysInfo.Cal_Adc[SysData.Adc_Range]--;
// break;
// case 1:
// SysInfo.Cal_Adc[SysData.Adc_Range]--;
// break;
// case 2:
// case 3:
// SysData.Cal_Step = 2;
// SysInfo.Cal_Adc_Squ[SysData.Adc_Range] -= 20000;
// break;
// }
// }
// if(SysData.CAL_INT_Value < Limit)
// {
// Tmp = Limit - SysData.CAL_INT_Value ;
// if(Tmp < 10)
// {
// SysData.Cal_Step = 2;
// }
// switch(SysData.Cal_Step)
// {
// case 0:
// SysData.Cal_Step = 3;
// SysInfo.Cal_Adc[SysData.Adc_Range]++;
// break;
// case 3:
// SysInfo.Cal_Adc[SysData.Adc_Range]++;
// break;
// case 1:
// case 2:
// SysData.Cal_Step = 2;
// SysInfo.Cal_Adc_Squ[SysData.Adc_Range] += 40000;
// break;
// }
// }
// }
// if((SysFlag.Cal_DB_Finish) && (SysData.CalEn) && (SysFlag.FlickEn == 0))
// {
// SysData.CalEn = 0;
// SysData.ADC_INT_Value_TAB[SysData.ADC_TAB_CNT] = SysData.CAL_INT_Value;
// SysData.ADC_TAB_CNT++;
// if(SysData.ADC_TAB_CNT >= MAX_CAL_NUM)
// {
// SysData.ADC_TAB_CNT = 0;
// bubble(SysData.ADC_INT_Value_TAB, MAX_CAL_NUM);
// Tmp = SysData.ADC_INT_Value_TAB[MAX_CAL_NUM / 2];
// SysInfo.Cal_DB[SysData.Adc_Range] = CAL_DB[SysData.Cal_DB_Point] - Tmp;
// SysFlag.FlickEn = 1;
// if(SysData.Adc_Range == RANG_70DB)
// {
// Para_Save();
// Disp_All();
// Delayms(1000);
// SysData.Cal_Mode = 0;
// KEy[Num_Alm].KeyProcessed = 1;
// SysData.Freq_Weight = A_WEIGHT;
// SysData.Freq_Resp = FAST_RESP;
// switch(SysData.Freq_Weight)
// {
// case A_WEIGHT:
// FREQ_WEIGHT_A;
// break;
// case C_WEIGHT:
// FREQ_WEIGHT_C;
// break;
// }
// return;
// }
// }
// }
KEy[Num_Alm].KeyProcessed = 0;
}
void Shut_Down(void)
{
// LED_Red_OFF;
// Disp_Clear();
// ClearTimeDisplay();
// POWER_OFF;
// Delayms(200);
// POWER_OFF;
// Delayms(200);
// POWER_OFF;
// Delayms(200);
// while(1)
// {
// ;
// }
}
//时间检查
void Check_Date(void)
{
unsigned char month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(Time_Dec.year > 99) Time_Dec.year = 0;
if(Time_Dec.year < 0) Time_Dec.year = 99;
if(Time_Dec.month < 1) Time_Dec.month = 12;
if(Time_Dec.month > 12) Time_Dec.month = 1;
if(Time_Dec.day < 1) Time_Dec.day = 31;
if(Time_Dec.day > 31) Time_Dec.day = 1;
if(Time_Dec.hour > 23) Time_Dec.hour = 0;
if(Time_Dec.hour < 0) Time_Dec.hour = 23;
if(Time_Dec.minute > 59) Time_Dec.minute = 0;
if(Time_Dec.minute < 0) Time_Dec.minute = 59;
if(Time_Dec.second > 59) Time_Dec.second = 0;
if(Time_Dec.second < 0) Time_Dec.second = 59;
month[2] = 28;
if (Time_Dec.year % 4 == 0 || Time_Dec.year % 100 == 0 || Time_Dec.year % 400 == 0) //???ūìˇ?ū???29?c
month[2] = 29;
if(Time_Dec.day > month[Time_Dec.month]) Time_Dec.day = 1;
Time_Hex.year = (Time_Dec.year / 10) << 4 | (Time_Dec.year % 10);
Time_Hex.month = (Time_Dec.month / 10) << 4 | (Time_Dec.month % 10);
Time_Hex.day = (Time_Dec.day / 10) << 4 | (Time_Dec.day % 10);
Time_Hex.hour = (Time_Dec.hour / 10) << 4 | (Time_Dec.hour % 10);
Time_Hex.minute = (Time_Dec.minute / 10) << 4 | (Time_Dec.minute % 10);
Time_Hex.second = (Time_Dec.second / 10) << 4 | (Time_Dec.second % 10);
}
void Clock_500_Pro(void)
{
if(!SysFlag.UpOver)
{
SysFlag.LCDFlick = !SysFlag.LCDFlick;
}
if((SysData.Sys_State == SET_STATE) && (SysData.Set_State == SET_ALM) && (SysData.Set_State == SET_ALM2))
{
}
Get_Time();
if(Turn_On_Wait < 5)
{
Turn_On_Wait++;
}
if(SysData.Sys_State == SET_STATE)return;
if((SysFlag.UpOver == 1) && (Turn_On_Wait >= 5)) //开机等待一段时间再报警
{
if(((SysData.Wait == 0) && (SysFlag.BiBiBi == 0)) || (SysInfo.AlarmClockOk))
{
ALM_OUT_EN(ENABLE);
SysFlag.BiBiBi = 1;
SysData.Wait = SysData.Alm_Time * 2;
}
else
{
if(SysData.Wait)
{
SysData.Wait--;
}
}
}
Save_Data();
}
void Check_Set(void)
{
unsigned char month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
switch(SysData.Set_State)
{
case SET_ALM:
if(SysData.SET_Value > MAX_ALM_TEMP) SysData.SET_Value = MAX_ALM_TEMP;//55
if(SysData.SET_Value < MIN_ALM_TEMP) SysData.SET_Value = MIN_ALM_TEMP;//-10
break;
case SET_ALM2:
if(SysData.SET_Value > MAX_ALM_HUMI) SysData.SET_Value = MAX_ALM_HUMI;
if(SysData.SET_Value < 0) SysData.SET_Value = 0;
break;
case SET_ALM_TIME:
if(SysData.SET_Value > MAX_ALM_TIME) SysData.SET_Value = MAX_ALM_TIME;
if(SysData.SET_Value < MIN_ALM_TIME) SysData.SET_Value = MIN_ALM_TIME;
break;
case SET_ALM_Type:
if(SysData.SET_Value > MAX_ALM_Type) SysData.SET_Value = MAX_ALM_Type;
if(SysData.SET_Value < MIN_ALM_Type) SysData.SET_Value = MIN_ALM_Type;
break;
case SET_YEAR:
if(SysData.SET_Value > 99) SysData.SET_Value = 0;
if(SysData.SET_Value < 0) SysData.SET_Value = 99;
break;
case SET_MONTH:
if(SysData.SET_Value < 1) SysData.SET_Value = 12;
if(SysData.SET_Value > 12) SysData.SET_Value = 1;
break;
case SET_DAY:
month[2] = 28;
if ((Time_Set.year % 4 == 0 && Time_Set.year % 100 != 0) || (Time_Set.year % 400 == 0) )
month[2] = 29;
if(SysData.SET_Value > month[Time_Set.month]) SysData.SET_Value = 1;
if(SysData.SET_Value < 1) SysData.SET_Value = month[Time_Dec.month];
break;
case SET_ALM_CLOCK_HOUR:
case SET_HOUR:
if(SysData.SET_Value > 23) SysData.SET_Value = 0;
if(SysData.SET_Value < 0) SysData.SET_Value = 23;
break;
case SET_ALM_CLOCK_MINUTE:
case SET_MINUTE:
if(SysData.SET_Value > 59)SysData.SET_Value = 0;
if(SysData.SET_Value < 0) SysData.SET_Value = 59;
break;
case SET_SECOND:
if(SysData.SET_Value > 59) SysData.SET_Value = 0;
if(SysData.SET_Value < 0) SysData.SET_Value = 59;
break;
case SET_ALM_CLOCK_EN:
break;
}
}
u32 HacedSendRec;
void USB_Correspondence(void) //USB通信部份
{
u16 Max_Sector = 23; //一天24个扇区
u16 Max_Read;
u32 Read_Num;
u8 *usb_p, Max_SendNum = 64, loopi;
HacedSendRec = 0;
//读取记录,把记录发送到PC
if(SysFlag.GetRec == 1)
{
SysFlag.GetRec = 0;
USB_Busy = 1;
while(Max_Sector)
{
Max_SendNum = 64;
Max_Read = 32; //一个扇区32组记录
Read_Num = SysData.Start_Rec ;
SysData.Start_Rec += 32;
usb_p = SPI_Rec_BUFF;
if(SysData.Start_Rec > SysData.End_Rec)
{
Max_Read = (SysData.End_Rec - (SysData.Start_Rec - 32) + 1);
Max_SendNum = Max_Read * 2;
Max_Sector = 0;//下一步跳出while
}
while(Max_Read--)//读完32组
{
SPI_Flash_ReadHalfPage(usb_p, Read_Num - 1);
Read_Num++;
usb_p += 128;
}
usb_p = SPI_Rec_BUFF;
//一次把一个扇区 发送完
while(Max_SendNum--)
{
//发送64组数据
USBD_HID_SendReport(&USB_Device_dev, usb_p, MY_DEF_PACKET);
usb_p += 64;
HacedSendRec++;
}
}
for(loopi = 0; loopi < 64; loopi++)SPI_Rec_BUFF[loopi] = 0xff;
USBD_HID_SendReport(&USB_Device_dev, SPI_Rec_BUFF, MY_DEF_PACKET);
USB_Busy = 0;
Delayms(1500);
}
else if (SysFlag.GetDate == 1) //193
{
SysFlag.GetDate = 0;
USB_Busy = 1;
Max_Sector = 193;
SysData.Start_Rec = 1;
usb_p = SPI_Rec_BUFF;
while(Max_Sector--)
{
Max_SendNum = 64;
Max_Read = 1365;
Read_Num = SysData.Start_Rec;
SysData.Start_Rec += 1365;
if(SysData.Start_Rec > SysInfo.REC_HalfPages)
{
Max_Read = SysInfo.REC_HalfPages - (SysData.Start_Rec - 1365) + 1;
Max_SendNum = (Max_Read * 3 - 1) / 64 + 1;
Max_Sector = 0;//下一步跳出while
}
//1365
while(Max_Read--)
{
SPI_Flash_ReadDate(usb_p, Read_Num - 1);
Read_Num++;
usb_p += 3;
}
usb_p = SPI_Rec_BUFF;
while(Max_SendNum--)
{
USBD_HID_SendReport(&USB_Device_dev, usb_p, MY_DEF_PACKET);
usb_p += 64;
}
usb_p = SPI_Rec_BUFF;
}
while(SysData.Start_Rec <= SysInfo.REC_HalfPages)
{
SPI_Flash_ReadDate((u8 *)&SPI_Rec_BUFF, SysData.Start_Rec - 1);
SysData.Start_Rec++;
USBD_HID_SendReport(&USB_Device_dev, usb_p, 3);
}
for(loopi = 0; loopi < 64; loopi++)SPI_Rec_BUFF[loopi] = 0xff;
USBD_HID_SendReport(&USB_Device_dev, SPI_Rec_BUFF, MY_DEF_PACKET);//选择日期框
USB_Busy = 0;
Delayms(1500);
}
}
void USB_Pro(void)
{
USB_Correspondence();
}
void Save_Rec(void)
{
SysInfo.REC_HalfPages++;
if(SysInfo.REC_HalfPages > MAX_REC_Pages)
{
//擦除前半个芯片
SysData.FlashNum = 1;
SysFlag.EraseDoing = 1;
SPI_Flash_EraseChip();
SysFlag.EraseDoing = 0;
if(SysFlag.PWD)
{
SysInfo.PWRON_Erase = 1;
Save_Param(&SysInfo.PWRON_Erase, sizeof(SysInfo.PWRON_Erase));
return;
}
if(SysInfo.ChipStart == 0)
SysInfo.ChipStart = 1; //FLASH2为起始
else
SysInfo.ChipStart = 0; //FLASH1为起始
Save_Param(&SysInfo.ChipStart, sizeof(SysInfo.ChipStart));
SysInfo.REC_HalfPages = MAX_PAGE + 1;
}
//一定要先保存页数,这样在写的时候断电,下次开机会自动跳到新的一页写,不会去覆盖未写完的那一页
Save_Param(&SysInfo.REC_HalfPages, sizeof(SysInfo.REC_HalfPages));
SPI_Flash_WriteHalfPage((u8 *)&Storage.Header, SysInfo.REC_HalfPages - 1);
}
void Check_Time(void)
{
if((Time_Bak.second == 59) && (Time_Dec.second == 0))
{
if(Time_Bak.minute == Time_Dec.minute)
{
Get_Time();
return;
}
else if((Time_Bak.minute == 59) && (Time_Dec.minute == 0))
{
if(Time_Bak.hour == Time_Dec.hour)
{
Get_Time();
return;
}
}
}
}
void Save_Data(void)
{
Get_Time();
if(Time_Bak.second != Time_Dec.second)
{
Check_Time();
Time_Bak.year = Time_Dec.year ;
Time_Bak.month = Time_Dec.month;
Time_Bak.day = Time_Dec.day ;
Time_Bak.hour = Time_Dec.hour ;
Time_Bak.minute = Time_Dec.minute ;
Time_Bak.second = Time_Dec.second ;
SysData.SaveTime2s++;
}
else
return;
if(SysData.SaveTime2s < 2)
{
return;
}
SysData.SaveTime2s = 0;
Storage.Result[SysData.Save_Cnt] = SysData.MaxTEMP_Save;
SysData.MaxTEMP_Save = 0;
if(SysData.Save_Cnt == 0)
{
//先获取时间
Storage.Header = 0XFD;
Storage.Machine_State = 0;
if(SysData.Freq_Weight == C_WEIGHT)
{
Storage.Machine_State |= 0X10;
}
if(SysData.Freq_Resp == FAST_RESP)
{
Storage.Machine_State |= 0X40;
}
Storage.Year = Time_Hex.year;
Storage.Month = Time_Hex.month;
Storage.Day = Time_Hex.day;
Storage.Hour = Time_Hex.hour;
Storage.Minute = Time_Hex.minute;
Storage.Second = Time_Hex.second;
}
SysData.Save_Cnt++;
if(SysData.Save_Cnt >= 60)
{
SysData.Save_Cnt = 0;
if(SysFlag.PWD == 0)
{
Save_Rec();
}
}
}
void USB_Decode(void)
{
uint8_t test_x1 = 0;
uint8_t Buff_Test1[64];
switch(Report_buf[0])
{
case 0xb4:
SysFlag.GetDate = 1;
break;
case 0xA3: //读时间
Get_Time();
Send_Buffer[5] = Time_Hex.second;
Send_Buffer[4] = Time_Hex.minute;
Send_Buffer[3] = Time_Hex.hour;
Send_Buffer[2] = Time_Hex.day;
Send_Buffer[1] = Time_Hex.month;
Send_Buffer[0] = Time_Hex.year;
USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET);
break;
case 0xb3:
Send_Buffer[0] = SysData.TEMP_Disp >> 8;
Send_Buffer[1] = SysData.TEMP_Disp & 0x00ff;
Send_Buffer[2] = 0;//这部分应改为温度
Send_Buffer[3] = SysData.HUMI_Disp >> 8;
Send_Buffer[4] = SysData.HUMI_Disp & 0x00ff;
Send_Buffer[5] = 0;//添加这部分为湿度
if(SysData.Freq_Resp == FAST_RESP)
{
Send_Buffer[2] |= 0x40;
}
Send_Buffer[2] |= 0x00;//默认范围30-130
Send_Buffer[3] = 0;
USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET);
break;
case 0xb5://点击导入弹出的选项
Send_Buffer[0] = 0xfe;
if(SysInfo.REC_HalfPages)
{
Send_Buffer[0] = 0xef;
Send_Buffer[1] = SysInfo.REC_HalfPages >> 24;
Send_Buffer[2] = (SysInfo.REC_HalfPages >> 16) & 0xff;
Send_Buffer[3] = (SysInfo.REC_HalfPages >> 8) & 0xff;
Send_Buffer[4] = SysInfo.REC_HalfPages & 0xff;
}
USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET);
break;
case 0xc4: //导入记录就等于0xc4
SysFlag.GetRec = 1;
SysData.Start_Rec = (Report_buf[1] << 24) | (Report_buf[2] << 16) | (Report_buf[3] << 8 ) | Report_buf[4];
SysData.End_Rec = (Report_buf[5] << 24) | (Report_buf[6] << 16) | (Report_buf[7] << 8 ) | Report_buf[8];
if((SysData.End_Rec - SysData.Start_Rec) >= 720)
{
SysData.End_Rec = SysData.Start_Rec + 720 - 1;
}
Delayms(500);
break;
case 0x7c:
Time_Hex.second = Report_buf[1];
Time_Hex.minute = Report_buf[2];
Time_Hex.hour = Report_buf[3];
Time_Hex.day = Report_buf[4];
Time_Hex.month = Report_buf[5];
Time_Hex.year = Report_buf[6];
Save_TimeDate();
break;
case 0x56:
break;
}
}
void USBD_HID_SendReport (u8 *NoUse, u8 *Buff, u8 Num)
{
u32 loopi = 0;
PrevXferComplete = 0;
USB_SilWrite(EP1_IN, Buff, Num);
_SetEPTxStatus(ENDP1, EP_TX_VALID);
while(PrevXferComplete != 1 && loopi < 100) //10ms超时等待
{
loopi++;
Delayus(100);
}
}
现在要做的是把原来有关噪音的部分替换成温湿度的,还有usb部分