#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();
}
}
}
|