
顯示現在的室內溫度是:26度(在這里要感謝"科美圖--黃工,印制板做得很好!)
很高興經過7天的調試,我的溫度測量程序終于成功了,經過本次溫度測量硬件的設計和軟件的設計,我有一點心得和大家一同分享! 1、 作為單片機智能電子產品的開發,首先要撐握電子硬件的設計,在硬件設計中要對所使用的單片機特點進行綜合了解,怎么良好地去配合傳感器工作是設計的重點; 2、 當我們確認好硬件正確后就進入到軟件開發設計,在軟件開發過程中會出現非常多的問題,如晶振的偏差在時序上的影響,用軟件延時和定時器延時的效果在C語言上有著相當大的計算偏差;對于時序性很強的單總線I2C器件,最好采用定時器進行最小1微秒的精確時間延時,從而提高了時間的較強的可控性也提高了成功的概率。如果你一定要用軟件延時的話,那你手上最好要有臺“示波器”,C語言編譯后的時間誤差讓我在這個溫度測量程序上走了很多的彎路,用軟件進行時間防真時,延時時間是15微秒,然而當一用示波器來測量時卻可能達到了30微秒或者10微秒,對于“I2C協議”則是非常大的誤差了,注定不能成功。 3、 硬件設計確認了調試仍不成功的,不要一味的懷疑是硬件有問題,或者說花大量時間去找硬件問題;因為問題根本不是在硬件上。當我調這款程序時怎么調都沒有反映,就連CPU不能識別有傳感器存在,讓我郁悶了幾天!結果靈機一動,想到試驗室有一臺RIGOL/100MHZ的示波器,然后將程序分解成若干個功能段分批調試,終于發現是延時不準確造成的。 4、 盡信書等于沒書;這個程序讓我真正的體會到了這一點!我在做這個項目的時間最初是參考書上的程序來寫,但是怎么也調不成功,百思不得其解啊!暈!!!!程序寫得沒有任何的語法錯誤啊!Keil軟件也通過了編譯沒有錯誤!但還是不行??最終當我將程序分段進行防真時發現書上的程序還是寫錯了,他錯在語句的時序上有問題,當然Keil軟件是不能發現這個錯誤的,因為Keil軟件只能發現語法上的錯誤,而不能發現語句時序安排上的錯誤。 5、 在寫程序調試中,軟件編寫者應該對硬件電路結構了解,不要你做你的硬件,我做我的軟件大家互不相干!一個智能電子產品,是硬件和軟件的結晶,少了誰都不能統一!在設計軟件的功能時,應盡量將程序簡單化,需要觀察的變量或輸出觀察的變量,最好先用8位LED指示燈來顯示,這樣不僅可能看到有沒有數據的變化,而且還可以通過LED位顯示來自己計算數據是不是自己想要的東東!如果是的話,恭喜你,你的程序調試好一段了喲! 6、 我認為單片機學習者還是要先學習匯編語言,然后再升華到C語言!對于這兩種語言我是深有體會的,當你學會C語言那再學VB語言就輕松得很。初學時應該要了解單片機內部的結構,如ROM是什么意思,有什么作用;RAM是什么意思,有什么作用等等;然后用匯編指令時行一步步的編寫程序;匯編語言的特點是必須對單片機內部結構很了解才能針對性的開發程序,而且精度是很高的,因為匯編語言的編程方式用一個小例子來說明:如平時我們計算2*10=20,我們一下就心算出來了;但用匯編語言呢它是這樣算的:2+2+2一直加10個2等于20,也就是用了10步才完成計算的,這樣你就要寫10步程序;而C語言的算法就和我們人一樣,一步搞定;但C語言時卻不如匯編來的精確,因而對于一個程序高手來說采用混編的辦法來設計程序,又用C又用匯編用到極致! 最后!通過大量的設計和編程,我的第一塊單片機開發板終于問世了!!!我的開發板上面的功能如下: 1)、在線ISP下載程序; 2)、USB接口下載和電源二合一功能; 3)、LCD1602液晶顯示(漂亮的藍色底白色字喲!) 4)、32個I/O口全部擴展,讓您想怎么用就怎么用; 5)、三位紅字數碼管顯示同時帶小數點; 6)、電磁式蜂嗚器,可以用來作提示音或放音樂喲! 7)、6位帶位選的LED顯示功能,讓你的設計調試不再寂寞; 8)、5個獨立按鍵,在電路板上還標有箭頭呢,讓你做電子鐘,或調光程序更直接明了; 9)、一個EEPROM非易失存儲器,讓你學會用I2C協議;這個協議很有用喲!什么照相機、打印機、U盤、MP3、數字收間機都用這個協議呢!你說用處大不大? 10)、一體化紅外接收頭,可以用這個實現紅外控制,讓控制電器變得更簡單; 11)、都用了高品質的電子元件,還配了光盤,里面有安裝軟件、教學程序,一條USB數據線,還有送二個高品質的STC單片機喲! 下面是我寫的室溫測量程序: - #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- sbit DQ=P3^7;
- sbit D1=P0^1;
- sbit D2=P0^2;
- sbit D3=P0^3;
- uchar code table[]={0x03,0xf3,0x25,0x0d,//0,1,2,3
- 0x99,0x49,0x41,0x1b,//4,5,6,7
- 0x01,0x09};//8,9,.,段碼表
-
- /////////////////////////////////////////////////////////////
- void delay(unsigned int us)
- {
- while(us--);
- }
- ////////////////////////////////////////////
- void reset()// DS18B20復位OK
- {
- uchar x=0;
- DQ=1;
- delay(8);
- DQ=0;
- delay(330);
- DQ=1;
- delay(100);
- x=DQ;
- delay(20);
- }
- ////////////////////////////////////////////從DS18B20讀一字節
- uchar readbyte()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- delay(28);//41us
- }
- return(dat);
- }
- /////////////////////////////////////////////向DS18B20寫一字節
- void writebyte(unsigned char dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(8);
- if(DQ==0)
- {
- delay(28);//41us
- DQ=1;
- }
- else
- {
- DQ=1;
- delay(28);//41us
- }
- dat>>=1;
- }
- }
- ////////////////////////////////////////////MCU讀取溫度值
- uchar readtemp()
- {
- uchar a=0;
- uchar b=0;
- reset();
- writebyte(0xcc);
- writebyte(0x44);
- reset();
- writebyte(0xcc);
- writebyte(0xbe);
- a=readbyte();
- b=readbyte();
- ////////////////////////
- b<<=4;
- b+=(a&0xf0)>>4;
- return(b);
- }
- //////////////////////////////////////////顯示程序
- void shanshi(uchar dat)
- {
- uchar a,b;
- a=dat/10;
- b=dat%10;
- D1=0;
- P1=table[a];
- delay(60);
- D1=1;
- /////////////////
- D2=0;
- P1=table[b];
- delay(60);
- D2=1;
- }
- ////////////////////////////////////////////主函數
- void main()
- {
- uchar temp;
- while(1)
- {
- temp=readtemp();
- shanshi(temp);
- delay(100);
- }
- }
復制代碼
|