#include "spi.h"
#include "SX1262.h"
#include "uart.h"
#include "Delay.h"
#include "eeprom.h"
#include "include.h"
#include "timer.h"
u8 xdata SPIBuf[50]={'0'};
u8 xdata SPIReadBuf[50]={'0'};
u8 xdata testdata[10]={"send_test\n"};
u32 xdata RTC=12345;//时间戳
u16 xdata Rbody=1000;//人体阻值kΩ
u16 xdata mVbat=4100;//电池电压 mV
u16 xdata VbatCHGMax=3000;//充电时,记录最大电池电压mV
u8 xdata saveCnt=0;//已经存了几条数据
u8 xdata readCnt=0;//已经读了几条数据
u8 xdata chargeFlg=0;// 1:充电
u8 xdata rxOkFlg=0;// 1:串口接收到ACK
u8 xdata RTC_Flg=0;//时间更新成功标志,1:已更新,0:未更新
u8 xdata lastChargeFlg;//上次充电状态
u8 xdata chargeSendDataFlg = 1;//充电状态判断是否需要发送数据标志,初始化为1,需要发送
u8 xdata RbodySendDataFlg = 1;//帽子状态判断是否需要发送数据标志,初始化为1,需要发送
u8 xdata chargeUpdataFlg = 1;
u8 xdata chargeLevel;//0:<3300mV 1:<3700mV 2:<3850mV 3:<4030mV 4:>=4030mV
u8 xdata lastChargeLevel;
u8 xdata SN[SN_LEN+1]="\0";//="SN000001";
u8 xdata checkAck[14]="\0";//"[SN000001,ACK]"
u8 xdata checkTime[15]="\0";//"[SN000001,TIME:"
/********************* INT0中断函数 *************************/
void Ext_INT0 (void) interrupt INT0_VECTOR //进中断时已经清除标志
{
}
void Timer_WakeUp_init()//定时唤醒
{
WKTCL=0xFF;//0x7FF=2047->1s,0x27FF=10239->5s
WKTCH=0x0F|0x80;//设置2s定时唤醒,启用掉电唤醒定时器,当mcu进入睡眠,唤醒定时器就会开始计数
}
void INT0_init(void)
{
IT0=0;//使能ITN0上升沿和下降沿中断
EX0=1;//使能ITN0中断
EA=1;//使能总中断
}
void Rola_sleep()
{
Set_RF_sleep_mode();
SPI_write_byte(SetSleep,0x04); //睡眠唤醒热启动warm start,RTC超时关闭,只允许NSS下降沿唤醒LLCC68
Delayms(1);//需要延时500us
}
void Rola_wakeup()
{
NSS=1;
Delayms(1);
NSS=0;
}
void MCU_sleep()
{
UartSendStr("MCU_sleep");
Rola_sleep();
PCON |= 2; /* MCU 进入 睡眠 模式 */
}
void ADC_init()//STC8H1K08系列ADC是10位的
{
P1M0&=0xFE;//设置P1.0为ADC口
P1M1|=0x01;
P1M0&=0xFD;//设置P1.1为ADC口
P1M1|=0x02;
P_SW2|=0x80;
ADCTIM=0x3f;//设置ADC内部时序
P_SW2&=0x7f;
ADCCFG=0x2f;//结果右对齐,设置ADC时钟为系统时钟2/16
ADC_CONTR=0x80;//使能ADC模块
}
u16 ADC_Read(u8 channel)//channel = 0~15
{
u16 adc;
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;//启动AD转换
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20));//查询ADC完成标志
ADC_CONTR &= ~0x20;//清完成标志
adc = ((u16)ADC_RES << 8) | ADC_RESL;//读取ADC结果
return adc;
}
void chargeStatusDetection()
{
u8 cnt=0,i=0;
if(DEC_5V)// 1充电
{
do
{
Delayms(10);
if(DEC_5V)
{
cnt++;
}
i++;
}while(i<20);
if(cnt == 20)
{
chargeFlg = 1;
}
}
else//0不充电
{
do
{
Delayms(10);
if(!DEC_5V)
{
cnt++;
}
i++;
}while(i<20);
if(cnt == 20)
{
chargeFlg = 0;
}
}
if(lastChargeFlg != chargeFlg)//两次充电状态不一致,则需要发送数据
{
chargeSendDataFlg = 1;
}
else
{
chargeSendDataFlg = 0;
}
lastChargeFlg = chargeFlg;
}
u16 BatmVDetection()
{
u8 i;
u16 val_ch1 = 0,mVbat;
float Vbat;
LP_CTRL=1;//读电池电压前需要置1
Delayms( 10);
ADC_Read(ADC_Vbat_CH1);//第一次不要
for(i=0;i<4;i++)
{
val_ch1 += ADC_Read(ADC_Vbat_CH1);
}
val_ch1 = val_ch1>>2;
Vbat = (2*3.3*val_ch1/1024);//电池电压
mVbat = Vbat*1000;
LP_CTRL=0;
return mVbat;
}
void RbodyStatusDetection()
{
u16 val_ch0 = 0;
u8 i;
float Vbody;
u8 RbodyStatus = 0;
static u8 LastRbodyStatus = 1;
LP_CTRL=1;//读电阻前需要置1
ADC_Read(ADC_Rbody_CH0);//第一次不要
for(i=0;i<4;i++)
{
val_ch0 += ADC_Read(ADC_Rbody_CH0);//电阻采集
}
val_ch0 = val_ch0>>2;
Vbody = 3.3*val_ch0/1024;
Rbody = (3300-2000*Vbody)/Vbody;////(3.3*10-20*V)/V电阻采集
if(Rbody>=32767)
{
Rbody = 32767;
RbodyStatus = 1;
}
else
{
RbodyStatus = 0;
}
if(LastRbodyStatus != RbodyStatus)
{
RbodySendDataFlg = 1;
}
else
{
RbodySendDataFlg = 0;
}
LastRbodyStatus = RbodyStatus;
LP_CTRL=0;//读电阻前需要置1
}
void chargeUpdataDetection()
{
if(!DEC_5V)// 0非充电
{
chargeUpdataFlg = 0;
VbatCHGMax = mVbat;//不充电时要重新给VbatCHGMax赋值
return;
}
else
{
if(mVbat > VbatCHGMax)
{
VbatCHGMax = mVbat;//充电时取最大值判断,防止在临界点跳来跳去
}
if(VbatCHGMax < 3300)
{
chargeLevel=0;
}
else if(VbatCHGMax < 3700)
{
chargeLevel=1;
}
else if(VbatCHGMax < 3850)
{
chargeLevel=2;
}
else if(VbatCHGMax < 4030)
{
chargeLevel=3;
}
else
{
chargeLevel=4;
}
}
if(lastChargeLevel != chargeLevel)//电量等级发生变化时上报1次数据
{
chargeUpdataFlg = 1;
}
else
{
chargeUpdataFlg = 0;
}
lastChargeLevel = chargeLevel;
}
void main()
{
u8 xdata report[40];
u8 xdata SaveReport[9];//4bytes RTC,2bytes mVbat,2bytes Rbody,1byte CHGflag
// u8 xdata tempstr[20];
u32 sendCnt=1000;
u8 sendLen;
u8 i;
// u32 delayTimeOut;
// int temp;
u8 reSendnt;//重发次数
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
UartInit();
ADC_init();
INT0_init();
Timer0_config();
Delays(3);
UartSendStr("设备就绪\r\n");
SX1262_Reset();
LoRaSetting1.Frequency=FREQ;
LoRaSetting1.SpreadFactor=SF7;//扩散因子
LoRaSetting1.Bandwidth=LORA_BW_500;
LoRaSetting1.Coderate=LORA_CR_4_5;//编码率
LoRaSetting1.LowDatarateOptimize=LDRO_OFF;//低数据速率优化
LoRaSetting1.PreambleLen=8;//前导码长度
LoRaSetting1.HeaderType=Variable_length_packet;//标题类型
LoRaSetting1.PayloadLen=10;//有效载荷
LoRaSetting1.PacketCrc=CRC_ON;
LoRaSetting1.IqInverted=Standard_IQ_setup;//倒转
SX1262_Init(LoRaSetting1);//设置为发送模式
SX126xReadRegister(0x0740,2,SPIBuf);//读取公网、专网状态,默认专网
SX1262RX_init(0xfffffff); //0XFFFFFFFF 0x0000000
RD:
UartSendStr("spi read/write test start\r\n");
//本段用来验证客户是否调通了与LoRa芯片的通讯,必须通过才可以进行下一步。
SX126xReadRegister(0x0740,2,SPIBuf);//读取公网、专网状态,默认专网
if(SPIBuf[0]==0x14)
{
UartSendStr("spi read/write test passed\r\n");
}
else
{
UartSendStr("please check spi connect or your software.\r\n");
Delayms(50);
goto RD;
}
//readSN
EEPROM_read_n(EEPROM_ADDR_SN,SN,SN_LEN);//读EEPROM里的SN
EEPROM_read_n(EEPROM_ADDR_CNT,&saveCnt,1);
EEPROM_read_n(EEPROM_ADDR_CNT+1,&readCnt,1);
UartSendStr(my_itoa(saveCnt));
UartSendStr(my_itoa(readCnt));
if(saveCnt==0xFF && readCnt == 0xFF)//说明还没写过数据,把数据记录写0
{
saveCnt=0;
readCnt=0;
EEPROM_write_n(EEPROM_ADDR_CNT,&saveCnt,1);
EEPROM_write_n(EEPROM_ADDR_CNT+1,&readCnt,1);
}
//
checkAck[0]='\0';
strcat(checkAck,"[");
strcat(checkAck,SN);//SN
strcat(checkAck,",ACK]");//[SN000002,ACK]
//UartSendStr(checkAck);
checkTime[0]='\0';
strcat(checkTime,"[");
strcat(checkTime,SN);//SN
strcat(checkTime,",TIME:");//[SN000001,TIME:
//UartSendStr(checkTime);
GET_RTC:
report[0]='\0';
strcat(report,"[");
strcat(report,SN);//SN
strcat(report,",GET_TIME]");//[SN000001,GET_TIME]
sendLen = strlen(report);
SX1262_send(0x00,report,sendLen);//rola 发送获取时间戳
UartSendStr(report);//串口打印
UartSendStr("\r\n");
SX1262_Receive();
while(1) //Uart_Analysis();
{
//发送
// sendCnt++;
// sendLen = strlen(my_itoa(sendCnt));
// SX1262_send(0x00,my_itoa(sendCnt),sendLen);
chargeStatusDetection();//充电检测
mVbat = BatmVDetection(); //电池电压检测
Delayms( 10);
RbodyStatusDetection();//人体电阻检测
chargeUpdataDetection();//充电电量更新检测
//if((chargeSendDataFlg == 1) ||(RbodySendDataFlg == 1) ||(chargeUpdataFlg == 1))
{
if(RTC_Flg==0)
goto GET_RTC;//时间未更新,则需要先更新时间
report[0]='\0';
strcat(rep
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录





































































































共 180 条
- 1
- 2





















格式:pdf 资源大小:2.3MB 页数:107









ljc995144745
- 粉丝: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基础与垫层(土建计算).pptx
- KDIGO临床指南-IgA肾病的治疗.ppt
- 涵洞总体评定表.doc
- 安全检查整改报告附简单.doc
- EPC条件下承包商合同管理研究.doc
- 污水厂中的搅拌器p.ppt
- 水利工程概算讲义.ppt
- 洗衣房营业性餐厅厨房给排水设计.pps
- [郑州]快速通道BT项目桩基标准化施工工艺.ppt
- 企业内部装配式建设项目实施流程概念讲义.pdf
- BS架构考勤管理系统解决方案.pdf
- 房地产投资风险研究与分析.doc
- 项目工程中的协同管理(经典总结).doc
- 520网络情人节简短祝福语大全.docx
- 房屋建筑工程主体结构中间验收监理小结.doc
- 空调通风定额应用计算规则.ppt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0