/******************** (C) COPYRIGHT 2015 Silicone shell electronic studio **************************

* 文件名  :main.c

* 描述    :

* 硬件连接:

*

* 实验平台:STC12C5A60S2开发板

*https://www.bilibili.com/video/BV1rK411V7xa/

**********************************************************************************/

#include

#include

#include

#include

#define        uchar        unsigned char

#define uint        unsigned int

#define MAIN_Fosc                11059200L        //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ  22118400L

#define ADC_OFF()        ADC_CONTR = 0

#define ADC_ON                (1 << 7)

#define ADC_90T                (3 << 5)

#define ADC_180T        (2 << 5)

#define ADC_360T        (1 << 5)

#define ADC_540T        0

#define ADC_FLAG        (1 << 4)        //软件清0

#define ADC_START        (1 << 3)        //自动清0

#define ADC_CH0                0

#define ADC_CH1                1

#define ADC_CH2                2

#define ADC_CH3                3

#define ADC_CH4                4

#define ADC_CH5                5

#define ADC_CH6                6

#define ADC_CH7                7

sbit k1 = P2^0;

sbit k2 = P2^1;

sbit k3 = P2^2;

sbit fs_led = P3^3;

sbit ss_led = P3^4;

sbit yw_up = P3^6;

sbit yw_down = P3^7;

/**************变量定义***************************/

float PH=0.0;

float PH_value=0.0;

float ph1=0.0,ph2=0.0;

float ph_h=0.0, ph_h_2=0.0;

unsigned int temp_data=0;

unsigned char disbuff[14]={0};

void DelayUs(unsigned int time);   //延时子函数

void Delay1(unsigned int time);                 //延时主程序

void  delay_ms_AD(unsigned char ms);

void  press_k1();

void  press_k2();

void  press_k3();

void Display_PH1();

void Display_PH2();

void Display_time_set();

uint        adc10_start(uchar channel);        //channel = 0~7

uint        key_flag = 0,turnwater=0,flag1=0;

uint count1 = 0;

uint i;

void PH_Value_Conversion()

{

PH=(PH*5)/1024;

PH_value=-5.8887*PH+21.677;

if((PH_value<=0)){PH_value=0;}

if((PH_value>14)){PH_value=14.1;}

/*显示酸碱度*/

disbuff[0]=(int)(PH_value*100)/1000+'0';

disbuff[1]=(int)(PH_value*100)%1000/100+'0';

disbuff[2]='.';

disbuff[3]=(int)(PH_value*100)%100/10+'0';

disbuff[4]=(int)(PH_value*100)%10+'0';

DisplaySingleChar(0x03,1,disbuff[0]);

DisplaySingleChar(0x04,1,disbuff[1]);

DisplaySingleChar(0x05,1,disbuff[2]);

DisplaySingleChar(0x06,1,disbuff[3]);

DisplaySingleChar(0x07,1,disbuff[4]);

}

void TEMP_Value_Conversion()                                        //温度

{

disbuff[9]=(int)(temp_data)/1000+'0';

disbuff[10]=(int)(temp_data)%1000/100+'0';

disbuff[11]=(int)(temp_data)%100/10+'0';

disbuff[12]='.';

disbuff[13]=(int)(temp_data)%10+'0';

DisplaySingleChar(0x0b,1,disbuff[10]);

DisplaySingleChar(0x0c,1,disbuff[11]);

DisplaySingleChar(0x0d,1,disbuff[12]);

DisplaySingleChar(0x0e,1,disbuff[13]);

}

/*

* 函数名:main

* 描述  :主函数

* 输入  :无

* 输出  :无

*/

void main(void)

{

ss_led = 0;

fs_led = 0;

Init_Ds18b20();

LCDInit();                              //显示屏初始化

DisplayString(0x0,0,"  Welcome...  ");

DisplayString(0x0,1,"water quality");

Delay1(2500);

WriteCmd(LCD_CLS);

P1ASF = 0x07;                        //12C5A60AD/S2系列模拟输入(AD)选择

ADC_CONTR = ADC_360T | ADC_ON;

ph1 = 5.0;

ph2 = 6.0;

while(1)

{

press_k1();

press_k2();

press_k3();

if (count1 == 0)

{

DisplayString(0x02,0,"*");

DisplayString(0x09,0," ");

}

if (count1 == 1)

{

DisplayString(0x02,0," ");

DisplayString(0x09,0,"*");

}

DisplayString(0x0,1,"PH:");

DisplayString(0x09,1,"T:");

Display_time_set();

for(i=0; i<2; i++)

{

Delay1(500);

if(i==0)

{

PH = adc10_start(0);

PH_Value_Conversion();

}

if(i==1)

{

temp_data=Get_temp();

TEMP_Value_Conversion();

}

}

if (PH_value < ph1 || PH_value > ph2)

{

turnwater = 1;

}

if( turnwater == 1 )

{

if(yw_down == 0 && flag1 == 0)       //放水过程

{

ss_led = 0;

fs_led = 1;

}

if(yw_down == 1 && flag1 == 0)       //放水完毕,开始上水

{

ss_led = 1;

fs_led = 0;

flag1 = 1;

}

if(yw_up == 0 && flag1 == 1)      //上水完毕,关继电器

{

ss_led = 0;

fs_led = 0;

turnwater = 0;

flag1=0;

}

}

}

}

