|
美國DALAS公司的溫度傳感器ds1820芯片具有高靈敏度、易用性、編程布線簡單等優(yōu)點,被應用到工控行業(yè)的各種產(chǎn)品中。
本C51源碼能夠?qū)崿F(xiàn)穩(wěn)定的一線多點測溫系統(tǒng),液晶顯示溫度值。結(jié)合硬件的通信即可實現(xiàn)遠程多點測溫。本c51的ds1820的c語言驅(qū)動程序通過實踐使用,程序效率高、穩(wěn)定準確,可直接使用。
且本原碼包括了FYD12864液晶顯示源碼,為FYD12864液晶初使用者提供了一個實例。
- //DS1820 C51 子程序
- //這里以11.0592M晶振為例,不同的晶體速度可能需要調(diào)整延時的時間
- #include<reg52.h>
- #include<lcd.h>
- #include <absacc.h>
- /////////////**********先為液晶初始化函數(shù)變量聲明**********///////////
- void WRD(uchar DATA); //寫lcd數(shù)據(jù)子函數(shù)聲明
- void WRI(uchar com) ; //寫lcd指令子函數(shù)聲明
- void RD(uchar INDATA) ; //讀lcd數(shù)據(jù)子函數(shù)聲明
- void CHEBF(); //讀lcdBF子函數(shù)聲明
- void lcdinitialdat() ; //寫lcd數(shù)據(jù)初始化聲明
- void delaylong(int n) ; //延遲聲明
- void delay(void);
- void locatecursor(uchar H,uchar L); //定位游標,行H,列L (最大可到四行八列)
- uchar bdata state;
- sbit BF=state^7;
- uchar idata DDRAM; //設定DDRAM地址第一行80~87,第二行90~97,
- //第三行為88-8F,第四行為98-9F
- uchar idata basfuncset ; /*0X30基本指令,8位數(shù)據(jù) 0X34 擴充指令,8位數(shù)據(jù)*/
- uchar idata shiftcursorr=0X14;//游標移位:為14H時,游標右移
- uchar idata shiftcursorl=0X10; //游標移位:為10H時,游標左移
- //18H時為顯示左移(在一三行之間或二四行之間),游標跟移;
- //1CH時為顯示右移,游標跟移
- uchar idata page; //頁號
- ////////////////////////////////////////////////////////////////////////////////////////////
- sbit DQ =P1^1;//根據(jù)實際情況定義端口
- typedef unsigned int uint;
- void tmdelay(uchar useconds) ;
- uchar tm_initial(void) ;
- void read_char(void) ;
- void write_char(char val) ;
- void Read_Temperature(uchar no) ;
- uchar temdate[2][2]=
- {0,0, //NO1溫度值的低字節(jié)和高字節(jié)
- 0,0}; //NO2溫度值的低字節(jié)和高字節(jié)
- uchar tempkey[2][8]=
- {0X28,0X8F,0XF3,0X85,0,0,0,0X60, //NO1
- 0X28,0X52,0XA4,0X85,0,0,0,0X2A}; //NO2
- uchar dy=0;
- uchar value = 0;
- uchar temint=0;
- uint temdot=0;
- //////////////////////////////////////////////main staet////////////////////////////////////////////////
- main()
- { uchar k=0;
- delaylong(500) ; /////此處必須延時300ms以上,500時為約大于1秒
- //delaylong(350) ; //779ms
- lcdinitialdat() ;//寫lcd數(shù)據(jù)初始化
- delay() ;
- while(1)
- {k=0;
- while(k<2)
- {temint=0;temdot=0;
- Read_Temperature(k);
- locatecursor(k+1,1); //從第2行首列顯示
- WRD('T');WRD('E'); WRD('M');WRD(0X30+k);WRD(':');
- temint=((temdate[k][1]<<4)|(temdate[k][0]>>4));
- temdot=temdate[k][0]&0X0F;
- temdot=temdot*625;
- temint+=temdot/10000;
- WRD(0X30+temint/100);WRD(0X30+temint%100/10);WRD(0X30+temint%10);
- WRD('.');
- WRD(0X30+(temdot%10000/1000));WRD(0X30+temdot%1000/100);
- WRD(0X30+(temdot%100/10));WRD(0X30+temdot%10);
- k++;
- }
- }
- }//end main
- ///////////////////////////////////////////////end main/////////////////////////////////////////////
- //延時
- void tmdelay(uchar useconds)
- {
- while(useconds>0)useconds--;
- }
- /*tmdelay(1) ;//16.28us//增加一個就加6.5us
- tmdelay(2) ;//22.78us
- tmdelay(3) ;//29.30us
- tmdelay(4) ;//35.81us
- tmdelay(70) ;//465.49
- tmdelay(74) ;//491.54
- tmdelay(80) ;//530.60
- tmdelay(115) ;//150us */
- //復位
- uchar tm_initial(void) ///對的
- {
- uchar answer=1;
- NOANSWE:
- DQ = 0; //pull DQ line low
- tmdelay(74); // leave it low for 490us
- DQ = 1; // allow line to return high
- tmdelay(12); // wait >60us for answer pulse
- if(DQ==1) {answer=1;goto NOANSWE;}
- else if(DQ==0)answer=0;
- //locatecursor(1,5);
- //WRD(0X30+answer);
- tmdelay(40) ;//>250us
- DQ=1;
- return(answer); //0表示有DS18B20應答,1表示沒有應答
- }
- //從 1-wire 總線上讀取一個字節(jié)
- void read_char(void)
- {
- uchar i;
- value=0;
- for (i=8;i>0;i--)
- {
- value>>=1;
- DQ = 1;
- dy++;dy++;
- DQ = 0; // pull DQ low
- dy++;dy++;dy++;dy++;dy++; // wait 1-15us for data in bus
- DQ=1; dy++; //pull high
- //tmdelay(1);
- if(DQ==1)
- {value|=0x80;
- }else{;}
- tmdelay(18) ;//>120us
- }
- //return(value);
- }
- //向 1-WIRE 總線上寫一個字節(jié)
- void write_char(uchar val)
- {
- uchar i;
- locatecursor(3,1);
- for (i=8; i>0; i--) // writes uchar, one bit at a time
- {
- //DQ = 1;
- //tmdelay(1);
- DQ = 0; // pull DQ low to start timeslot
- tmdelay(1);
- if(val&0X01==1)
- {DQ = 1;tmdelay(12); }
- else {DQ=0;tmdelay(12); DQ=1;tmdelay(1); }
- //tmdelay(10); // hold value for remainder of timeslot
- val=val>>1;
- }
- DQ = 1;
- tmdelay(1);
- }
- ///////讀DS18B20的64bit的KEY
- //讀取溫度
- void Read_Temperature(uchar no)
- {
- uchar j=0;
- value=0;
- if(tm_initial()==1) goto noanswer;
- write_char(0X55); // 匹配 ROM
- //寫暫存存儲器(4EH)、讀暫存存儲器(BEH)、復制暫存存儲器(48H)、溫度變換(44H)、重
- //新調(diào)出EERAM(B8H)和讀電源供電方式(B4H)命令
- while(j<8)
- {
- write_char(tempkey[no][j]);
- j++;
- }
- write_char(0x44); // Start Conversion
- delaylong(355) ; //>780ms// 延時一段時間,等待AD轉(zhuǎn)換結(jié)束,默認12位則>750ms
- if(tm_initial()==1) goto noanswer;
- write_char(0X55); // 匹配 ROM
- j=0;
- while(j<8)
- {
- write_char(tempkey[no][j]);
- j++;
- }
- write_char(0xBE); // Read Scratch Pad
- read_char(); //first temperatue low
- temdate[no][0]=value;
- read_char(); //then temperatue high
- temdate[no][1]=value;
- //tm_initial();
- //write_char(0xCC); //Skip ROM
- //return temp.x/2;
- noanswer:;
- } //////////////////////////end Read_Temperature(void) ////////////////////
- ///////////////////////////
- /***************************現(xiàn)為各液晶子函數(shù)體******************/////
- void WRD(uchar DATA) //寫lcd數(shù)據(jù)子函數(shù)
- {
- CHEBF();
- ADWRD=DATA;
- ADWRD=DATA;
- }
- void WRI(uchar com) //寫lcd指令子函數(shù)
- {
- CHEBF();
- ADWRI=com;
- ADWRI=com;
- }
- void CHEBF() //讀lcdBF子函數(shù)
- {
- state=ADRI;
- while(BF)
- {
- state=ADRI;
- }
- }
- void lcdinitialdat() //寫lcd數(shù)據(jù)初始化
- {
- WRI(0X30) ; //RE=0基本指令設定
- delay();
- WRI(0X30) ; //延遲39us
- delay();
- WRI(stadis2); //游標開,反白允許
- //WRI(0X0E); //游標開,反白不允許
- //WRI(stadis1); //游標關(guān),反白不允許
- delay(); //延遲39us
- WRI(clrdis) ; //清除顯示
- delay(); //延遲39us
- WRI(inpointcursorup); //AC+1
- delay(); //延遲39us
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (49.89 KB, 下載次數(shù): 156)
下載附件
2017-4-7 23:59 上傳
下載:
C51源碼能夠?qū)崿F(xiàn)穩(wěn)定的一線多點測溫系統(tǒng),液晶顯示溫度值.rar
(259.6 KB, 下載次數(shù): 57)
2017-4-7 22:59 上傳
點擊文件名下載附件
多點測量溫度 下載積分: 黑幣 -5
|
|