#include #define uchar unsigned char #define uint unsigned int sbit ds=P3^0" />

freeⅹ性欧美xvideos,国产精品国产成人国产三级,欧美国产综合欧美视频,精品日韩欧美一区二区在线播放,国产性夜夜春夜夜爽

問(wèn)答

求文檔: 單片機(jī)設(shè)計(jì)--DS1820數(shù)字溫度計(jì)程序與論文 交作業(yè)啊

提問(wèn)者:yust9i4juq92013-09-10 00:00

最佳答案

#include #include #define uchar unsigned char #define uint unsigned int sbit ds=P3^0; uchar flag ; uint temp; //參數(shù)temp一定要聲明為 int 型 uchar table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; /*延時(shí)函數(shù)*/ void TempDelay (uchar us) { while(us--); } void delay(uint count) //延時(shí)子函數(shù) { uint i; while(count) { i=200; while(i>0) i--; count--; } } /*串口初始化,波特率9600,方式1 */ /*數(shù)碼管的顯示 */ void display() { uchar bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%100%10; P2=0xbf; P0=table[bai]; //顯示百位 delay(1); //從0到1,有個(gè)上升沿,解除鎖存,顯示相應(yīng)段 P0=0XFF; P2=0xdf; P0=table[shi]&0X7F; //顯示十位 delay(1); P0=0XFF; P2=0xef; P0=table[ge]; //顯示個(gè)位 delay(1); P0=0xff; } /***************************************** 時(shí)序:初始化時(shí)序、讀時(shí)序、寫(xiě)時(shí)序。 所有時(shí)序都是將主機(jī)(單片機(jī))作為主設(shè)備,單總 線(xiàn)器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸 都是從主機(jī)主動(dòng)啟動(dòng)寫(xiě)時(shí)序開(kāi)始,如果要求單總 線(xiàn)器件回送數(shù)據(jù),在進(jìn)行寫(xiě)命令后,主機(jī)需啟動(dòng) 讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低 位在先。 初始化時(shí)序:復(fù)位脈沖 存在脈沖 讀;1 或 0時(shí)序 寫(xiě);1 或 0時(shí)序 只有存在脈沖信號(hào)是從18b20(從機(jī))發(fā)出的,其 它信號(hào)都是由主機(jī)發(fā)出的。 存在脈沖:讓主機(jī)(總線(xiàn))知道從機(jī)(18b20)已 經(jīng)做好了準(zhǔn)備。 ******************************************/ /*-------------------------------------------------------------------------------------------------------------------- 初始化:檢測(cè)總線(xiàn)控制器發(fā)出的復(fù)位脈沖 和ds18b20的任何通訊都要從初始化開(kāi)始 初始化序列包括一個(gè)由總線(xiàn)控制器發(fā)出的復(fù)位脈沖 和跟在其后由從機(jī)發(fā)出的存在脈沖。 初始化:復(fù)位脈沖+存在脈沖 具體操作: 總線(xiàn)控制器發(fā)出(TX)一個(gè)復(fù)位脈沖 (一個(gè)最少保持480μs 的低電平信號(hào)),然后釋放總線(xiàn), 進(jìn)入接收狀態(tài)(RX)。單線(xiàn)總線(xiàn)由5K 上拉電阻拉到高電平。探測(cè)到I/O 引腳上的上升沿后 DS1820 等待15~60μs,然后發(fā)出存在脈沖(一個(gè)60~240μs 的低電平信號(hào))。 具體看"倒塌 18b20"文檔里的 " 單線(xiàn)復(fù)位脈沖時(shí)序和1-wire presence detect "的時(shí)序圖 -------------------------------------------------------------------------------------------------------------------*/ void ds_reset(void) { ds=1; _nop_(); //1us ds=0; TempDelay(80); //當(dāng)總線(xiàn)停留在低電平超過(guò)480us,總線(xiàn)上所以器件都將被復(fù)位,這里//延時(shí)約530us總線(xiàn)停留在低電平超過(guò)480μs,總線(xiàn)上的所有器件都 //將被復(fù)位。 _nop_(); ds=1; //產(chǎn)生復(fù)位脈沖后,微處理器釋放總線(xiàn),讓總線(xiàn)處于空閑狀態(tài),原因查//18b20中文資料 TempDelay(5); //釋放總線(xiàn)后,以便從機(jī)18b20通過(guò)拉低總線(xiàn)來(lái)指示其是否在線(xiàn), //存在檢測(cè)高電平時(shí)間:15~60us, 所以延時(shí)44us,進(jìn)行 1-wire presence //detect(單線(xiàn)存在檢測(cè)) _nop_(); _nop_(); _nop_(); if(ds==0) flag=1; //detect 18b20 success else flag=0; //detect 18b20 fail TempDelay(20); //存在檢測(cè)低電平時(shí)間:60~240us,所以延時(shí)約140us _nop_(); _nop_(); ds=1; //再次拉高總線(xiàn),讓總線(xiàn)處于空閑狀態(tài) /**/ } /*---------------------------------------- 讀/寫(xiě)時(shí)間隙: DS1820 的數(shù)據(jù)讀寫(xiě)是通過(guò)時(shí)間隙處理 位和命令字來(lái)確認(rèn)信息交換。 ------------------------------------------*/ bit ds_read_bit(void) //讀一位 { bit dat; ds=0; //單片機(jī)(微處理器)將總線(xiàn)拉低 _nop_(); //讀時(shí)隙起始于微處理器將總線(xiàn)拉低至少1us ds=1; //拉低總線(xiàn)后接著釋放總線(xiàn),讓從機(jī)18b20能夠接管總線(xiàn),輸出有效數(shù)據(jù) _nop_(); _nop_(); //小延時(shí)一下,讀取18b20上的數(shù)據(jù) ,因?yàn)閺膁s18b20上輸出的數(shù)據(jù) //在讀"時(shí)間隙"下降沿出現(xiàn)15us內(nèi)有效 dat=ds; //主機(jī)讀從機(jī)18b20輸出的數(shù)據(jù),這些數(shù)據(jù)在讀時(shí)隙的下降沿出現(xiàn)//15us內(nèi)有效 TempDelay(10); //所有讀"時(shí)間隙"必須60~120us,這里77us return(dat); //返回有效數(shù)據(jù) } uchar ds_read_byte(void ) //讀一字節(jié) { uchar value,i,j; value=0; //一定別忘了給初值 for(i=0;i<8;i++) { j=ds_read_bit(); value=(j<<7)|(value>>1); //這一步的說(shuō)明在一個(gè)word文檔里面 } return(value); //返回一個(gè)字節(jié)的數(shù)據(jù) } void ds_write_byte(uchar dat) //寫(xiě)一個(gè)字節(jié) { uchar i; bit onebit; //一定不要忘了,onebit是一位 for(i=1;i<=8;i++) { onebit=dat&0x01; dat=dat>>1; if(onebit) //寫(xiě) 1 { ds=0; _nop_(); _nop_(); //看時(shí)序圖,至少延時(shí)1us,才產(chǎn)生寫(xiě)"時(shí)間隙" ds=1; //寫(xiě)時(shí)間隙開(kāi)始后的15μs內(nèi)允許數(shù)據(jù)線(xiàn)拉到高電平 TempDelay(5); //所有寫(xiě)時(shí)間隙必須最少持續(xù)60us } else //寫(xiě) 0 { ds=0; TempDelay(8); //主機(jī)要生成一個(gè)寫(xiě)0 時(shí)間隙,必須把數(shù)據(jù)線(xiàn)拉到低電平并保持至少60μs,這里64us ds=1; _nop_(); _nop_(); } } } /***************************************** 主機(jī)(單片機(jī))控制18B20完成溫度轉(zhuǎn)換要經(jīng)過(guò)三個(gè)步驟: 每一次讀寫(xiě)之前都要18B20進(jìn)行復(fù)位操作,復(fù)位成功后發(fā)送 一條ROM指令,最后發(fā)送RAM指令,這樣才能對(duì)DS18b20進(jìn)行 預(yù)定的操作。 復(fù)位要求主CPU將數(shù)據(jù)線(xiàn)下拉500us,然后釋放,當(dāng)ds18B20 受到信號(hào)后等待16~60us,后發(fā)出60~240us的存在低脈沖, 主CPU收到此信號(hào)表示復(fù)位成功 ******************************************/ /*---------------------------------------- 進(jìn)行溫度轉(zhuǎn)換: 先初始化 然后跳過(guò)ROM:跳過(guò)64位ROM地址,直接向ds18B20發(fā)溫度轉(zhuǎn)換命令,適合單片工作 發(fā)送溫度轉(zhuǎn)換命令 ------------------------------------------*/ void ds18b20() { ds_reset(); delay(1); //約2ms ds_write_byte(0xcc); ds_write_byte(0x44); } /*---------------------------------------- 獲得溫度: ------------------------------------------*/ uint get_temperature() { float wendu; uchar a,b; ds_reset(); delay(1); //約2ms ds_write_byte(0xcc); ds_write_byte(0xbe); a=ds_read_byte(); b=ds_read_byte(); temp=b; temp<<=8; temp=temp|a; wendu=temp*0.0625; temp=wendu*10+0.5; return temp; } /*---------------------------------------- 讀ROM ------------------------------------------*/ /* void ds_read_rom() //這里沒(méi)有用到 { uchar a,b; ds_reset(); delay(30); ds_write_byte(0x33); a=ds_read_byte(); b=ds_read_byte(); } */ void main() { uint a; while(1) { ds18b20(); //12位轉(zhuǎn)換時(shí)間最大為750ms for(a=10;a>0;a--) {get_temperature(); display( );} } } 連接很簡(jiǎn)單,就在最小系統(tǒng)的p0口接數(shù)碼管,在p3.7口接上DS18B20電路不封就可以

回答者:gn8llx2016-09-11 00:00

DS 6相關(guān)問(wèn)題

相關(guān)閱讀

按字母分類(lèi):