自己寫的過欠壓檢測設備,可累計單次運行時間及總運行時間,也可以進行閾值判斷并警報、記錄,通過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)
2021-9-2 21:45 上傳
點擊文件名下載附件
|