基于温度传感器的智能热水器
目錄
?熱水器水溫顯示器
?
問題咨詢及項目源碼下載請加群:
群名:IT項目交流群
群號:245022761
?
一、設計目的
1. 了解DS18B20溫度傳感器工作原理及引腳功能。
2. 理解DS18B20溫度傳感器的單總線工作時序。
3. 學會使用DS18B20溫度傳感器采集溫度信號。
4. 了解繼電器工作原理及引腳功能。
5. 學會使用面包板搭建外部電路
6. 會使用八段數碼管顯示溫度值。
?
二、項目設計要求
使用51單片機控制DS18B20溫度傳感器檢測熱水器水溫,并將水溫值顯示在八段數碼管顯示模塊上,當溫度處于35-45度之間時綠燈亮,否則紅燈亮,并且蜂鳴器發出報警聲。
三、系統實現圖
?四、代碼實現
?
DS18b20溫度傳感器 代碼實現:#include <ds18b20.h> sbit ds=P2^2; //溫度傳感器信號線 void dsreset() //18B20復位,初始化函數 {u16 i;ds=0;i=103;while(i>0)i--; //延時ds=1;i=4;while(i>0)i--; //延時 }bit tempreadbit() //讀1位函數 {u16 i;bit dat;ds=0;i++; //i++ 起延時作用ds=1;i++;i++;dat=ds;i=8;while(i>0)i--; //延時return(dat); }u8 tempread() //讀1個字節 {u8 i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里}return(dat); }void tempwritebyte(u8 dat) //向18B20寫一個字節數據 {u16 i;u8 j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //寫 1{ds=0;i++;i++; //延時ds=1;i=8;while(i>0)i--; //延時長}else{ds=0; //寫 0i=8;while(i>0)i--; //延時長ds=1;i++;i++; //延時}} }void tempchange() //DS18B20 開始獲取溫度并轉換 {dsreset();delay_ms(1);tempwritebyte(0xcc); // 寫跳過讀ROM指令tempwritebyte(0x44); // 寫溫度轉換指令 }float get_temp() //讀取寄存器中存儲的溫度數據 {u8 a,b;u16 t;int temp;float f_temp;dsreset();delay_ms(1);tempwritebyte(0xcc);// 寫跳過讀ROM指令tempwritebyte(0xbe);// 發讀數據指令a=tempread(); //讀低8位b=tempread(); //讀高8位if(b&0x08) b=b|0xf0;t=b;t*=256; //兩個字節組合為1個字t=t|a; temp=t;f_temp=temp*0.0625; //溫度在寄存器中為12位 分辨率位0.0625°return f_temp; } //數碼管代碼實現:#include <shumaguan.h> sbit DX=P2^6; sbit WX=P2^7; u8 code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; //共陰數碼管編碼void Print_u32_LED(u32 n)//輸出6位無符號整數(0-999999)到6位數碼管,不足6位時,前面不顯示 {u8 t=0xdf;while(n){ P0=0xff; //消影WX=1;//允許更新位碼P0=t; //送位碼WX=0;//鎖存位碼P0=0x00; //消影DX=1;//允許更新段碼P0=table[n%10]; //送段碼DX=0;//鎖存段碼n=n/10;t=_cror_(t,1);delay_ms(3);} } void Print_str_LED(u8 *f)//輸出數字串到數碼管 {u8 t=0xdf,i;i=strlen(f);while(i){ P0=0xff; //消影WX=1;//允許更新位碼P0=t; //送位碼WX=0;//鎖存位碼P0=0x00; //消影DX=1;//允許更新段碼switch(f[i-1]){case '.':i--;P0=table[f[i-1]-'0']|0x80;break;case '-':P0=0x40;break;case ' ':P0=0x00;break;default:P0=table[f[i-1]-'0']; } //送段碼DX=0;//鎖存段碼i--;t=_cror_(t,1);delay_ms(3);}}void Print_float_LED(float n,u8 x)//輸出小數(有效數字不超過6位)到6位數碼管,保留x(0-3)位小數 {u8 prtstr[10];switch(x){case 0:sprintf(prtstr,"%.0f",n);break;case 1:sprintf(prtstr,"%.1f",n);break;case 2:sprintf(prtstr,"%.2f",n);break;case 3:sprintf(prtstr,"%.3f",n);break;} Print_str_LED(prtstr);} main函數實現:#include <reg51.h> #include <config.h> #include <stdio.h> #include <1602.h> #include <shumaguan.h> #include <uart.h> #include <ds18b20.h> #include <12864.h> #define N 25float n; sbit FM=P2^3; //u8 print[N];//輸出緩沖區 //u8 print2[N];//輸出緩沖區 //sbit SW=P1^0; sbit RL=P2^0; int k=0; void delay_ms(u16 x)//毫秒延時函數 {u16 i,j; for(i=0;i<x;i++)for(j=0;j<115;j++); }void main() {// unsigned int kk;u8 i,j;FM=1;TMOD=0X10;TL0=(8192-1000)%32;TH0=(8192-1000)/32;TL1=(65536-10000)%256;TH1=(65536-10000)/256;EA=1; //總中斷IT0=1; // 外部中斷0為1下降觸發IT1=1;//外部中斷1為電平觸發方式EX0=1;// 外部中斷0允許// EX1=1; // 外部中斷1允許ET0=1;// 定時、計數器T0允許// ET1=1; // 定時,計數T1允許TR0=0;//TR0=1啟動定時器工作//init_com(); //串口初始化 //LCD1602_Init(); //1602初始化 //lcd12864_init();//12864初始化while(1){ //kk=SW;//RL=kk;tempchange(); //啟動溫度變換n=get_temp(); //讀取溫度for(i=50;i>0;i--) print_float_LED(n,2); //輸出到數碼管 if(n>=15&&n<=45){// SW=1;RL=0;TR0=1;//報警}else{// SW=0;RL=1;TR0=0;//不報警// sprintf(print,"Temp: %.1f",n); print_str_uart(print);delay_ms(800);//輸出到串口// sprintf(print,"Temp: %.1f",n);LCD1602pos(0,0); LCD1602disstr(print); delay_ms(800); //輸出到1602// sprintf(print,"溫度:%.1f",n);//i=0;while(i<6){print2[i]=print[i];i++;}//j=6;while(print[i]){print2[j]=0xa3;j++;print2[j]=print[i]+0x80;i++;j++;} print2[j]='\0'; //半角轉全角//lcd12864_pos(0,0);LCD12864disp(print2); delay_ms(800);//輸出到12864// sprintf(print2,"溫度:%.1f",n);} } } void time0() interrupt 1//發聲中斷 {TL0=(6500)%32;TH0=(6500)/32;FM=~FM;}?五、效果實現及總結
達到了預期實驗效果,使用51單片機控制DS18B20溫度傳感器檢測熱水器水溫,并將水溫值顯示在八段數碼管顯示模塊上,當溫度處于35-45度之間時綠燈亮,否則紅燈亮,并且蜂鳴器發出報警聲。不足之處各位碼友多多指教,多多關注互相交流。
附上本人在大學學習期間所有學習實現的demo,這些項目的實現都通過本人親自測試運行,也是自己學習中知識的一點一點積累,整理不易,希望能幫到大家,不足之處大家多多交流。
?
QQ:1805523903
郵箱:1805523603@qq.com
昵稱:忘塵
?
世界不同角落共同努力,變成更優秀的我們。
?
1.51單片機學習整理
?
基于51單片機的智能光控路燈 :https://download.csdn.net/download/qq_37037348/11071869
基于51單片機超聲波測距(內含源程序,原理圖及PCB源文件):https://download.csdn.net/download/qq_37037348/11071866
?
?
基于51單片機的智能安防報警系統:https://download.csdn.net/download/qq_37037348/11071865
?
基于51單片機模塊化編程模塊 (紅外、液晶顯示屏、溫濕度等傳感器模塊化)
:https://download.csdn.net/download/qq_37037348/11053222
?
基于51單片機pwm控制的呼吸燈程序
https://download.csdn.net/download/qq_37037348/11053195
?
51單片機與上位機串口通信實例包含詳細講解的完整代碼
https://download.csdn.net/download/qq_37037348/11053164
?
?
基于51單片機的直交流電壓表仿真 (詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053145
?
?
?
基于51單片機胸牌 詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053125
?
基于51單片機3x4按鍵撥號 (詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053093
?
?
基于51單片機撥號 (詳細代碼實現,設計講解)
?
https://download.csdn.net/download/qq_37037348/11053090
?
?
基于51單片機警燈系統設計(詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053086
?
?
基于51單片機點亮一個小燈(詳細代碼實現,設計講解,學習51基礎實驗)
https://download.csdn.net/download/qq_37037348/11053084
?
基于51單片機開發的排球計時器,附有詳細注釋講解,為大家提供最真心的幫助
https://download.csdn.net/download/qq_37037348/11053024
?
?
基于51單片機的音樂播放器,源碼詳細注釋
https://download.csdn.net/download/qq_37037348/11053022
?
?
?
2.Android 開發學習整理:
?
Android-serialport 手機App串口通信代碼實現:
?
https://download.csdn.net/download/qq_37037348/11050521
?
Android-serialport 手機App網絡通信實例代碼實現:
https://download.csdn.net/download/qq_37037348/11050516
?
Android 第一個App詳細教程、基礎實驗 :
https://download.csdn.net/download/qq_37037348/11050515
?
?
3.計算機視覺(深度學習、神經網絡的學習)
?
feature extraction(深度學習,特征提取,神經網絡:https://download.csdn.net/download/qq_37037348/11065968
?
feature extraction(深度學習,特征提取,神經網絡多種訓練模型詳細實現):
https://download.csdn.net/download/qq_37037348/11065974
?
?
?
歡迎大家加入學習項目交流,為大家分享各類個人學習項目及學習資料,互相交流互相學習。
總結
以上是生活随笔為你收集整理的基于温度传感器的智能热水器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除SQL Server数据库
- 下一篇: html-css和html实现Googl