本帖最后由 MDebug 于 2016-11-29 13:08 编辑
今天主要是做下位机程序以及设计思路。
此系统软件主要分为四个部分:参数显示、电能监测、WIFI通信。软件启动之后通过电源模块的处理,给系统MCU供电,然后通过LT135检测相关电能参数,同时将检测参数做相应显示。当发生过载、过压等危险情况时,直接将总继电器断开。整个系统通过WIFI模块与外界建立连接,当连接建立后,通过手机端软件对总继电器和各个分继电器进行相应的控制。 软件系统最大的特点是区分了主从关系,即过载保护作为主要控制,如果串口监测到过载电流,即判断为非正常操作,继电器始终作为断开状态,在手机端的控制始终不予以响应,以避免危险情况的发生。只有当功率保护正常工作时,整个系统的其他部分才能正常工作。当与手机建立通信时,手机端能同时控制总继电器和各个分继电器,以便达到最安全的控制。 软件整体设计思路:
下面是LT135和KEY的代码
- <font face="新宋体">/***********************************华丽的分割线**********************************/
- /*
- 01 03 20 //命令字
- </font> <font face="新宋体">
- 00 36 C8 B3 //电压 / 10000
- 00 02 95 E9 //电流 / 10000
- 00 00 00 00 //有功功率 / 10000
- 00 08 10 74 //有功总电能 / 10000
- 00 00 00 00 //功率因数 / 1000
- 00 06 54 98 //二氧化碳排放量 / 10000
- FE 7E 20 02 //温度(保留)
- 00 00 02 AA //频率 / 100
- A5 50 //CRC校验和
- 37BYTE
- */
- /***********************************华丽的分割线**********************************/
- #include "lt135.h"
- unsigned int Uart1_Rx=0;
- u8 OD[8]={0x01,0x03,0x00,0x48,0x00,0x08,0xC4,0x1A};
- unsigned int Voltage=0; //电压
- unsigned int Current=0; //电流
- unsigned int Active_Power=0; //有功功率
- unsigned int Electric_Energy=0; //有功总电能
- unsigned int Power_Factor=0; //功率因数
- unsigned int CO2_Emissions=0; //二氧化碳排放量
- unsigned int Frequency=0; //频率
- unsigned int shi,ge;
- unsigned char Data[4]={0x00,0x00,0x00,0x00};
- /************************数据格式转换******************************/
- void int_to_hex(unsigned int data)
- {
- Data[0]=48+data/1000; //千位
- Data[1]=48+(data-(Data[0]-48)*1000)/100; //百位
- Data[2]=48+(data-(Data[0]-48)*1000-(Data[1]-48)*100)/10; //十位
- Data[3]=48+(data-(Data[0]-48)*1000-(Data[1]-48)*100)%10; //个位
- if((Data[0]==48)&&(Data[1]!=48)) Data[0]=32;
- if((Data[0]==48)&&(Data[1]==48)&&(Data[2]!=48))
- {
- Data[0]=32;
- Data[1]=32;
- }
- if((Data[0]==48)&&(Data[1]==48)&&(Data[2]==48)&&(Data[3]!=48))
- {
- Data[0]=32;
- Data[1]=32;
- Data[2]=32;
- }
- if((Data[0]==48)&&(Data[1]==48)&&(Data[2]==48)&&(Data[3]==48))
- {
- Data[0]=32;
- Data[1]=32;
- Data[2]=32;
- Data[3]=32;
- }
- }
- /********************************************************************/
- /***********************串口数据处理**********************************/
- void UART1_SendData(u8 *Data)//电表数据Command
- {
- int i=0;
- for(i=0;i<8;i++)
- {
- USART_SendData(USART1,Data[i]);
- while(USART_Get(USART1)!=1);//等待发送结束
- }
- }
- /********************************************************************/
- /***********************电表数据读取*********************************/
- void read_Electric(void)
- {
- Voltage=(((USART_RX_BUF[3]<<24)|(USART_RX_BUF[4]<<16)|(USART_RX_BUF[5]<<8)|(USART_RX_BUF[6]))/10000);
- Current=(((USART_RX_BUF[7]<<24)|(USART_RX_BUF[8]<<16)|(USART_RX_BUF[9]<<8)|(USART_RX_BUF[10]))/10000);
- Active_Power=(double)((USART_RX_BUF[11]<<24)|(USART_RX_BUF[12]<<16)|(USART_RX_BUF[13]<<8)|(USART_RX_BUF[14]))/(double)10000/(double)3.0403;
- Electric_Energy=(((USART_RX_BUF[15]<<24)|(USART_RX_BUF[16]<<16)|(USART_RX_BUF[17]<<8)|(USART_RX_BUF[18]))/10000);
- Power_Factor=(((USART_RX_BUF[19]<<24)|(USART_RX_BUF[20]<<16)|(USART_RX_BUF[21]<<8)|(USART_RX_BUF[22]))/1000);
- CO2_Emissions=(((USART_RX_BUF[23]<<24)|(USART_RX_BUF[24]<<16)|(USART_RX_BUF[25]<<8)|(USART_RX_BUF[26]))/10000);
- Frequency=(((USART_RX_BUF[31]<<24)|(USART_RX_BUF[32]<<16)|(USART_RX_BUF[33]<<8)|(USART_RX_BUF[34]))/100);
- </font> <font face="新宋体">
- }
- </font>
复制代码 按键模块:
- <font face="新宋体">#include "key.h"
- #include "sys.h"
- #include "delay.h"
- //////////////////////////////////////////////////////////////////////////////////
- //山东交通学院
- //MDebug
- //////////////////////////////////////////////////////////////////////////////////
- //按键初始化函数
- void KEY_Init(void) //IO初始化
- {
- Chip_GPIO_Init(LPC_GPIO_PORT);
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 12, false);
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0,2, false);
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0,4, false);
- }
- //按键处理函数
- //返回按键值
- //mode:0,不支持连续按;1,支持连续按;
- //0,没有任何按键按下
- //1,KEY0按下
- //2,KEY1按下
- //3,KEY2按下
- //4,KEY3按下 WK_UP
- u8 KEY_Scan(u8 mode)
- {
- static u8 key_up=1;//按键按松开标志
- if(mode)key_up=1; //支持连按
- if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
- {
- delay_ms(10);//去抖动
- key_up=0;
- if(KEY0==0)return 1;
- else if(KEY1==0)return 2;
- else if(KEY2==0)return 3;
- else if(KEY3==1)return 4;
- }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
- return 0;// 无按键按下</font>
复制代码
|