|
這次作品的設(shè)計初衷是源自個人的生活經(jīng)驗,希望和我有著一樣麻煩的技術(shù)宅會喜歡這個設(shè)計。當(dāng)代快節(jié)奏的工作生活中,忙忙碌碌總使得我們疲憊不堪,一杯熱咖啡,一杯溫水也許是現(xiàn)代都市人最便捷的放松方式。對于長期坐在電腦前的技術(shù)宅來說,一杯熱飲除了可以補充我們必須的水分,也可以使我們適當(dāng)?shù)男№?/font>
筆者作為職業(yè)碼農(nóng),卻常常遇到這樣的困擾:早上沖好的咖啡,放著放著就涼了,同事胃不好,需要喝溫水,可一忙就忘記了,常常是整杯水都放涼了才想起。想必每個人都有這樣的經(jīng)歷,這次的設(shè)計,就是給大家解決這一問題,除了可以節(jié)約水資源,還能及時提醒人們飲用熱飲,喜歡喝熱飲的朋友,以后不必再因為冷卻的熱飲而苦皺眉頭了!
工作原理:
值得補充的是,這次的杯墊是用廢棄的光盤制作的(無意中給華碩做廣告了),中間的硬幣就是導(dǎo)熱材料,下面涂了硅脂,和DS18B20粘在一起。DS18B20就是這次設(shè)計的核心,通過感應(yīng)溫度、并記錄溫度達到提醒人們喝熱飲的功能。在使用非隔熱杯子的前提下(材料不限,只要不是隔熱的),杯子內(nèi)液體的溫度勢必會影響杯子表層溫度,雖然我們不確定杯子表層溫度的具體數(shù)值,但可以肯定的是,杯子的溫度是和里面液體的溫度是正比的。根據(jù)這個原理,當(dāng)使用者覺得某個時刻的熱飲溫度剛剛好適合自己飲用時,就把杯子放到杯墊上,稍等五六秒鐘,給DS18B20一點時間來升溫,然后按下“記憶”鍵,此時杯子外部的溫度就被記錄到了單片機的eeprom里了,即便是斷電后,此數(shù)據(jù)仍會存在。
當(dāng)下次沖好了一杯咖啡,就可以把杯子放到杯墊上面了,溫度傳感器會將采集到的溫度T值與eeprom里的數(shù)值A做比較,當(dāng)A-1 < T < A+1 時,杯墊側(cè)面的八個二極管就會閃爍,以此來提示主人喝咖啡!
溫度的差值也可以根據(jù)設(shè)計者自行改變,比如在比較寒冷的地區(qū),T與A的差值可以通過改變程序來實現(xiàn),我在南方,實際測試的時候發(fā)現(xiàn)T與A的值在正負(fù)1之間就足夠了。
記憶鍵在向單片機記錄溫度數(shù)據(jù)的時候,也會擦除之前的數(shù)據(jù),這樣一個按鈕就可以完成杯墊的操作。
作為單片機系統(tǒng)來說,其實就是DS18B20和eeprom的應(yīng)用,國產(chǎn)的stc單片機大多數(shù)都自帶了一定大小的eeprom,這就給設(shè)計者帶來了極大的方便。為了讓電路更加簡潔,這次選用的是STC11F04E的1T單片機,具備4K的程序存儲空間和1K的eeprom空間,20管腳的封裝設(shè)計大大減小了PCB面積。下面就是原理圖:
程序設(shè)計:
這里要做出說明的是,大多數(shù)DS18B20程序代碼都是12T單片機下設(shè)計的,而1T單片機指令速度要比12T單片機快很多,這就導(dǎo)致了DS18B20程序不能直接拿來調(diào)用。筆者根據(jù)stc的官方資料,通過計算指令外加邏輯分析儀測試的方式,得出的結(jié)論是,11系列的1T單片機要比12T單片機指令快6.5倍左右,根據(jù)這個數(shù)據(jù)來修改原始DS18B20程序的延時程序和eeprom程序,這樣就能保證系統(tǒng)的穩(wěn)定性。
STC的官方資料很明確的給出了eeprom的原始程序,筆者根據(jù)自己的理解,對官方程序作了一些改動,為了使程序更加簡潔,應(yīng)用了C語言的宏定義,自己也是做了對應(yīng)的庫文件,方便實用,F(xiàn)在的程序代碼略長,我整理后會補發(fā)。原理圖我是用proteus畫的,并不是實物中的STC11F04E單片機,但端口是通用的,只需要根據(jù)原理圖對應(yīng)STC11F04E單片機連線即可。程序公開情況請關(guān)注工作室騰訊微博:Chinked-out(@136678431)。
制作過程:
一、準(zhǔn)備工作
圖1
1、像圖1中這樣,給DS18B20接好導(dǎo)線,并做好絕緣。
圖2
2、利用易拉罐,剪出兩個直徑在3.5CM左右的圓形
圖3
3、準(zhǔn)備圖3中這種較厚的雙面膠,五金店里都有賣,很便宜
4、根據(jù)原理圖焊接好的電路板,由于電路很簡單,這里我就不做過多解釋了。
二、組裝
圖4
1、像圖4這樣,用雙面膠粘好溫度傳感器和一個金屬原片
圖5
2、如圖5,把剛剛步驟中的圓片粘在光盤上,注意是溫度傳感器在光盤中間的圓孔位置。
圖6
3、把光盤反過來,由于另一面已經(jīng)固定好了,就可以直接涂硅脂了,可以多涂點,保證下一步的順利
圖7
4、然后把四周涂有502膠水的金屬圓片像圖中那樣粘在光盤中間(因為大多數(shù)杯子的底部都是凹進去的,所以為了增加接觸面,可以用有一定厚度的金屬,比如一元硬幣,視頻中的實物就是硬幣)
圖8 圖9
待膠水干后,就可以在光盤的地面操作了,將電池盒(7號)和電路板粘在光盤上,用前文說的這種雙面膠效果很好的,不僅粘的結(jié)實,還可以調(diào)整高度,保證光盤翻過來放置時是水平的。
源代碼:
- #include "stc11fxx.h"
- #include "INTRINS.H"
- #include "basic.h"
- #include "STC11Fxx_IAP.H"
- #define Address 0x0200
- sbit DQ=P3^7;
- sbit key1 = P3^5;
- sbit key2 = P3^4;
- sbit key3 = P3^3;
- Word temp,t1,t2;
- Byte m,n,w,p;
- void delay(Word i);
- void Init_DS18B20();
- Byte ReadOneChar();
- Byte WriteOneChar(Byte dat);
- void tmpchange();
- void tmp();
- void display();
- void UartInit();
- void Delay500ms();
- void Delay150ms();
- void Delay50ms();
- void IAP_Wait ();
- Byte IAP_Read (Word addr);
- void IAP_Program (Word addr,Byte dat);
- void IAP_Erase (Word addr);
- void key();
- void Delay180ms();
- void main()
- {
- Delay180ms();
- // P1=0x00;
- w=IAP_Read(Address);
- do
- {
- tmpchange();
- tmp();
- display();
- P1=temp;
- key();
- }
- while(1);
- }
- /* 延時子程序 */
- void delay(Word i) //delay
- {
- while(i--);
- }
- /* 初始化ds18b2子函數(shù)* */
- void Init_DS18B20()
- {
- DQ = 0; //單片機將DQ拉低
- delay(390); //精確延時 大于 480us
- DQ = 1; //拉高總線
- delay(130);
- }
- /* 讀字節(jié)子函數(shù) */
- Byte ReadOneChar()
- {
- Byte i = 0;
- Byte dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1; // 數(shù)據(jù)右移一位
- DQ = 1; // 給脈沖信號
- if(DQ) // DQ為1
- dat|=0x80; // 讀出數(shù)據(jù)
- delay(45); // 延時
- }
- return(dat);
- }
- /* 寫字節(jié)子函數(shù) */
- Byte WriteOneChar(Byte dat)
- {
- Word i = 0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01; //寫入一位數(shù)據(jù)
- delay(45);
- DQ = 1;
- dat>>=1; //右移一位數(shù)據(jù)
- }
- return(dat);
- }
- /* 發(fā)送溫度轉(zhuǎn)換命令 */
- void tmpchange() // DS18B20 begin change
- {
- Init_DS18B20(); // 初始化DS18B20
- WriteOneChar(0xcc); // 跳過序列號命令
- WriteOneChar(0x44); // 發(fā)送溫度轉(zhuǎn)換命令
- }
- /* 讀出溫度函數(shù) */
- void tmp() //get the temperature
- {
- Init_DS18B20(); // 初始化ds18b2子函數(shù)
- WriteOneChar(0xcc); // 跳過ROM命令
- WriteOneChar(0xbe); // 發(fā)送讀取數(shù)據(jù)命令
- m=ReadOneChar(); // 連續(xù)讀兩個字節(jié)數(shù)據(jù)
- n=ReadOneChar();
- temp=n;
- temp<<=8;
- temp=temp|m; // 兩字節(jié)合成一個整型變量。
- temp=temp>>4;
- }
- void Delay180ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 8;
- j = 145;
- k = 99;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void IAP_Wait ()
- {
- IAP_CONTR = 0;
- IAP_CMD = 0;
- IAP_TRIG = 0;
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
- Byte IAP_Read (Word addr)
- {
- Byte dat;
- Set_IAP_CMD(Read);
- Set_IAP_addr;
- Set_IAP_On;
- dat=IAP_DATA;
-
- IAP_Wait();
- return dat;
- }
- void IAP_Program (Word addr,Byte dat)
- {
- Set_IAP_CMD(Program);
- Set_IAP_addr;
- IAP_DATA=dat;
- Set_IAP_On;
- IAP_Wait();
- }
- void IAP_Erase (Word addr)
- {
- Set_IAP_CMD(Erase);
- Set_IAP_addr;
- Set_IAP_On;
- IAP_Wait();
- }
- void key()
- {
- if(key1==0)
- {
- Delay180ms();
- if(key1==0)
- {
- IAP_Erase(Address);
- IAP_Program(Address,temp);
- p=IAP_Read(Address);
- }
- }
- loop:if(key2==0)
- {
- p=IAP_Read(Address);
- P1=p;
- goto loop;
- }
- }
- void display()
- {
- //loop2:
- w=IAP_Read(Address);
- tmpchange(); //溫度轉(zhuǎn)換
- tmp();
- t1=temp;
- Delay150ms();
- tmpchange(); //溫度轉(zhuǎn)換
- tmp();
- if(temp<t1)
- {
- if((w-1)<temp&&temp<(w+1))
- {
- loop2:
- P1=0xaa;
- Delay150ms();
- P1=0x55;
- Delay150ms();
- goto loop2;
- }
- }
- }
-
- void Delay150ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 7;
- j = 78;
- k = 167;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay50ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 3;
- j = 26;
- k = 223;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
復(fù)制代碼
原理圖與完整源代碼下載:
記憶杯墊(含源代碼).zip
(70.19 KB, 下載次數(shù): 174)
2015-10-30 15:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|