|
這是我做的51單片機(jī)溫度探測(cè)控制器
用了一個(gè)多星期
附件包括原理圖和程序
基本原理是 用DS18B20溫度傳感器檢測(cè)溫度 然后經(jīng)過51控制制冷制熱設(shè)備開關(guān)
并且實(shí)時(shí)顯示溫度
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (46.61 KB, 下載次數(shù): 87)
下載附件
2018-5-8 05:08 上傳
0.png (51.52 KB, 下載次數(shù): 102)
下載附件
2018-5-8 05:08 上傳
0.png (48.17 KB, 下載次數(shù): 71)
下載附件
2018-5-8 05:08 上傳
單片機(jī)源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #include<math.h>
- #include<INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- /******************************************************************/
- /* 定義端口 */
- /******************************************************************/
- sbit buzzer=P1^0;//蜂鳴器端口
- sbit led1=P1^1; //led指示燈,當(dāng)前溫度高于設(shè)置的最高溫度時(shí)點(diǎn)亮
- sbit led2=P1^2; //led指示燈,當(dāng)前溫度低于設(shè)置的最低溫度時(shí)點(diǎn)亮
- sbit DQ=P1^4; //ds18b20 端口
- sbit key1=P3^4; //按鍵
- sbit key2=P3^5;
- sbit key3=P3^6;
- sbit key4=P3^7;
- /******************************************************************/
- /* 全局變量 */
- /******************************************************************/
- uint temp;//當(dāng)前溫度值
- uchar TempH=0,TempL=0;
- int temp_max,temp_min;//設(shè)定溫度的最大值和最小值
- uchar flag_get,count,num;
- uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
- uchar str[4];//四位數(shù)碼管顯示字符
- uchar display_mod;//數(shù)碼管顯示模式
- /******************************************************************/
- /* 函數(shù)聲明 */
- /******************************************************************/
- unsigned int ReadTemperature(void);//讀取溫度函數(shù)
- void Init_DS18B20(void);//18b20初始化函數(shù)
- unsigned char ReadOneChar(void);//18B20讀一個(gè)字節(jié)
- void WriteOneChar(unsigned char dat);//18B20寫一個(gè)字節(jié)
- void delay(unsigned int i);//短延時(shí)
- void delay_ms(uint z);//長(zhǎng)延時(shí)
- void alarm();//報(bào)警
- void keyscan();//鍵盤掃描
- /******************************************************************/
- /* 主函數(shù) */
- /******************************************************************/
- main()
- {
- display_mod=0;//顯示當(dāng)前溫度
- temp_min=10;//設(shè)置最低溫
- temp_max=40;//設(shè)置最高溫
- TMOD|=0x01;//定時(shí)器設(shè)置
- TH0=0xef; //定時(shí)器初值
- TL0=0xf0;
- IE=0x82;//EA=1,ET0=1
- TR0=1; //開定時(shí)器
- P2=0xff;
- count=0;
- while(1)
- {
- keyscan();//獨(dú)立按鍵掃描
-
- if(flag_get==1)
- {
- flag_get=0;// 獲取溫度標(biāo)志清零
- temp=ReadTemperature();//讀溫度值
- }
- if(display_mod==0)
- {
- if(temp&0x8000)
- {
- str[0]=0xbf;//負(fù)號(hào)標(biāo)志
- temp=~temp; //取反加1
- temp +=1;
- }
- else
- {
- str[0]=0xff;
- }
- TempH=temp>>4;
- TempL=temp&0x0F;
- TempL=TempL*6/10;//小數(shù)近似處理
-
- str[1]=tab[(TempH%100)/10]; //十位溫度
- str[2]=tab[(TempH%100)%10]&0x7f; //個(gè)位溫度,帶小數(shù)點(diǎn)
- str[3]=tab[TempL];
- }
- else if(display_mod==1)//顯示最低溫
- {
- str[0]=0xc7;//顯示L
- str[1]=tab[temp_min/100]; //溫度百位
- str[2]=tab[(temp_min%100)/10]; //溫度十位
- str[3]=tab[temp_min%10];//溫度個(gè)位
- }
- else if(display_mod==2)//顯示最高溫
- {
- str[0]=0x89;//顯示H
- str[1]=tab[temp_max/100]; //溫度百位
- str[2]=tab[(temp_max%100)/10]; //溫度十位
- str[3]=tab[temp_max%10];//溫度個(gè)位
- }
- alarm();
- }
- }
- /******************************************************************/
- /* 定時(shí)器中斷 */
- /******************************************************************/
- void tim(void) interrupt 1 using 1//中斷,用于數(shù)碼管掃描和溫度檢測(cè)間隔
- {
- TH0=0xea;//定時(shí)器重裝值
- TL0=0xf0;
- num++;
- if (num==100)
- {
- num=0;
- flag_get=1;//獲取溫度標(biāo)志位有效
- }
- count++;
- if(count==1)
- {
- P2=0Xfe;
- P0=str[0];
- }//數(shù)碼管掃描
- if(count==2)
- {
- if(str[1]==tab[0])
- str[1]=0xff;//顯示為空
- P2=0Xfd;
- P0=str[1];
- }
- if(count==3)
- {
- P2=0Xfb;
- P0=str[2];
- }
- if(count==4)
- {
- P2=0Xf7;
- P0=str[3];
- count=0;
- }
- }
- /******************************************************************/
- /* 長(zhǎng)延時(shí)函數(shù) */
- /******************************************************************/
- void delay_ms(uint z) //長(zhǎng)延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******************************************************************/
- /* 短延時(shí)函數(shù) */
- /******************************************************************/
- void delay(unsigned int i)//短延時(shí)函數(shù)
- {
- while(i--);
- }
- /******************************************************************/
- /* 初始化 */
- /******************************************************************/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復(fù)位
- delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- delay(80); //精確延時(shí) 大于 480us
- DQ = 1; //拉高總線
- delay(10);
- x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
- delay(5);
- }
- /******************************************************************/
- /* 讀一個(gè)字節(jié) */
- /******************************************************************/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號(hào)
- dat>>=1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ)
- dat|=0x80;
- delay(5);
- }
- return(dat);
- }
- /******************************************************************/
- /* 寫一個(gè)字節(jié) */
- /******************************************************************/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- delay(5);
- DQ = 1;
- dat>>=1;
- }
- delay(5);
- }
- /******************************************************************/
- /* 讀取溫度 */
- /******************************************************************/
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned int b=0;
- unsigned int t=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
- delay(200);
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
- a=ReadOneChar(); //低位
- b=ReadOneChar(); //高位
- b<<=8;
- t=a+b;
- return(t);
- }
- /******************************************************************/
- /* 獨(dú)立鍵盤掃描函數(shù)并顯示設(shè)定的溫度 */
- /******************************************************************/
- void keyscan()
- {
- static uchar keynum;//用于切換界面時(shí)按鍵計(jì)數(shù)
- P3=0xff;//拉高P3口,以讀取P3口的值
- if(key4==0)//設(shè)置鍵
- {
- delay_ms(5);//延時(shí)消抖
- if(key4==0)
- {
- keynum++;
- keynum%=2;//在0、1間變化
- if(keynum==1)
- {
- display_mod=1;
- }
- else
- {
- display_mod=2;
- }
- }
- while(!key4);//松手檢測(cè)
- }
- if(key3==0)//確定鍵
- {
- delay_ms(5);
- if(key3==0)
- {
- keynum=0;
- display_mod=0;
- }
- while(!key3);
- }
- if(key2==0)//加鍵
- {
- delay_ms(5);//延時(shí)消抖
- if(key2==0)
- {
- if(display_mod==2)
- {
- temp_max++;
- if(temp_max>=99)
- temp_max=99;
- }
- if(display_mod==1)
- {
- temp_min++;
- if(temp_min>=temp_max)
- temp_min=temp_max;
- }
-
- }
- while(!key2);//松手檢測(cè)
- }
- if(key1==0)//減鍵
- {
- delay_ms(5);
- if(key1==0)
- {
- if(display_mod==2)
- {
- temp_max--;
- if(temp_max<=temp_min)
- temp_max=temp_min;
- }
- if(display_mod==1)
- {
- temp_min--;
- if(temp_min<=0)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
程序.rar
(38.52 KB, 下載次數(shù): 121)
2018-5-7 14:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
DXP格式.rar
(431.81 KB, 下載次數(shù): 140)
2018-5-7 14:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|