這個用單片機最小系統+DS18B20進行溫度測量試驗,所需要器材:一塊單片機最小系統、一只DS18B20數字溫度傳感器,測試結果經串口發送到PC機,通過電腦串口調試軟件顯示測量結果,測量范圍-55-125度,保留一位小數。關于單片機最小系統的制作,在本空間有詳細介紹,本文就不作介紹,相關的原理圖、PCB圖、元件清單等內容有,這里就不作介紹了,需要制作的愛好者可參考本空間的手把手制作單片機最小系統。這里只給出單片機最小系統+DS18B20進行溫度測量試驗的具體程序的壓縮包,需要的可以自己下載。需要說明的是,DS18B20的1腳接地、數據端口(2腳)是直接焊接在單片機最小系統板上的單片機P2.0口上、3腳接+5伏。DS18B20的2腳接正電源的4.7K的電阻可以省去,原因是單片機內部是自己帶有上接電阻。下面是試驗的相關圖片。
下載:
用單片機最小系統 DS18B20進行溫度測量試驗程序.rar
(389.53 KB, 下載次數: 394)
2015-4-11 22:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
串口調試助手等單片機工具軟件的下載地址:http://www.zg4o1577.cn/mcudown/

源代碼:
- //單片機使用AT89C51晶振11.0592MHz
- //讀取DS18B20上的數據,發送至電腦
- //數據格式:符號、十位、個位、小數、換行符
- //分別發送。 串口:(9600,N,8,1)
- #include<at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DQ P2_0 //定義P0.0口為單總線數據口
- uchar code st[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小數部分轉換
- bit stop=1;
- uchar pe=0; //發送指針
- uchar t=0; //延時計數
- uchar rad; //溫度數值
- uchar disply[]={'0','0','0','.','0','\n'};//溫度極性,十位,個位,小數
- void temp(uchar aa);
- void rest(void);
- void write(uchar da);
- void read(void);
- void hand(void);
- void disp(void);
- void timer(void);
- void temp(uchar aa)
- {
- while(--aa); //每執行一次2uS
- }
- void rest(void) //返回"1"時表示有設備應答,復位成功
- {
- DQ=1;
- DQ=0;
- temp(225); //大于480us低電平產生復位
- DQ=1;
- temp(150);
- }
- void write(uchar da)
- {
- uchar wb=0x01,t;
- for(t=0;t<8;t++)
- {
- if(da&wb)
- {
- DQ=0;
- temp(1);
- DQ=1;
- temp(17);
- }
- else
- {
- DQ=0;
- temp(12);
- DQ=1;
- temp(6);
- }
- wb=wb<<1;
- }
- }
- void read(void)
- {
- uchar sb=0x01,s,tes;
- bit pdt;
- rad=0;
- for(s=0;s<8;s++)
- {
- DQ=0;
- DQ=1;
- temp(2);
- pdt=DQ;
- temp(18);
- if(pdt)
- {
- rad=rad|sb;
- }
- sb=sb<<1;
- tes=rad;
- }
- }
- void hand(void)
- {
- uchar et,lcm,hcm;
- uint cm;
- rest();
- write(0xcc); //跳過
- write(0x44); //啟動轉換
- timer(); //延時500ms
- rest();
- write(0xcc); //跳過
- write(0xbe); //讀取命令
- read();
- lcm=rad;
- read();
- hcm=rad;
- cm=hcm;
- cm=cm<<8;
- cm=cm|lcm;
- if(cm&0xf000)
- {
- cm=~cm;
- cm++;
- disply[0]='-';
- }
- else
- {
- disply[0]=' ';
- }
- et=cm&0x000f;
- disply[4]=st[et]|0x30; //截取后四位,查表轉換后,填入顯示緩沖區
- et=cm>>4;
- if(et>99)
- {
- disply[0]='1';
- et=et-100;
- }
- disply[1]=(et/10)|0x30; //取溫度整數
- disply[2]=(et%10)|0x30;
- stop=0;
- }
- void pc(void) interrupt 4 //串口中斷
- {
- if(TI)
- {
- if(pe>5) //發送完成
- {
- pe=0;
- stop=1;
- }
- else //繼續發送剩余部分
- {
- ACC=disply[pe];
- SBUF=ACC;
- pe++;
- }
- TI=0;
- }
- }
- void disp(void)
- {
- stop=0;
- ACC=disply[0];
- SBUF=ACC;
- pe++;
- }
- void tep(void) interrupt 1 //定時器0中斷
- {
- TH0=0x4c;
- TL0=0x00;
- t++;
- }
- void timer(void) //延時500ms
- {
- TR0=1;
- while(t<50); //啟動定時器,等待10次中斷
- TR0=0;
- t=0;
- TH0=0x4c;
- TL0=0x00;
- }
- void main(void)
- {
- TMOD=0x21; //定時器1模式2;定時器0模式1
- // TH1=0xfd;
- // TL1=0xfd; //波特率9600,11.0592MHz晶振
- TH1=0xE6;
- TL1=0xE6; //波特率1200,12MHz晶振
- TH0=0x4c;
- TL0=0x00; //定時器初值,50ms
- SCON=0x50; //串口模式1,允許接受,單機通訊0x90
- PCON=0;
- IE=0x92; //開所有中斷,開串口中斷,開T0中斷
- TR1=1; //啟動T1,波特率發生器
- TR0=0; //暫停T0
- disp();
- while(1)
- {
- while(!stop);
- hand();
- disp();
- }
- }
復制代碼
|