///********************* 做一次ADC转换 *******************/

uint        adc10_start(uchar channel)        //channel = 0~7

{

uint        adc;

uchar        i;

ADC_RES = 0;

ADC_RESL = 0;

ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;

i = 250;

do{

if(ADC_CONTR & ADC_FLAG)

{

ADC_CONTR &= ~ADC_FLAG;

adc = (uint)ADC_RES;

adc = (adc << 2) | (ADC_RESL & 3);

return        adc;

}

}while(--i);

return        1024;

}

//========================================================================

// 函数: void  delay_ms(unsigned char ms)

// 描述: 延时函数。

// 参数: ms,要延时的ms数.

// 返回: none.

// 版本: VER1.0

// 日期: 2010-12-15

// 备注:

//========================================================================

void  delay_ms_AD(unsigned char ms)

{

unsigned int i;

do{

i = MAIN_Fosc / 14000;

while(--i)        ;   //14T per loop

}while(--ms);

}

//========================================================================

void Display_time_set()

{

Display_PH1();

Display_PH2();

}

void Display_PH1()

{

uint ph_h1, ph_h2,ph_h3,ph_h4;

ph_h = ph1 * 100;

ph_h1 = (int)ph_h/1000;

ph_h2 = (int)ph_h%1000/100;

ph_h3 = (int)ph_h%100/10;

ph_h4 = (int)ph_h%10;

DisplaySingleChar(0x03,0,ph_h1+0x30);

DisplaySingleChar(0x04,0,ph_h2+0x30);

DisplaySingleChar(0x05,0,'.');

DisplaySingleChar(0x06,0,ph_h3+0x30);

DisplaySingleChar(0x07,0,ph_h4+0x30);

}

void Display_PH2()

{

uint ph_h1, ph_h2,ph_h3,ph_h4;

ph_h_2 = ph2 * 100;

ph_h1 = (int)ph_h_2/1000;

ph_h2 = (int)ph_h_2%1000/100;

ph_h3 = (int)ph_h_2%100/10;

ph_h4 = (int)ph_h_2%10;

DisplaySingleChar(0x0a,0,ph_h1+0x30);

DisplaySingleChar(0x0b,0,ph_h2+0x30);

DisplaySingleChar(0x0c,0,'.');

DisplaySingleChar(0x0d,0,ph_h3+0x30);

DisplaySingleChar(0x0e,0,ph_h4+0x30);

}

//========================================================================

// 描述: 键盘扫描。

void press_k1()

{

if (k1 == 0)

{

Delay1(80);

if (k1 == 0)

{

//key_flag = 1;

count1++;

if (count1 ==2)

{

count1 = 0 ;

}

}

}

}

void press_k2()

{

if (k2 == 0)

{

Delay1(100);

if (k2 == 0)

{

if (count1 == 0)

{

ph1+=0.1;

if(ph1>=14)

{

ph1 = 0;

}

}

if (count1 == 1)

{

ph2+=0.1;

if(ph2>=14)

{

ph2 = 0;

}

}

}

}

}

void press_k3()

{

if (k3 == 0)

{

Delay1(100);

if (k3 == 0)

{

if (count1 == 0)

{

ph1-=0.1;

if(ph1<=0)

{

ph1 = 14;

}

}

if (count1 == 1)

{

ph2-=0.1;

if(ph2<=0)

{

ph2 = 14;

}

}

}

}

}

//延时函数//

void Delay1(unsigned int time)

{

unsigned int timeCounter = 0;

for (timeCounter = time;timeCounter > 0 ;timeCounter --)

DelayUs(255);

}

void DelayUs(unsigned int time)

{

unsigned int timeCounter = 0;

for (timeCounter = 0;timeCounter < time;timeCounter ++)

_nop_();

}

//void        BitTime(void)        //位时间函数

//{

//        uint i;

//        i = ((MAIN_Fosc / 100) * 104) / 140000L - 1;                //根据主时钟来计算位时间

//        while(--i);

//}

//模拟串口发送

//void        Tx1Send(uchar dat)                //9600,N,8,1                发送一个字节

//{

//        uchar        i;

//        EA = 0;

//        P_TXD1 = 0;

//        BitTime();

//        for(i=0; i<8; i++)

//        {

//                if(dat & 1)                P_TXD1 = 1;

//                else                        P_TXD1 = 0;

//                dat >>= 1;

//                BitTime();

//        }

//        P_TXD1 = 1;

//        EA = 1;

//        BitTime();

//        BitTime();

