- /*********************************************************************************
- *實驗名 :簡易水情檢測系統
- *實驗效果 :精確的測量水位高度,PH值,輸出電壓
- *
- *********************************************************************************/
- #include <STC15.h>
- #include <string.h >
- #include <intrins.h>
- #include "oled.h"
- #include "adc.h"
- #include "GPIO.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define uint32 unsigned long
- uchar j;
- sbit FM = P5^5;
- sbit K1 = P2^3;
- sbit K2 = P2^4;
- sbit K3 = P2^5;
- sbit K4 = P2^6;
- uint water = 0;
- void delay(unsigned int t) //延遲函數//一指令是0.83us
- {
- while(--t);
- }
- void delay_ms(uint x)
- {
- uint j,i;
- for(j=0;j<x;j++)
- {
- for(i=0;i<1100;i++);
- }
- }
- void key()
- {
- if(K1==0) //判斷是否有按下信號
- {
- delay(10); //延時10ms
- if(K1==0) //再次判斷是否按下
- {
- while(K1==0); //判斷是否松開按鍵
- FM=1; //打開蜂鳴器
- }
- }
- if(K2==0) //判斷是否有按下信號
- {
- delay(10); //延時10ms
- if(K2==0) //再次判斷是否按下
- {
- while(K2==0); //判斷是否松開按鍵
- FM=1; //打開蜂鳴器
- }
- }
- if(K3==0) //判斷是否有按下信號
- {
- delay(10); //延時10ms
- if(K3==0) //再次判斷是否按下
- {
- while(K3==0); //判斷是否松開按鍵
- FM=0; //關閉蜂鳴器
- }
- }
- if(K4==0) //判斷是否有按下信號
- {
- delay(10); //延時10ms
- if(K4==0) //再次判斷是否按下
- {
- while(K4==0); //判斷是否松開按鍵
- FM=0; //打開蜂鳴器
- }
- }
- }
- void display()
- {
- OLED_ShowCHinese(16,0,0);//水
- OLED_ShowCHinese(32,0,1);//情
- OLED_ShowCHinese(48,0,2);//檢
- OLED_ShowCHinese(64,0,3);//測
- OLED_ShowCHinese(80,0,4);//系
- OLED_ShowCHinese(96,0,5);//統
-
- OLED_ShowCHinese(0,2,0);//水
- OLED_ShowCHinese(16,2,6);//位
- OLED_ShowCHinese(32,2,7);//高
- OLED_ShowCHinese(48,2,8);//度
- OLED_ShowChar(64,2,':');
- OLED_ShowString(110,2,"mm");
-
- OLED_ShowString(0,4,"PH");
- OLED_ShowCHinese(16,4,9);//測
- OLED_ShowCHinese(32,4,10);//量
- OLED_ShowCHinese(48,4,11);//值
- OLED_ShowChar(64,4,':');
- OLED_ShowChar(88,4,'.');
- OLED_ShowNum(94,4,20,2,16);//
- OLED_ShowNum(72,4,10,2,16);//
-
- OLED_ShowCHinese(0,6,12);//輸
- OLED_ShowCHinese(16,6,13);//出
- OLED_ShowCHinese(32,6,14);//電
- OLED_ShowCHinese(48,6,15);//壓
- OLED_ShowChar(64,6,':');
- OLED_ShowChar(112,6,'V');
- OLED_ShowChar(88,6,'.');
-
- }
- /**************************************
- 功能描述:ADC口初始化
- 入口參數:無
- 返回值:無
- ***************************************/
- void ADC_config(void)
- {
- ADC_InitTypeDef ADC_InitStructure; //結構定義
- ADC_InitStructure.ADC_Px = ADC_P10 ; //設置要做ADC的IO
- ADC_InitStructure.ADC_Speed = ADC_360T; //ADC速度 ADC_90T,ADC_180T,ADC_360T,ADC_540T
- ADC_InitStructure.ADC_Power = DISABLE; //ADC功率允許/關閉 ENABLE,DISABLE
- ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8; //ADC結果調整, ADC_RES_H2L8,ADC_RES_H8L2
- ADC_InitStructure.ADC_Polity = PolityLow; //優先級設置 PolityHigh,PolityLow
- ADC_InitStructure.ADC_Interrupt = DISABLE; //中斷允許 ENABLE,DISABLE
- ADC_Inilize(&ADC_InitStructure); //初始化//調用ADC初始化函數
- ADC_PowerControl(ENABLE); //單獨的ADC電源操作函數, ENABLE或DISABLE// 開啟ADC電源
-
- ADC_InitStructure.ADC_Px = ADC_P11 ; //設置要做ADC的IO
- ADC_InitStructure.ADC_Speed = ADC_360T; //ADC速度 ADC_90T,ADC_180T,ADC_360T,ADC_540T
- ADC_InitStructure.ADC_Power = DISABLE; //ADC功率允許/關閉 ENABLE,DISABLE
- ADC_InitStructure.ADC_AdjResult = ADC_RES_H2L8; //ADC結果調整, ADC_RES_H2L8,ADC_RES_H8L2
- ADC_InitStructure.ADC_Polity = PolityLow; //優先級設置 PolityHigh,PolityLow
- ADC_InitStructure.ADC_Interrupt = DISABLE; //中斷允許 ENABLE,DISABLE
- ADC_Inilize(&ADC_InitStructure); //初始化//調用ADC初始化函數
- ADC_PowerControl(ENABLE);
- }
- /**************************************
- 功能描述:GPIO口初始化
- 入口參數:無
- 返回值:無
- ***************************************/
- void GPIO_config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //結構定義
-
- //
- GPIO_InitStructure.Pin=GPIO_Pin_0|GPIO_Pin_1; //P3.0,p3.1引腳
- GPIO_InitStructure.Mode=GPIO_OUT_PP; //指定IO口為強推挽
- GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化P1口
-
- //設置AD檢測口P17口為浮空輸入
- GPIO_InitStructure.Pin=GPIO_Pin_0; //P1.0引腳
- GPIO_InitStructure.Mode=GPIO_HighZ; //指定IO口為浮空輸入
- GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化P1口
- }
- void main()
- {
- uint Temp=0,adc_data1[20],TempPhoto1=0,adtmp1=0,adc_data2[20],TempPhoto2=0,adtmp2=0;
- uchar j,i;
- // uchar strPhoto[6];
-
- /*********************************************************************************
- *注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為
- * 高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用
- *相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- * P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- *********************************************************************************/
- P0M1 = 0; P0M0 = 0; //設置P0.0~P0.7為準雙向口
- P1M1 = 0; P1M0 = 0; //設置P1.0~P1.7為準雙向口
- P2M1 = 0; P2M0 = 0; //設置P2.0~P2.7為準雙向口
- P3M1 = 0; P3M0 = 0; //設置P3.0~P3.7為準雙向口
- P4M1 = 0; P4M0 = 0; //設置P4.0~P4.7為準雙向口
- P5M1 = 0; P5M0 = 0; //設置P5.0~P5.7為準雙向口
- // char t;
- GPIO_config();
- OLED_Init(); //初始化OLED
- OLED_Clear();
- delay_ms(10); //初始化后延時
- ADC_config();
- display();
-
- while(1)
- {
-
- key();
- //Temp = Get_ADC10bitResult(0); //參數0~7,查詢方式做一次ADC, 返回值就是結果, == 1024 為錯誤
-
- for(j=0;j<20;j++)
- {
- adc_data1[j] = Get_ADC10bitResult(0);
- delay_ms(1); //
- }
-
- for(j=0;j<20;j++)
- for(i=1;i<20-j;i++)
- {
- if(adc_data1[j]<adc_data1[i])
- {
- adtmp1=adc_data1[j];
- adc_data1[j]=adc_data1[i];
- adc_data1[i]=adtmp1;
- }
- }
- TempPhoto1=0;
- for(j=5;j<16;j++)
- {
- TempPhoto1=TempPhoto1+adc_data1[j];
-
- }
- TempPhoto1=TempPhoto1/10;
-
- OLED_ShowNum(94,6, (TempPhoto1%1000)/100,1,16);//電壓的小數位
- OLED_ShowNum(102,6, (TempPhoto1%1000)%100,1,16);//
- OLED_ShowNum(80,6,TempPhoto1/1000,1,16);//電壓的個位
-
-
- for(j=0;j<20;j++)
- {
- adc_data2[j] = Get_ADC10bitResult(0);
- delay_ms(1); //
- }
-
- for(j=0;j<20;j++)
- for(i=1;i<20-j;i++)
- {
- if(adc_data2[j]<adc_data2[i])
- {
- adtmp2=adc_data2[j];
- adc_data2[j]=adc_data2[i];
- adc_data2[i]=adtmp2;
- }
- }
- TempPhoto2=0;
- for(j=5;j<16;j++)
- {
- TempPhoto2=TempPhoto2+adc_data2[j];
-
- }
- TempPhoto2=TempPhoto2/10;
- OLED_ShowNum(80,2, TempPhoto2,4,16);//水位高度
- delay_ms(200);
-
-
-
-
-
- }
-
-
- }
復制代碼
全部程序51hei下載地址:
2017年電賽簡易水情代碼.rar
(105.27 KB, 下載次數: 40)
2019-8-3 14:32 上傳
點擊文件名下載附件
STC15W4K58S4做的
|