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

源代碼:
- //單片機(jī)使用AT89C51晶振11.0592MHz
- //讀取DS18B20上的數(shù)據(jù),發(fā)送至電腦
- //數(shù)據(jù)格式:符號、十位、個位、小數(shù)、換行符
- //分別發(fā)送。 串口:(9600,N,8,1)
- #include<at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DQ P2_0 //定義P0.0口為單總線數(shù)據(jù)口
- uchar code st[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小數(shù)部分轉(zhuǎn)換
- bit stop=1;
- uchar pe=0; //發(fā)送指針
- uchar t=0; //延時計(jì)數(shù)
- uchar rad; //溫度數(shù)值
- uchar disply[]={'0','0','0','.','0','\n'};//溫度極性,十位,個位,小數(shù)
- 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); //每執(zhí)行一次2uS
- }
- void rest(void) //返回"1"時表示有設(shè)備應(yīng)答,復(fù)位成功
- {
- DQ=1;
- DQ=0;
- temp(225); //大于480us低電平產(chǎn)生復(fù)位
- 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); //啟動轉(zhuǎn)換
- 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; //截取后四位,查表轉(zhuǎn)換后,填入顯示緩沖區(qū)
- et=cm>>4;
- if(et>99)
- {
- disply[0]='1';
- et=et-100;
- }
- disply[1]=(et/10)|0x30; //取溫度整數(shù)
- disply[2]=(et%10)|0x30;
- stop=0;
- }
- void pc(void) interrupt 4 //串口中斷
- {
- if(TI)
- {
- if(pe>5) //發(fā)送完成
- {
- pe=0;
- stop=1;
- }
- else //繼續(xù)發(fā)送剩余部分
- {
- 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,允許接受,單機(jī)通訊0x90
- PCON=0;
- IE=0x92; //開所有中斷,開串口中斷,開T0中斷
- TR1=1; //啟動T1,波特率發(fā)生器
- TR0=0; //暫停T0
- disp();
- while(1)
- {
- while(!stop);
- hand();
- disp();
- }
- }
復(fù)制代碼
|
|