本文主要介紹了一個(gè)基于 AT89C51單片機(jī)的測(cè)溫系統(tǒng),詳細(xì)描述了利用數(shù)字溫度傳感器 DS18B20 開(kāi)發(fā)測(cè)溫系統(tǒng)的過(guò)程。對(duì)采集的信息都希望用最直接的方式顯示出來(lái),但是傳感器所采集的信息是模擬的信號(hào),并且信號(hào)是非常微小的,需要用放大器進(jìn)行放大。模擬信號(hào)不能直接用數(shù)字儀器直接顯示,通過(guò)模數(shù)轉(zhuǎn)換之后就可以將模擬量轉(zhuǎn)變成數(shù)字量,在通過(guò)數(shù)碼管進(jìn)行顯示。有些可以直接與單片機(jī)鏈接。數(shù)碼管有共陽(yáng)極與共陰極兩類(lèi),本次設(shè)計(jì)采用的是共陰極的七段數(shù)碼管。
設(shè)計(jì)要求:利用數(shù)字溫度傳感器 DS18B20 與單片機(jī)結(jié)合來(lái)測(cè)量溫度。利用數(shù)字 溫度傳感器 DS18B20 測(cè)量溫度信號(hào),計(jì)算后在 LED 數(shù)碼管上顯示 相應(yīng)的溫度值。其溫度測(cè)量范圍為−55℃~125℃,精確到 0.5℃;實(shí) 現(xiàn)超限報(bào)警 DS18B20 數(shù)字溫度計(jì)是 DALLAS 公司生產(chǎn)的 1-Wire ,即單總線器件,具有線路簡(jiǎn)單、體積小的特點(diǎn)。因此用它來(lái)組成一個(gè)測(cè)溫系統(tǒng),線路簡(jiǎn)單,在一根通信線上,可以掛很多這樣的數(shù)字溫度計(jì),十分方便。 DS18B20 是美國(guó)DALLAS 公司新推出的一種可組網(wǎng)數(shù)字式溫度傳感器,與 DS1820 相似,DS18B20 也能夠直接讀取被測(cè)物體的溫度值。但是與 DS1820 相比, DS18B20 的功能更強(qiáng)大些。它體積小,電壓適用范圍寬( 3--5V ),用戶還可以通過(guò)編程實(shí)現(xiàn) 9--12 位的溫度讀數(shù),即具有可調(diào)的溫度分辨率,因此它的實(shí)用性和可靠性比同類(lèi)產(chǎn)品更高。 總原理圖
溫控.png (101.22 KB, 下載次數(shù): 60)
下載附件
2020-12-31 21:56 上傳
程序部分c - #include<reg51.h>
- #include<intrins.h>
- sbit DQ=P1^7; //定義DS18B20的接受端口
- sbit p0_7=P0^7;
- sbit p3_0=P3^0; //以下五個(gè)端口為按鈕
- sbit p3_1=P3^1;
- sbit p3_2=P3^2;
- sbit p3_3=P3^3;
- sbit p3_4=P3^4;
- sbit p1_0=P1^0;
- #define uchar unsigned char
- #define uint unsigned int
- void yanshi(int ); //普通延時(shí)函數(shù)
- void jinyan(int ); // 精確延時(shí)
- void yan_us (uchar); // us級(jí)延時(shí)
- bit chushi(void); // DS18B20通信初始化
- void xie(uchar ); // 向DS18B20寫(xiě)數(shù)據(jù)
- uint du(void); // 讀取DS18B20的數(shù)據(jù)
- float chuli(uint); // 處理DS18B20返回的數(shù)據(jù)
- void xianshi(float); // 數(shù)碼管顯示函數(shù)
- uchar biao[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x71};// 數(shù)碼管0-9 的顯示數(shù)據(jù)
- bit huan=1;
- void main(void){
- uint ab=0;
- float ac=0;
- char shang=50;
- char xia =10;
- int bian=0;
- DQ=1;
- p3_0=1;
- p3_1=1;
- p3_2=1;
- p3_3=1;
- p3_4=1;
- TMOD=0x01;
- EA=0;
- ET0=0;
- while(1){
- if((ab==1)&&chushi()){ // 向DS18B20發(fā)送轉(zhuǎn)換溫度指令
- yan_us(100);
- xie(0xcc);
- xie(0x44);
- }
- if((DQ==1)&&(ab==500)&&chushi()){ //接受DS18B20的數(shù)據(jù)
- yan_us(100);
- xie(0xcc);
- xie(0xbe);
- ac=chuli(du());
- ab=0;
- }
- ab++;
- xianshi(ac); // 顯示DS18B20的溫度數(shù)據(jù)
- if(p3_4==0){ // 切換溫度顯示方式C F
- huan=~huan;
- while(!p3_4);
- }
- if(p3_0==0){ //調(diào)整上限增加
- bian=0;
- while(!p3_0){
- if(bian==200){
- shang++;
- bian=0;
- }
- bian++;
- xianshi(shang);
- }
- }
- if(p3_1==0){ // 調(diào)整上限減少
- bian=0;
- while(!p3_1){
- if(bian==200){
- shang--;
- bian=0;
- }
- bian++;
- xianshi(shang);
- }
- }
- if(p3_2==0){ // 調(diào)整下限增加
- bian=0;
- while(!p3_2){
- if(bian==200){
- xia++;
- bian=0;
- }
- bian++;
- xianshi(xia);
- }
- }
- if(p3_3==0){ // 調(diào)整下限減少
- bian=0;
- while(!p3_3){
- if(bian==200){
- xia--;
- bian=0;
- }
- bian++;
- xianshi(xia);
- }
- }
- if(ac<xia||ac>shang) // 判斷溫度示數(shù)是否超上下限
- p1_0=1;
- else
- p1_0=0;
- }
- }
- void yanshi(int a){
- int b;
- while(a--){
- for(b=0;b<110;b++);
- }
- }
- void jinyan(int a){
- TH0=(65536-a)/256;
- TL0=(65536-a)%256;
- TR0=1;
- while(!TF0);
- TF0=0;
- TR0=0;
- }
- void yan_us(uchar a){
- while(a--);
- }
- bit chushi(void){
- uchar a=0;
- DQ=0;
- yan_us(100);
- DQ=1;
- while(DQ){
- if(a==200)
- return 0;
- a++;
- }
- a=0;
- while(!DQ){
- if(DQ==250)
- return 0;
- a++;
- }
- return 1;
- }
- void xie(uchar a){
- char b;
- bit c;
- for(b=0;b<8;b++){
- c=a&0x01;
- if(c){
- DQ=0;
- _nop_();
- _nop_();
- DQ=1;
- yan_us(13);
- }
- else {
- DQ=0;
- yan_us(13);
- DQ=1;
- }
- a=a>>1;
- }
- }
- uint du(void){
- uint a=0,b=0;
- bit c=0;
- char d;
- for(d=0;d<16;d++){
- DQ=0;
- _nop_();
- _nop_();
- DQ=1;
- _nop_();
- _nop_();
- _nop_();
- c=DQ;
- b=c;
- b=b<<d;
- a=a|b;
- b=0;
- yan_us(9);
- }
- DQ=0;
- yanshi(2);
- DQ=1;
- return a;
- }
- float chuli(uint a){
- float b;
- if(a>=32768){
- a=~a;
- a++;
- b=(float)a;
- b=b/(-16);
- }
- else {
- b=(float)a;
- b=b/16;
- }
- return b;
- }
- void xianshi(float a){
- uint b,c;
- if(!huan)
- a=32+a*1.8;
- if(a<0){
- a=a*(-1);
- b=(uint)a;
- a=(a-b)*10;
- c=(uint)a;
- P2=0x00;
- P0=0x40;
- P0=0x00;
- }
- else{
- b=(uint)a;
- a=(a-b)*10;
- c=(uint)a;
- }
- P2=0x01;
- P0=biao[b/100];
- P0=0x00;
- P2=0x02;
- P0=biao[(b/10)%10];
- P0=0x00;
- P2=0x03;
- P0=biao[b%10];
- p0_7=1;
- P0=0x00;
- P2=0x04;
- P0=biao[c];
- P0=0x00;
- P2=0x05;
- if(huan)
- P0=biao[10];
- else
- P0=biao[11];
- P0=0x00;
- }
復(fù)制代碼
仿真結(jié)果
溫控仿真1.png (105.26 KB, 下載次數(shù): 76)
下載附件
2020-12-31 21:55 上傳
|