- /*********************************************************************************
- *实验名 :简易水情检测系统
- *实验效果 :精确的测量水位高度,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)
|