|
該溫度檢測(cè)器,使用了10米線(xiàn)長(zhǎng)的DS18b20溫度傳感器和51開(kāi)發(fā)板,傳感器由于使用長(zhǎng)距離的接線(xiàn),所以需增加上拉電阻。使用Lcd1602顯示溫度和所設(shè)置的上限報(bào)警值,可使用矩陣鍵盤(pán)設(shè)置上限報(bào)警的溫度值,報(bào)警系統(tǒng)包括:LED燈由黃變紅,同時(shí)電機(jī)轉(zhuǎn)動(dòng)散熱。
制作出來(lái)的實(shí)物圖如下:
整體裝置(基于開(kāi)發(fā)板)
顯示情況
單片機(jī)源程序如下:
- #include "reg52.h"
- #include "temp.h" //包含ds18b20的相關(guān)函數(shù)
- #include "lcd.h" //包含Lcd的相關(guān)函數(shù)
- #define GPIO_KEY P1 //薄膜按鍵接口
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
- typedef unsigned char u8;
- void LcdWriteCom(uchar com); //選擇Lcd屏寫(xiě)入位置的函數(shù)
- void LcdWriteData(uchar dat); //在Lcd屏進(jìn)行寫(xiě)入數(shù)據(jù)操作的函數(shù)
- void LcdInit(); //Lcd初始化函數(shù)
- sbit LED_yello=P3^5; //LED黃色正極
- sbit LED_red=P3^6; //LED紅色正極
- sbit K3=P3^2; //設(shè)置按鍵
- int Ceiling=27; //初始上限值
- u8 LcdplayData[16]={'T','e','m','p',':',' ',' ',0,0,0,0,'.',0,0,'`','C'};
- u8 sz[16]="Please input: ";
- u8 shezhi[16]={'C','e','i','l','i','n','g',':',' ','2','7','`','C',' ',' ',' '};
- void Delay_ms(unsigned int ms)//延時(shí)函數(shù),延時(shí)1ms
- {
- int j;
- for(;ms>0;ms--)
- for(j=140;j>0;j--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : datapros()
- * 函數(shù)功能 : 溫度讀取處理轉(zhuǎn)換函數(shù)
- * 輸 入 : temp
- * 輸 出 : 無(wú)
- *******************************************************************************/
- int datapros(int temp)
- {
- float tp;
- int t;
- if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
- {
- LcdplayData[7] ='-'; //正負(fù)位為-
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
- }
- else
- {
- LcdplayData[7] ='+';
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
- t=temp;
- LcdplayData[8] = temp / 10000+48; //提取各位
- LcdplayData[9] = temp % 10000 / 1000+48;
- LcdplayData[10] = temp % 1000 / 100+48;
- LcdplayData[12] = temp % 100 / 10+48;
- LcdplayData[13] = temp % 10+48;
- return t;
- }
- /*******************************************************************************
- * 函數(shù)名 :LcdDisplay()
- * 函數(shù)功能 :Lcd1602顯示函數(shù)
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
- void LcdDisplay()
- {
- LcdWriteCom(0x87);
- LcdWriteData(LcdplayData[7]); //寫(xiě)入+-號(hào)
- LcdWriteData(LcdplayData[8]=='0' ? ' ':LcdplayData[8]); //輸出整數(shù)部分
- LcdWriteData(LcdplayData[9]=='0' ? ' ':LcdplayData[9]); //若是0,不輸出
- LcdWriteData(LcdplayData[10]);
- LcdWriteCom(0x8c);
- LcdWriteData(LcdplayData[12]); //輸出小數(shù)部分
- LcdWriteData(LcdplayData[13]);
- // Delay_ms(100);
- /*
- SBUF = '0'+m; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0; //發(fā)送完成標(biāo)志位清零
- */
- }
- void xinxi()//輸出兩行中的固定信息
- {
- u8 i;
- LcdWriteCom(0x01);//清屏
- LcdWriteCom(0x80);//輸出第一行的
- for (i=0;i<7;i++)
- {
- LcdWriteData(LcdplayData[i]);
- }
- LcdWriteCom(0x8b);
- LcdWriteData(LcdplayData[11]);
- LcdWriteCom(0x8e);
- LcdWriteData(LcdplayData[14]);
- LcdWriteData(LcdplayData[15]);
- LcdWriteCom(0xc0);//輸出第二行的
- for (i=0;i<16;i++)
- {
- if (i==8&&shezhi[8]=='0') shezhi[8]=' ';
- LcdWriteData(shezhi[i]);
- }
- }
- void zdkg() // 中斷開(kāi)關(guān)
- {
- EA=1;
- IT0=1;
- EX0=1;
- }
- void Int0() interrupt 0 //外部中斷0的中斷函數(shù)
- {
- u8 i,j,KeyValue;
- u16 key=0;
- if(K3==0)
- {
- Delay_ms(10);//消抖
- if(K3==0)
- {
- LcdWriteCom(0x80);
- for (i=0;i<16;i++)//輸出提示信息
- {
- LcdWriteData(sz[i]);
- }
- while (K3==0) ;//等待松手,必須確保第一次按下后已松手
- while (1)
- {
- j=0;
- GPIO_KEY=0x0f;
- while (GPIO_KEY==0x0f) //等待按下鍵盤(pán)
- {
- if (K3==0)
- {
- Delay_ms(10);
- if (K3==0)
- {
- while (K3==0) ;//等待松手,必須確保第2次按下后已松手
- goto over; //若再次按下K3按鍵,則設(shè)置完畢,可以跳出中斷
- }
- }
- }
- if (GPIO_KEY!=0x0f)//讀取按鍵是否按下
- {
- Delay_ms(10);//延時(shí)消抖
- if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤(pán)是否按下
- {
- //測(cè)試列
- GPIO_KEY=0X0f;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=1;break;
- case(0X0d): KeyValue=2;break;
- case(0X0e): KeyValue=3;break;
- }
- //測(cè)試行
- GPIO_KEY=0Xf0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue+0;break;
- case(0Xb0): KeyValue=KeyValue+4;break;
- case(0Xd0): KeyValue=KeyValue+8;break;
- case(0Xe0): KeyValue=KeyValue+12;break;
- }
- while((j<40)&&(GPIO_KEY!=0xf0)) //松手檢測(cè)
- {
- Delay_ms(10);
- j++;
- }
- switch (KeyValue)
- {
- //key計(jì)算最新鍵入的值,Ceiling存放最新鍵入的值
- case 0:key=key*10+1;Ceiling=key;break;//鍵入1
- case 1:key=key*10+2;Ceiling=key;break;//鍵入2
- case 2:key=key*10+3;Ceiling=key;break;//鍵入3
- case 3:Ceiling++;key=0;break; //按“A”,則加1,同時(shí)變量key要清零
- case 4:key=key*10+4;Ceiling=key;break;//鍵入4
- case 5:key=key*10+5;Ceiling=key;break;//鍵入5
- case 6:key=key*10+6;Ceiling=key;break;//鍵入6
- case 7:Ceiling--;key=0;break; //按“B”,則減1,同時(shí)變量key要清零
- case 8:key=key*10+7;Ceiling=key;break;//鍵入7
- case 9:key=key*10+8;Ceiling=key;break;//鍵入8
- case 10:key=key*10+9;Ceiling=key;break;//鍵入9
- case 11:break;
- case 12:key=Ceiling=0;break; //按“*”,則所有清零
- case 13:key=key*10+0;Ceiling=key;break;//鍵入0
- case 14:break;
- case 15:break; //“C”“D”“#”無(wú)操作
- }
- shezhi[8] = Ceiling % 1000 / 100+48;
- shezhi[9] = Ceiling % 100 / 10+48;
- shezhi[10] = Ceiling % 10+48;
- LcdWriteCom(0xc8);
- LcdWriteData(shezhi[8]=='0' ? ' ':shezhi[8]); //顯示設(shè)置的上限值
- LcdWriteData(shezhi[9]=='0' ? ' ':shezhi[9]);
- LcdWriteData(shezhi[10]);
- }
- }
- }
- }
- }
- over: xinxi(); //跳出中斷前重新輸出屏幕固定信息
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無(wú)
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void main()
- {
- u16 temp;
- LED_red=0;
- LED_yello=1;
- LcdInit();//初始化Lcd
- zdkg(); //打開(kāi)中斷
- xinxi(); //輸出屏幕固定信息
- while(1)
- {
- temp=datapros(Ds18b20ReadTemp()); //數(shù)據(jù)處理函數(shù)
- LcdDisplay(); //Lcd顯示函數(shù)
- if (temp>=Ceiling*100) LED_red=1,LED_yello=0; //超限報(bào)警(LED燈變紅)
- else LED_red=0,LED_yello=1;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
Ds18B20溫度檢測(cè)器(Lcd顯示、矩陣鍵盤(pán)設(shè)置上限報(bào)警、報(bào)警系統(tǒng)(LED燈亮、電機(jī)轉(zhuǎn)動(dòng)散熱).rar
(2.04 MB, 下載次數(shù): 52)
2018-3-4 15:23 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|