本帖是關于單片機的溫度計顯示
傳感器用的是ds18b20,
采用數碼管動態顯示,可顯示3位數的溫度,第二位帶小數點
本實驗還包括蜂鳴器報警,溫度高于某值,蜂鳴器報警
附件包括仿真原理圖,proteus工程文件夾,txt格式的代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
熟練掌握C語言的設計和調試方法,了解與掌握數字溫度傳感器DS18B20的工作原理。 利用數字溫度傳感器DS18B20與單片機結合來測量溫度控制器使用單片機AT89C51,測溫傳感器使用DS18B20,用3位LED數碼管以串口傳送數據,實現溫度顯示。且設置一個門限溫度,當傳感器溫度達到門限溫度后,發出提醒。 要求完成實驗內容,LED數碼管成功顯示示數。設置報警門限,若溫度超限蜂鳴器報警。 
圖1 硬件電路圖

圖 1未達門限溫度截過圖 
圖 2達到門限溫度結果圖 實驗總結:通過這次實驗,我了解了DS13B20的基本原理和編程方法,更加熟悉了多位數碼管的動態顯示,自己的編寫代碼的能力也增強了許多。但這次實驗也反映了自己的一些問題,編寫基本的代碼還可以,稍微有些難度的代碼就編寫不出來了,以后會多加練習,克服這個問題。
單片機源程序如下:
- /* Main.c file generated by New Project wizard
- *
- * Created: 周一 7月 6 2020
- * Processor: AT89C52
- * Compiler: Keil for 8051
- */
- #include <reg51.h>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit X=P2^6;
- sbit Y=P2^7;
- sbit Z=P2^3;
- sbit DQ=P2^2;
- uchar code Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void delay(uint count) //delay 延時
- {
- uint i;
- while(count)
- {
- i=200;
- while(i>0)
- i--;
- count--;
- }
- }
- void dsreset(void) //重置、初始化命令
- {
- uint i;
- DQ=0; //賦值
- i=103; //延時480us-960us
- while(i>0)i--;
- DQ=1; //賦值
- i=4;
- while(i>0)i--; //延時15-60us
- }
- bit tmpreadbit(void) //讀一位
- {
- uint i;
- bit dat;
- DQ=0;
- i++; //i++ for delay 延時1us-15us
- DQ=1;
- i++;i++; //釋放總線延時
- dat=DQ; //讀數賦值
- i=8;
- while(i>0)i--;
- return (dat);//返回所獲得讀數
- }
- uchar tmpread(void) //讀一個字節 8Bit
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)//連續讀取8位,1字節
- {
- j=tmpreadbit(); //調用讀1位的函數
- dat=(j<<7|(dat>>1)); //讀出的數據最低位在最前面,動腦想如何設計
- }
- return(dat);//返回1字節的讀數
- }
- void tmpwritebyte(uchar dat) //寫一個字節
- {
- uint i;
- uchar j;
- bit testb;//寫入的數
- for(j=1;j<=8;j++)//連續寫8位
- {
- testb=dat&0x01;//思考如何設計每次讀到的1bit
- dat=dat>>1;
- if(testb) //write 1
- {
- DQ=0;//賦值
- i++;i++;
- DQ=1;//賦值
- i=8;while(i>0)i--;
- }
- else //write 0
- {
- DQ=0;//賦值
- i=8;while(i>0)i--;
- DQ=1;//賦值
- i++;i++;
- }
- }
- }
- void tmpchange(void) //DS18B20 轉換溫度
- {
- dsreset();//初始化
- delay(1);
- tmpwritebyte(0xcc);//跳過ROM
- tmpwritebyte(0x44);//轉換溫度
- }
- void tempread(void)
- {
- dsreset(); //寫入相關指令,思考要寫什么指令
- delay(1);
- tmpwritebyte(0xcc);//跳過RON
- tmpwritebyte(0xbe);//讀取暫存器
- }
- uint tmp() //獲得溫度
- {
- float tt;
- uchar a,b;
- uint temp;
- tmpchange();
- tempread();
- a=tmpread();
- b=tmpread();
- temp=b;
- temp<<=8; //two byte compose a int variable
- temp=temp|a;
- tt=temp*0.0625;
- temp=tt*10+0.5;
- return temp;
- }
- void display(uint temp) //顯示程序
- {
- Y=0;
- P0=0xfe;
- Y=1;
- Y=0;
- X=0;
- P0=Data[temp/100];
- X=1;
- X=0;
- delay(1);
- Y=0;
- P0=0xfd;
- Y=1;
- Y=0;
- X=0;
- P0=Data[(temp%100)/10]+0x80;
- X=1;
- X=0;
- delay(1);
-
- Y=0;
- P0=0xfb;
- Y=1;
- Y=0;
- X=0;
- P0=Data[(temp%100)%10];
- X=1;
- X=0;
- delay(1);
- if(temp>=400)
- {
- Z=0;
- }
- else Z=1;
- }
- void main()
- {
- uchar a,temp;
- do
- {
- tmpchange();//溫度轉換
- for(a=10;a>0;a--) //避免閃爍
- {
- display(tmp());//調用顯示函數
- }
- } while(1);
- }
復制代碼
所有資料51hei提供下載:
溫度計設計.zip
(247.08 KB, 下載次數: 36)
2020-7-20 20:50 上傳
點擊文件名下載附件
溫度計設計 下載積分: 黑幣 -5
|