//}

PH值检测C语言程序,单片机PH值检测鱼缸自动换水系统程序相关推荐

  1. 51单片机的花卉、农田自动浇水灌溉系统开发,Proteus仿真,原理图和C代码

    设计要求 1.设计一种基于51单片机的花卉.农田自动浇水灌溉系统: 2.能够检测土壤湿度,当低于设定的下限值时,启动水泵进行浇水灌溉,并提供相应的声光报警指示: 3.能够通过按键设定湿度上下限值: 4 ...

  2. 煤气检测与报警程序C语言,基于单片机的煤气检测报警系统毕业设计.doc

    基于单片机的煤气检测报警系统毕业设计 届 别 学 号 毕业设计 基于单片机的煤气检测报警系统 姓 名 系 别. 专 业 导 师 姓 名.职 称 完 成 时 间 目录 摘要3 Abstract3 1 绪 ...

  3. 电量监测程序 c语言,基于单片机的电量检测系统设计方案.doc

    基于单片机的电量检测系统设计方案 1绪论 自第一个微处理器问世以来,以微处理器为核心构成的计算机以各种各样的形式,无孔不入的渗入到人们的生产.生活.科研等各个领域,为人类带来了渗透到各个领域的&quo ...

  4. 51单片机生成C语言矩形波,单片机产生方波、锯齿波、三角波程序

    单片机 产生方波.锯齿波.三角波程序 #include#define uchar unsigned char #define uint unsigned int unsigned char x=0,m ...

  5. 单片机三角波c语言程序,单片机产生方波、锯齿波、三角波程序

    单片机产生方波.锯齿波.三角波程序 #include #define uchar unsigned char #define uint unsigned int unsigned char x=0,m ...

  6. 2字节取值范围_C语言整数的取值范围以及数值溢出

    short.int.long 是C语言中常用的三种整数类型,分别称为短整型.整型.长整型.在现代操作系统中,short.int.long 的长度分别是 2.4.4 或者 8,它们只能存储有限的数值,当 ...

  7. 灰度图像中值滤波c语言编程,灰度图像中值滤波

    灰度图像中值滤波 中值滤波是一种非线性型号处理方法,将每个像素的灰度值用其领域的中值代替.中值是指领域内奇数个数据按大小排序后处于中心位置的那个数.中值滤波能够在去除椒盐噪声的同时保持边缘清晰. 中值 ...

  8. c语言函数返回值存储,C语言的函数返回值所存放的寄存器

    #include int add(int a, int b) { return a + b; } int asm_compare_one(int a) { _asm { mov edx, a cmp ...

  9. c语言 int的取值范围,C语言int的取值范围 ?

    C语言int的取值范围在32/64位系统中都是32位,范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295. C/C++编程语言中,int表示整型变量,是一 ...

最新文章

  1. 【Linux入门到精通系列讲解】shell脚本语法入门教程(看一篇就够了)
  2. git 推送本地分支到远程分支 git push origin
  3. HAAR、LBP分类器训练
  4. hadoop配置文件的加载机制
  5. ASP.NET Core 源码学习之 Options[1]:Configure
  6. 如何以大数据的JAX-RS响应的形式将JPA结果流化/序列化
  7. phpstrom+phpstudy+postman
  8. apache 修改服务器配置,Apache服务器配置全攻略
  9. php 伪静态 获取当前页面路径_织梦移动适配PHP获取当前页面URL地址方法
  10. SpringBoot配置属性之Security
  11. 接收二进制数据_漫话TCP/IP:数据链路层-以太网(1)
  12. matlab中构建Cuk变换器,CUK变换器的SIMULINK仿真与应用.pdf
  13. html编写个人博客_云开发平台开箱,3分钟零基础搭建个人Hexo博客
  14. PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)
  15. 浙江大学计算机学院复试拟录取名单,浙江大学计算机学院2015年考研复试拟录名单...
  16. 各种编码格式(非常经典)
  17. amd cpu 安卓模拟器_AMD的CPU如何运行安卓模拟器?
  18. Map_Excise1
  19. vue仿美团饿了么,实现购物车功能
  20. 嵌入式ARM设计编程(四) ARM启动过程控制

热门文章

  1. 解决mac安装淘宝镜像报错
  2. 【项目回顾】基于Yanshee的AI服务型机器人(二)
  3. QQ营销,你必须知道的技巧
  4. linux系统的管理员默认是,Linux默认的系统管理员帐号是
  5. 511遇见易语言数组操作数组排序
  6. EMS企业微电网能效管理解决方案为工业能效提升行动计划提供助力
  7. windows开源版的pymol安装方法
  8. Linux用户管理及权限设置
  9. mac 上php不可用,Mac_Mac蓝牙不可用怎么办?苹果电脑Mac蓝牙连不上iphone现象的解决办法介绍,Mac蓝牙不可用怎么办?有很多 - phpStudy...
  10. Redis 分布式高可用终极指南