基于51單片機做的簡易溫度計的實物圖如下:
0.png (677.57 KB, 下載次數(shù): 76)
下載附件
2017-8-10 05:35 上傳
0.png (703.78 KB, 下載次數(shù): 89)
下載附件
2017-8-10 05:35 上傳
簡易溫度計元件清單
萬用板7*9
3pin圓孔母座
2.2K電阻*4
stc89C51單片機
40腳IC座
DS18B20溫度傳感器
10K電阻*2
10uF電容
小按鍵
12MHz晶振
30pF瓷片電容*2
9012三極管*4
四位一體共陽數(shù)碼管0.56
DC電源插座
USB電源線
自鎖開關(guān)
導線
焊錫
全部資料下載地址:
原理圖.doc
(49.5 KB, 下載次數(shù): 83)
2017-8-9 13:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
元件清單.docx
(12.38 KB, 下載次數(shù): 45)
2017-8-9 13:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序:
- #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=========================================//
- /*****延時子程序*****/
- void Delay(int num)
- {
- while(num--) ;
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20()
- {
- DQ = 1; //DQ復位
- Delay(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- Delay(80); //精確延時,大于480us
- DQ = 1; //拉高總線
- Delay(40);
- }
- /*****讀一個字節(jié)*****/
- uc ReadOneChar()
- {
- uc i=0;
- uc dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- return(dat);
- }
- /*****寫一個字節(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); //跳過讀序號列號的操作
- WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- 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; //計算得到十位數(shù)字
- shi=((f%1000)%100)/10; //計算得到個位數(shù)字
- ge=((f%1000)%100)%10; //計算得到小數(shù)位
- }
- /*****顯示開機初始化等待畫面*****/
- 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]; //顯示符號
- 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();
- }
- }
復制代碼
|