-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 00:21am
剛剛終於把程式寫完了,接上電路,效果不賴,目前的功能: 1.時間功能.可設定(未來可能會拿掉!) 2.溫度更新時間為一秒鐘(DS1821的限制) 3.溫度解析度為1度(DS1821的限制) 4.顯示器,背光,夜間可導引方向 都是一些很簡單的功能 目前正在規劃 1.溫度上下限設定(使用鍵盤) 2.設備損壞警告音 3.溫度C轉F 4.停電通知(10秒鐘) 5.上下限溫度可顯示於LCD上 [color=#DC143C]6.自動開關燈設定+燈具損壞警告音(如果時間功能還在)[/color] 7.感測器可拉長1.5M 8.設備保護功能 9.由市電取得電源 未來更強功能!! 1.可同時使用8個感測器 2.省電功能 看圖吧,如果你想要可別寫信給我,目前只是測試版,Bug很多,可能會當機
[UploadFile=100_5161_1260001192.jpg] [UploadFile=100_5163_1260001233.jpg]
-- 作者: cyriax
-- 發表時間: 2009/12/06 01:14am
好厲害喔!! 等您造福大家喔!! 還是讓大家中毒更深呢!!! ^_^
-- 作者: playerst
-- 發表時間: 2009/12/06 02:16am
我記得一個偵測器就要一個port了耶 但是微處理機似乎只有4個port 還是有更強的單晶片??
-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 02:25am
[這篇文章最後由批批批批批批在 2009/12/06 02:28am 第 2 次編輯]
DS1821是使用單線控制喔,它是使用串列傳輸的方式 我使用的微處理機是最嫩的(89s51) DS1821控制有點難,要花點心思去看Datasheet http://www.farnell.com/datasheets/77165.pdf 如果你想玩玩看,這裡有Datasheet 還有我之前寫的程式(只能看溫度) #include "at89x51.h" #include "intrins.h" #define LCDP P1 sbit RS=P3^2; sbit RW=P3^1; sbit EN=P3^0; sbit SW1=P2^0; #define DQ P2_1 void H(void); void L(void); void DS_Reset(void); void SCT(void); void RT(void); bit DQ0; bit DQ1; bit DQ2; bit DQ3; bit DQ4; bit DQ5; bit DQ6; bit DQ7; void init_LCM(void); void write_inst(char); void write_data(char); void write_pat(void); void delay(int); void debouncer(void); char LCMD[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; char pat[16]={0x08,0x14,0x0b,0x04,0x04,0x04,0x03,0x00, 0x08,0x14,0x0b,0x04,0x07,0x04,0x04,0x00}; char line1[]="Temp = "; char line2[]=" "; int TempC,TempF; char key,n; bit dcdf=0; main() {int a,b,c,d,e,f,g; init_LCM(); write_pat(); while(1) {DS_Reset(); SCT(); delay(6000); DS_Reset(); RT(); a=!DQ0; b=!DQ1; c=!DQ2; d=!DQ3; e=!DQ4; f=!DQ5; g=!DQ6; TempC=a+b*2+c*4+d*8+e*16+f*32+g*64; TempF=(TempC*9/5)+32; write_inst(0x80); for(n=0;n<16;n++) {write_data(line2[n]); } if(dcdf==0) {write_inst(0xc0); for(n=0;n<12;n++) {write_data(line1[n]); } if((TempC/100)%10!=0) {write_data(LCMD[(TempC/100)%10]); } else {write_data(0x20); } write_data(LCMD[(TempC/10)%10]); write_data(LCMD[TempC%10]); write_data(0x00); } else {write_inst(0xc0); for(n=0;n<12;n++) {write_data(line1[n]); } if((TempF/100)%10!=0) {write_data(LCMD[(TempF/100)%10]); } else {write_data(0x20); } write_data(LCMD[(TempF/10)%10]); write_data(LCMD[TempF%10]); write_data(0x01); } if(SW1==0) {debouncer(); dcdf=~dcdf; while(SW1==0); } } } void H(void) {DQ=0; _nop_();_nop_();_nop_();_nop_();_nop_(); DQ=1; delay(2); } void L(void) {DQ=0; delay(2); DQ=1; _nop_();_nop_();_nop_();_nop_();_nop_(); } void DS_Reset(void) {DQ=0; delay(20); DQ=1; delay(10); } void SCT(void) {L(); H(); H(); H(); L(); H(); H(); H(); } void RT(void) {L(); H(); L(); H(); L(); H(); L(); H(); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ0=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ1=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ2=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ3=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ4=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ5=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ6=!DQ; delay(2); DQ=0; _nop_();_nop_(); DQ=1; _nop_();_nop_();DQ7=!DQ; delay(2); } void init_LCM(void) {write_inst(0x30); write_inst(0x30); write_inst(0x30); write_inst(0x38); write_inst(0x08); write_inst(0x01); write_inst(0x06); write_inst(0x0c); } void write_inst(char inst) {RS=0; RW=0; EN=1; LCDP=inst; delay(100); EN=0; } void write_data(char dat) {RS=1; RW=0; EN=1; LCDP=dat; delay(10); EN=0; } void write_pat(void) {char i; RS=0; RW=0; EN=1; LCDP=0x40; delay(100); EN=0; RS=1; RW=0; for(i=0;i<16;i++) {write_data(pat[i]); } } void delay(int t) {int i; for(i=0;i<t;i++); } void debouncer(void) {int i; for(i=0;i<2400;i++); }
-- 作者: playerst
-- 發表時間: 2009/12/06 02:38am
如果改用組語寫架構會變大嗎? 因為我想用組語寫 雖然困難度會很高
-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 02:45am
[這篇文章最後由批批批批批批在 2009/12/06 02:54am 第 1 次編輯]
組合語言.....程式碼會很長,可是編譯出來HEX檔會比C語言小一點 [UploadFile=09BCC6A6ECB9qA4l_1260010341.rar] 靈感來自這裡.....如果要焊接,電路要稍微小改
-- 作者: arvin
-- 發表時間: 2010/03/19 01:23am
建議用C語言寫,這樣會比較輕鬆也容易維護,組合語言對乘除法會比較麻煩 另外批批批批批批大,建議你最好用timer中斷,會比用polling來的好。
-- 作者: csyin
-- 發表時間: 2010/03/19 01:39am
C語言不能燒在IC裡面吧?
-- 作者: playerst
-- 發表時間: 2010/03/19 01:47am
現在是可行的 早期因為微處理機記憶體小(成本問題) 所以選擇空間較小的組語 現在記憶體超便宜 很多人都用c寫摟
-- 作者: arvin
-- 發表時間: 2010/03/19 02:01am
是的,playerst大說的沒錯,現在micro control大都用C來取代組語了 4K亦足夠了,除非你含括一些特殊函式庫,那就不夠用了
-- 作者: 麻毬
-- 發表時間: 2010/03/20 03:34am
阿! 可能會當機!? 批大難道忘了在硬體上加上看門狗電路? 1個R,1個C、1支2極體、1隻輸出腳加上個位數的指令而已,批大還是加上吧!!
-- 作者: 批批批批批批
-- 發表時間: 2010/03/20 07:17am
[這篇文章最後由批批批批批批在 2010/03/20 07:22am 第 2 次編輯]
問題解決了,只是一般溢位的問題(時鐘的問題) 目前要考試,這種東西以後再玩嚕 打算用pic的單晶片 8051才4k :em01: 這就是timer中斷阿,礙於智慧財產權,這程式就不放嚕 未來還要用外部時脈控制時鐘,比較準 目前一個星期誤差2秒...
-- 作者: 旭
-- 發表時間: 2010/03/20 07:33am
[這篇文章最後由旭在 2010/03/19 11:39pm 第 1 次編輯]
我的已經在用了,花了不少時間跟精力,等有空再改進 這是我以前的貼圖 http://www.chinese-cp.com/forum/viewthread.php?tid=3129 目前功能: Time 系統時間調整 Lcd液晶背光燈時間調整,單位:秒(0秒為常亮) Light植物光照時間設定,分別為開啟時間和關閉時間(“開”“關”項為光照控制是否允許) Temp24小時溫度設定,單位:小時 (Mod"0-9"為控溫模式,0不控溫....) Water澆花時間設定(一天可設定連續5次不同澆花時間,可設置星期幾不澆花) Fan通風扇時間設定(每隔N時間啟動) safe安全溫度設定(設上限下限,過溫發出報警聲並斷開總電源繼電器保護,啟動排風扇1分鐘,溫度恢復正常後繼電器自動接通) 溫度探頭損壞或斷線,顯示“錯誤”發出報警聲,啟動排風扇1分鐘,並斷開控溫電源 斷電光照狀態恢復
溫度控制MOD 0 不控溫 1 開0秒; 延時0秒後關 2 開1秒; 延時1秒後關 3 開2秒; 延時2秒後關 4 開6秒; 延時5秒後關 5 開10秒; 延時7秒後關 6 開15秒; 延時9秒後關 7 開20秒; 延時12秒後關 8 開25秒; 延時15秒後關 9 開1秒; 延時15秒後關(適合夏天制冷用) [img]http://www.chinese-cp.com/forum/attachments/month_0912/091208001616b5bd8ee50ed55b.jpg[/img] [img]http://www.chinese-cp.com/forum/attachments/month_0912/09120808184a690f2cd1fe7ceb.jpg[/img]
-- 作者: 旭
-- 發表時間: 2010/03/20 07:51am
現在用的是STC89c58rd,能裝32K的程序,現在用了11440字節,使用DS18B20溫度傳感器,DS1302實時時鐘,1602液晶,調整使用了3個按鍵
|