|
基于51的水溫水位檢測(cè)調(diào)節(jié),采用SR04、12864、DS1820
單片機(jī)源程序如下:
- #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; //讀取到的當(dāng)前溫度值
- int intT, decT; //溫度值的整數(shù)和小數(shù)部分
- 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; // 繼電器關(guān)
- Start18B20(); //啟動(dòng)DS18B20
- lcd_init(); //液晶初始
- TMOD=0X10; // 定時(shí)器
- TH1=(65536-45872)/256;//50ms
- TL1=(65536-45872)%256;
- EA=1;
- ET1=1;
- TR1=1;
-
- while(1) // 死循環(huán)
- {
-
- if((num==10)&&(mode==0)) // 500ms刷新時(shí)間和顯示界面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();} // 水位水溫調(diào)節(jié)
- 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++;
- }
- /* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長(zhǎng)度 */
- unsigned char IntToString(unsigned char *str, int dat)
- {
- signed char i = 0;
- unsigned char len = 0;
- unsigned char buf[6];
-
- if (dat < 0) //如果為負(fù)數(shù),首先取絕對(duì)值,并在指針上添加負(fù)號(hào)
- {
- dat = -dat;
- *str++ = '-';
- len++;
- }
- do { //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
- buf[i++] = dat % 10;
- dat /= 10;
- } while (dat > 0);
- len += i; //i最后的值就是有效字符的個(gè)數(shù)
- while (i-- > 0) //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
- {
- *str++ = buf[i] + '0';
- }
- *str = '\0'; //添加字符串結(jié)束符
-
- return len; //返回字符串長(zhǎng)度
- }
- void get_temp()
- {
- res = Get18B20Temp(&temp); //讀取當(dāng)前溫度
- if (res) //讀取成功時(shí),刷新當(dāng)前溫度顯示
- {
- intT = temp >> 4; //分離出溫度值整數(shù)部分
- decT = temp & 0xF; //分離出溫度值小數(shù)部分
- len = IntToString(str, intT); //整數(shù)部分轉(zhuǎn)換為字符串
- str[len++] = '.'; //添加小數(shù)點(diǎn)
- decT = (decT*10) / 16; //二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
- str[len++] = decT + '0'; //十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
- while (len < 6) //用空格補(bǔ)齊到6個(gè)字符長(zhǎng)度
- {
- str[len++] = ' ';
- }
- str[len] = '\0'; //添加字符串結(jié)束符
- lcd_pos(2,3); j=0;
- while(str[j]!='\0' ) // 顯示溫度
- {
- write_dat(str[j]);
- j++;
- }
- }
- else //讀取失敗時(shí),提示錯(cuò)誤信息
- {
- //LcdShowStr(0, 0, "error!");
- }
- Start18B20(); //重新啟動(dòng)下一次轉(zhuǎn)換
- }
- 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;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
1.程序.zip
(76.12 KB, 下載次數(shù): 37)
2019-4-17 13:28 上傳
點(diǎn)擊文件名下載附件
51程序 下載積分: 黑幣 -5
|
|