|
基于51單片機(jī)做的簡(jiǎn)易溫度計(jì)的實(shí)物圖如下:
簡(jiǎn)易溫度計(jì)元件清單
萬(wàn)用板7*9
3pin圓孔母座
2.2K電阻*4
stc89C51單片機(jī)
40腳IC座
DS18B20溫度傳感器
10K電阻*2
10uF電容
小按鍵
12MHz晶振
30pF瓷片電容*2
9012三極管*4
四位一體共陽(yáng)數(shù)碼管0.56
DC電源插座
USB電源線
自鎖開(kāi)關(guān)
導(dǎo)線
焊錫
全部資料下載地址:
原理圖.doc
(49.5 KB, 下載次數(shù): 83)
2017-8-9 13:12 上傳
點(diǎn)擊文件名下載附件
元件清單.docx
(12.38 KB, 下載次數(shù): 45)
2017-8-9 13:12 上傳
點(diǎn)擊文件名下載附件
單片機(jī)源程序:
- #include<reg52.h>
- #define ui unsigned int
- #define uc unsigned char //宏定義
- sbit DQ =P3^7; //定義DS18B20總線I/O
- bit bdata fuhao;
- uc qian,bai,shi,ge;
- uc code led[] = {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7};
- uc code led_dian[] = {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7};
- //=========================================DS18B20=========================================//
- /*****延時(shí)子程序*****/
- void Delay(int num)
- {
- while(num--) ;
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20()
- {
- DQ = 1; //DQ復(fù)位
- Delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- Delay(80); //精確延時(shí),大于480us
- DQ = 1; //拉高總線
- Delay(40);
- }
- /*****讀一個(gè)字節(jié)*****/
- uc ReadOneChar()
- {
- uc i=0;
- uc dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號(hào)
- dat>>=1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- return(dat);
- }
- /*****寫(xiě)一個(gè)字節(jié)*****/
- void WriteOneChar(uc dat)
- {
- uc i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /*****讀取溫度*****/
- ui ReadTemperature()
- {
- ui a=0,b=0,t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- if(t&0xf800)
- {
- t=~t+1;
- fuhao=1;
- }
- else
- fuhao=0;
- tt=t*0.0625;
- t=tt*10+0.5; //放大10倍輸出并四舍五入
- return(t);
- }
- /*****讀取溫度*****/
- void check_wendu()
- {
- ui f;
- f=ReadTemperature(); //獲取溫度值并減去DS18B20的溫漂誤差
- qian=f/1000;
- bai=(f%1000)/100; //計(jì)算得到十位數(shù)字
- shi=((f%1000)%100)/10; //計(jì)算得到個(gè)位數(shù)字
- ge=((f%1000)%100)%10; //計(jì)算得到小數(shù)位
- }
- /*****顯示開(kāi)機(jī)初始化等待畫(huà)面*****/
- void Disp_init()
- {
- P0 = 0x7f; //顯示----
- P2 = 0x7f;
- Delay(100);
- P2 = 0xdf;
- Delay(100);
- P2 = 0xf7;
- Delay(100);
- P2 = 0xfd;
- Delay(100);
- P2 = 0xff; //關(guān)閉顯示
- }
- /*****顯示溫度子程序*****/
- void Disp_Temperature() //顯示溫度
- {
- if(qian==0)
- {
- if(fuhao==1)
- P0=0x7f; //1011 1111
- else
- P0=0xff;
- P2=0xfd;
- Delay(10);
- P2 = 0xff;
- }
- else if(qian!=0)
- {
- P0 =~led[qian];
- P2 = 0xfd;
- Delay(10);
- P2 = 0xff;
- }
- if((bai==0)&&(qian==0))
- {
- P0=0xff; //
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- else if((bai==0)&&(qian!=0))
- {
- P0=~led[bai];
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- else if(bai!=0)
- {
- P0=~led[bai]; //
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- P0=~led_dian[shi]; //
- P2=0xdf;
- Delay(10);
- P2=0xff;
- P0=~led[ge]; //顯示符號(hào)
- P2=0x7f;
- Delay(10);
- P2=0xff; //關(guān)閉顯示
- }
- /*****主函數(shù)*****/
- void main()
- {
- uc z;
- for(z=0;z<100;z++)
- {
- Disp_init();
- check_wendu();
- }
- while(1)
- {
- check_wendu();
- for(z=0;z<10;z++)
- Disp_Temperature();
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|