日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2024/5/8 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PH值检测C语言程序,单片机PH值检测鱼缸自动换水系统程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/******************** (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值检测鱼缸自动换水系统程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。