基于51的水溫水位檢測調節,采用SR04、12864、DS1820
單片機源程序如下:
- #include<reg52.h>
- #include "12864.h"
- #include "delay.h"
- #include "sr04.h"
- #include "ds18b20.h"
- #include "delay.h"
- #include "beep.h"
- sbit s1=P1^2;
- sbit s2=P3^7;
- sbit KEY1=P1^3;
- sbit KEY2=P1^4;
- sbit KEY3=P1^5;
- extern uchar table1[];
- extern uint time,s;
- extern uchar code table5[];
- extern uchar code table6[];
- uchar num,num2;
- uchar j,mode;
- uchar weidu=25;
- uchar shuiwei=5;
- uchar ge,si;
- uchar set_w=25;
- uchar set_s=2;
- bit res;
- int temp; //讀取到的當前溫度值
- int intT, decT; //溫度值的整數和小數部分
- unsigned char len;
- unsigned char str[12];
- void get_temp();
- unsigned char IntToString(unsigned char *str, int dat);
- void judge();
- void keyscan();
- void main()
- {
- s1=0;s2=0; // 繼電器關
- Start18B20(); //啟動DS18B20
- lcd_init(); //液晶初始
- TMOD=0X10; // 定時器
- TH1=(65536-45872)/256;//50ms
- TL1=(65536-45872)%256;
- EA=1;
- ET1=1;
- TR1=1;
-
- while(1) // 死循環
- {
-
- if((num==10)&&(mode==0)) // 500ms刷新時間和顯示界面0
- {
- num=0;
- get_temp(); sr04();// 獲得溫度 距離
- lcd_pos(0,3); j=0; // 顯示距離
- while(table1[j]!='\0' )
- {
- write_dat(table1[j]); j++;
- }
-
- }
- if(mode==0)
- {judge();} // 水位水溫調節
- keyscan();
- }
- }
- void judge()
- {
- if(s<set_s) // 水位判斷
- {
- s2=1; lcd_pos(1,5); j=0;
- while(table6[j]!='\0' )
- {
- write_dat(table6[j]); j++;
- }
- BEEP=1;
- }
- else
- {
- s2=0; lcd_pos(1,5); j=0;
- while(table5[j]!='\0' )
- {
- write_dat(table5[j]); j++;
- }
- BEEP=0;
- }
- if(intT<set_w) // 溫度判斷
- {
- s1=1;lcd_pos(3,6); j=0;
- while(table6[j]!='\0' )
- {
- write_dat(table6[j]); j++;
- }
- }
- else
- {
- s1=0;lcd_pos(3,6); j=0;
- while(table5[j]!='\0' )
- {
- write_dat(table5[j]); j++;
- }
- }
- }
- void T1_time() interrupt 3
- {
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- num++;
- }
- /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
- unsigned char IntToString(unsigned char *str, int dat)
- {
- signed char i = 0;
- unsigned char len = 0;
- unsigned char buf[6];
-
- if (dat < 0) //如果為負數,首先取絕對值,并在指針上添加負號
- {
- dat = -dat;
- *str++ = '-';
- len++;
- }
- do { //先轉換為低位在前的十進制數組
- buf[i++] = dat % 10;
- dat /= 10;
- } while (dat > 0);
- len += i; //i最后的值就是有效字符的個數
- while (i-- > 0) //將數組值轉換為ASCII碼反向拷貝到接收指針上
- {
- *str++ = buf[i] + '0';
- }
- *str = '\0'; //添加字符串結束符
-
- return len; //返回字符串長度
- }
- void get_temp()
- {
- res = Get18B20Temp(&temp); //讀取當前溫度
- if (res) //讀取成功時,刷新當前溫度顯示
- {
- intT = temp >> 4; //分離出溫度值整數部分
- decT = temp & 0xF; //分離出溫度值小數部分
- len = IntToString(str, intT); //整數部分轉換為字符串
- str[len++] = '.'; //添加小數點
- decT = (decT*10) / 16; //二進制的小數部分轉換為1位十進制位
- str[len++] = decT + '0'; //十進制小數位再轉換為ASCII字符
- while (len < 6) //用空格補齊到6個字符長度
- {
- str[len++] = ' ';
- }
- str[len] = '\0'; //添加字符串結束符
- lcd_pos(2,3); j=0;
- while(str[j]!='\0' ) // 顯示溫度
- {
- write_dat(str[j]);
- j++;
- }
- }
- else //讀取失敗時,提示錯誤信息
- {
- //LcdShowStr(0, 0, "error!");
- }
- Start18B20(); //重新啟動下一次轉換
- }
- void keyscan()
- {
- if(KEY1==0) // set
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- mode++;
- }
-
- }
- if(mode==1) //界面1
- {
- clear(); //界面1顯示
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- shuiwei++;
- if(shuiwei>9)
- {shuiwei=9;}
-
- }
- }
- if(KEY3==0)
- {
- delay(5);
- if(KEY3==0)
- {
- shuiwei--;
- if(shuiwei==255)
- {shuiwei=0;}
- }
- }
- lcd_pos(2,5);
- write_dat(shuiwei+0x30);
- write_dat( );
- }
- if(mode==2) //界面2
- {
-
- mode2();// 界面顯示
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- { while(!KEY2);
- weidu++;
- if(weidu>50)
- {weidu=50;}
-
- }
- }
- if(KEY3==0)
- {
- delay(5);
- if(KEY3==0)
- { while(!KEY3);
- weidu--;
- if(weidu==255)
- {weidu=0;}
- }
- }
- ge=weidu%10;
- si=weidu/10;
- lcd_pos(2,5);
- write_dat(si+0x30);
- write_dat(ge+0x30);
- }
- if(mode==3)
- {
- mode=0;lcd_init();// 界面0 及 顯示
- set_w=weidu;
- set_s=shuiwei;
- }
- }
復制代碼
所有資料51hei提供下載:
1.程序.zip
(76.12 KB, 下載次數: 37)
2019-4-17 13:28 上傳
點擊文件名下載附件
51程序 下載積分: 黑幣 -5
|