#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "exti.h"
#include "ex_out.h"
#include "ex_in.h"
#include "W5500.h"
#include "net.h"
#include "value.h"
#include "fu_dhcp.h"
#include "flash.h"
#include "dht12.h"
/********************************************************************/
/* 本程序仅供学习参考,未经作者允许,不得用于任何商业用途 */
/* 本程序为Fuhome互联网远程控制终端静系列专用程序 */
/* 适用于硬件平台 采用W5500+STM32F103C8T6 64K+20K */ */
/* 单片机相关配置,I/O口定义,定时器,串口,中断等初始化函数 */
/* 本程序用于硬件设备接入fuhome.net 平台进行远程控制(手机APP/微信/WEB */
/* 版本:v1.2 2016年6月30日 */
/* 龙剑奋斗 */
/* 定期更新,敬请关注——开放,交流,深入,进步 */
/* Copyright 未来之家 实验室,让科技融入生活 */
/********************************************************************/
int main(void)
{
U8 i=0;
U8 Data_Have=0;//0 没有数据 1有数据,第一次运行时写入固定数据
SystemInit(); //系统时钟初始化为72M SYSCLK_FREQ_72MHz
delay_init(72); //延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
Uart_Init(9600); //波特率 9600
//KEY_Init(); //IO初始化
//EXTIX_Init();
Timerx_Init(99,7100);//定时器3延时 10ms
Ex_in_Init();
Ex_out_Init();
DHT12_Init();
//读取工作参数
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)fu_temp,62);
//是否需要写入
if(fu_temp[0]!=0xac||fu_temp[1]!=0xa2)
{
//第一次需要写入数据了
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)fu_index,62);
//读取工作参数
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)fu_temp,62);
}
//如果不对,那说明单片机有问题,进入死循环
if(fu_temp[0]!=0xAc||fu_temp[1]!=0xA2)
{
while(1)
{
SYS=0;
OUT=1;
IN=1;
delay_ms(200);
SYS=0;
OUT=0;
IN=1;
delay_ms(200);
SYS=0;
OUT=0;
IN=0;
delay_ms(200);
}
}
SYS=0;
OUT=1;
IN=1;
delay_ms(200);
SYS=0;
OUT=0;
IN=1;
delay_ms(200);
SYS=0;
OUT=0;
IN=0;
delay_ms(200);
//是否进入设置
Set_Flag=Key_Scan();
while(Set_Flag)//设置完成必须重启才能
{
SYS=0;
OUT=0;
IN=0;
delay_ms(500);
SYS=1;
OUT=1;
IN=1;
delay_ms(500);
}
//分析工作模式及设置参数
//1/IP模式 0自动获取 1固定IP 2/工作模式 0远控 1透传
Get_IP=fu_temp[2];
Work_Sta=fu_temp[21];
Tihuan();
SPI_Configuration(); //W5500 SPI初始化配置(STM32 SPI1)
W5500_GPIO_Configuration(); //W5500 复位IO配置
W5500_Hardware_Reset(); //硬件复位W5500
Load_All(); //子网掩码和MAC等固定信息
//自动获取IP
if(Get_IP==0x00)
{
//装DHCP网络参数
Load_Auto();
W5500_Init(); //初始化W5500寄存器函数
Socket_Init(0); //指定Socket(0~7)初始化,初始化端口0 端口号
W5500_Socket0_Set();//W5500端口0初始化配置,防止断开连接等让再次连接
SYS=1;
OUT=0;
IN=0;
DHCP();
SYS=1;
OUT=1;
IN=1;//指示已经获取到IP
}
//固定IP
else
{
//装载固定IP参数
Load_Keep();
W5500_Init(); //初始化W5500寄存器函数
Socket_Init(0); //指定Socket(0~7)初始化,初始化端口0 端口号
W5500_Socket0_Set();//W5500端口0初始化配置,防止断开连接等让再次连接
SYS=0;
OUT=1;
IN=0;
delay_ms(500);
SYS=1;
OUT=0;
IN=1;
delay_ms(500);
SYS=1;
OUT=1;
IN=1;
}
//设置本地端口7001
Update_Port();
Heart_Bag();
while (1)
{
//是否进入设置
Set_Flag=Key_Scan();
while(Set_Flag)//设置完成必须重启才能
{
SYS=0;
OUT=0;
IN=0;
delay_ms(500);
SYS=1;
OUT=1;
IN=1;
delay_ms(500);
}
W5500_Socket0_Set();//W5500端口0初始化配置,防止断开连接等让再次连接
W5500_Interrupt_Process();//W5500中断处理程序,用来读取数据
if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到数据
{
S0_Data&=~S_RECEIVE;
Process_UDP();//W5500接收并发送接收到的数据
}
//每30s心跳一次
if( W5500_Send_Delay_Counter%3000==0)
{
SYS=1;//指示灯熄灭,待收到心跳包后服务器正常会亮起
Heart_Bag();
}
if( W5500_Send_Delay_Counter%3500==0)//30s每次发送
{
//传感器包 0温度 1湿度,两次发送至少间隔5s
Feel_bag(0);
}
else if( W5500_Send_Delay_Counter%4000==0)//35s每次发送
{
//传感器包 0温度 1湿度,两次发送至少间隔5s
Feel_bag(1);
}
//每半个租期自动获取一次IP
if(TimerS_Counter==DHCP_Time/2)
{
TimerS_Counter=0;
DHCP();
}
}
}
|