自己写的过欠压检测设备,可累计单次运行时间及总运行时间,也可以进行阈值判断并警报、记录,通过12864显示出来
- #include "delay.h"
- #include "sys.h"
- #include "oled.h"
- #include "rtc.h"
- #include "key.h"
- #include "spi.h"
- #include "flash.h"
- #include "adc.h"
- unsigned char r_sec; //单次老炼 秒
- unsigned char r_min; //单次老炼 分
- unsigned int r_hor; //单次老炼 时
- unsigned char a_sec; //累积老炼 秒
- unsigned char a_min; //累积老炼 分
- unsigned int a_hor; //累积老炼 时
- #define N 10 //每通道采10次
- #define M 2 //为2个通道
- vu16 AD_Value[10][2]; //用来存放ADC转换结果,也是DMA的目标地址
- vu16 After_filter[2]; //用来存放求平均值之后的结果
- u16 i;
- u16 ad1;
- u16 ad2;
- u32 rcounter; //RTC运行秒数
- u8 Buffer[4] = {0}; //累积老炼总秒数的8位数据缓存数组
- u32 acount; //flash存储的累积老炼秒数
- u32 nacount; //运行时累积老炼秒数
- #define SIZE sizeof(Buffer) //缓存数组的大小
- u32 count4;
- #define temp2 count4%86400 //单天运行的秒数
- #define FLASH_SIZE 8*1024*1024 //FLASH字节个数
-
- int main(void)
- {
- u8 t;
- u32 count3 = 0;
- u32 count2 = 0; //运行时与RTC的差值
- u32 count1 = 0; //运行时RTC的初值
- u8 fcount1 = 0; //初值锁存标志
- u16 hcur1;
- u8 lcur1;
- u16 hcur2;
- u8 lcur2;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
- delay_init(); //延时函数初始化
- KEY_Init(); //开关初始化
- SPI_Flash_Init(); //flash初始化
- Adc_Init();
- DMA_Configuration();
- OLED_Init(); //OLED初始化
- /*****************开机显示字符******************/
- OLED_ShowString(20,0, "****TEST",16);
-
- OLED_ShowString(0,16, "h:",12);
- OLED_ShowString(12,16,"0000",16);
- OLED_ShowString(56,16, "m:",12);
- OLED_ShowString(68,16,"00",16);
- OLED_ShowString(92,16, "s:",12);
- OLED_ShowString(104,16,"00",16);
-
- OLED_ShowString(0,32, "h:",12);
- OLED_ShowString(12,32,"0000",16);
- OLED_ShowString(56,32, "m:",12);
- OLED_ShowString(68,32,"00",16);
- OLED_ShowString(92,32, "s:",12);
- OLED_ShowString(104,32,"00",16);
-
- OLED_ShowString(0,48, "u:",12);
- OLED_ShowString(12,48,"000.0A",16);
-
- OLED_ShowString(68,48, "d:",12);
- OLED_ShowString(80,48,"000.0A",16);
-
- OLED_Refresh_Gram();
-
- while(RTC_Init()) //RTC初始化 ,一定要初始化成功
- {
- delay_ms(800);
- }
-
- while(SPI_Flash_ReadID()!=W25Q64)//Flash ID检测
- {
- delay_ms(1800);
- }
-
- SPI_Flash_Read(Buffer,FLASH_SIZE-100,SIZE); //读上次累积的时间
-
- acount = Buffer[0] + Buffer[1]*255 + Buffer[2]*65536 + Buffer[3]*16777216;
- a_sec = ((acount%86400)%3600)%60; //上次老炼秒
- a_min = ((acount%86400)%3600)/60; //上次老炼分
- a_hor = acount/3600; //上次老炼时
-
- while(1)
- {
-
- filter();
- ad1 = GetVolt(After_filter[0]);
- ad2 = GetVolt(After_filter[1]);
-
- hcur1 = ad1/10;
- lcur1 = ad1%10;
-
- hcur2 = ad2/10;
- lcur2 = ad2%10;
-
-
- if(KEY0 == 0) //判断是否正常运行,0为正常,1为异常
- {
- LED0 = 1;
- if(fcount1 == 0) //获取此时RTC的值
- {
- count1 = RTC_GetCounter();
- delay_ms(500);
- fcount1 = 1;
- }
- if(fcount1 == 1)
- {
- count2 = rcounter - count1; //获取差值
-
- count4 = count3 + count2;
-
- nacount = acount + count4;
-
- a_sec = ((nacount%86400)%3600)%60; //获取此次累积运行秒
- a_min = ((nacount%86400)%3600)/60; //获取此次累积运行分
- a_hor = nacount/3600; //获取此次累积运行时
-
- Buffer[0] = nacount;
- Buffer[1] = nacount>>8;
- Buffer[2] = nacount>>16;
- Buffer[3] = nacount>>24;
-
- SPI_Flash_Write((u8*)Buffer,FLASH_SIZE-100,SIZE); //保存此次累积运行的时间
-
- r_sec = (temp2%3600)%60; //获取单次运行秒
- r_min = (temp2%3600)/60; //获取单次运行分
- r_hor = count4/3600; //获取单次运行时
- if(r_hor>=999)
- {
- r_hor = 0;
- }
- }
- }
-
- else
- {
- fcount1 = 0;
- count3 = count4;
- LED0 = 0;//蜂鸣器响;
- }
-
- if(KEY1 == 0) //单次运行各状态复位
- {
- fcount1= 0;
- count2 = 0;
- count3 = 0;
- count4 = 0;
- r_sec = 0;
- r_min = 0;
- r_hor = 0;
- acount = Buffer[0] + Buffer[1]*255 + Buffer[2]*65536 + Buffer[3]*16777216;
- }
-
- if(WK_UP == 1) //累积运行及单次运行各状态复位
- {
- acount = 0;
- nacount = 0;
- fcount1= 0;
- count2 = 0;
- count3 = 0;
- count4 = 0;
- r_sec = 0;
- r_min = 0;
- r_hor = 0;
- a_sec = 0;
- a_min = 0;
- a_hor = 0;
- Buffer[0] = 0;
- Buffer[1] = 0;
- Buffer[2] = 0;
- Buffer[3] = 0;
- SPI_Flash_Write(Buffer,FLASH_SIZE-100,SIZE);
- }
-
- if(t!=calendar.sec) //更新屏幕显示
- {
-
- t = calendar.sec;
-
- OLED_ShowNum(12,16,r_hor,4,16);
- OLED_ShowNum(68,16,r_min,2,16);
- OLED_ShowNum(104,16,r_sec,2,16);
-
- OLED_ShowNum(12,32,a_hor,4,16);
- OLED_ShowNum(68,32,a_min,2,16);
- OLED_ShowNum(104,32,a_sec,2,16);
-
- OLED_ShowNum(12,48,hcur1,3,16);
- OLED_ShowNum(44,48,lcur1,1,16);
-
- OLED_ShowNum(80,48,hcur2,3,16);
- OLED_ShowNum(112,48,lcur2,1,16);
-
- OLED_Refresh_Gram();
-
- }
- }
- }
复制代码
以上代码下载:
过欠压过流检测设备.rar
(348.49 KB, 下载次数: 23)
|