日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

通信协议--单总线协议

發(fā)布時(shí)間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通信协议--单总线协议 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、單總線簡(jiǎn)介
  • 二、單總線協(xié)議
    • 單總線初始化
    • 單總線寫入
    • 單總線讀取
  • DS18B20用法
    • 讀取溫度(僅僅包含整數(shù)部分)
    • 讀取溫度(含小數(shù)部分)

一、單總線簡(jiǎn)介

1.定義:主機(jī)和從機(jī)通過(guò)1根線進(jìn)行通信,在一條總線上可掛接的從器件數(shù)量幾乎不受限制。

2.特點(diǎn):這是由達(dá)拉斯半導(dǎo)體公司推出的一項(xiàng)通信技術(shù)。它采用單根信號(hào)線,既可傳輸時(shí)鐘,又能傳輸數(shù)據(jù),而且數(shù)據(jù)傳輸是雙向的。

3.優(yōu)點(diǎn):單總線技術(shù)具有線路簡(jiǎn)單,硬件開銷少,成本低廉,便于總線擴(kuò)展和維護(hù)等。

單總線各種詳細(xì)介紹網(wǎng)上很多,此處不再贅述,直接進(jìn)入正題(本文檔以常用的DS18B20溫度傳感器為例

二、單總線協(xié)議

單總線初始化

初始化過(guò)程 = 復(fù)位脈沖 + 從機(jī)應(yīng)答脈沖。

主機(jī)通過(guò)拉低單總線480 ~ 960 us產(chǎn)生復(fù)位脈沖,然后釋放總線,進(jìn)入接收模式。主機(jī)釋放總線時(shí),會(huì)產(chǎn)生低電平跳變?yōu)楦唠娖降纳仙?#xff0c;單總線器件檢測(cè)到上升沿之后,延時(shí)15 ~ 60 us,單總線器件拉低總線60 ~ 240 us來(lái)產(chǎn)生應(yīng)答脈沖。主機(jī)接收到從機(jī)的應(yīng)答脈沖說(shuō)明單總線器件就緒,初始化過(guò)程完成。

初始化時(shí)序圖如下所示:

bit Ds18b20_Init(void) {bit ack_flg =0;DQ = 1;//--保證總線是高電平Delay_x_us(100);//--稍微演示一下,保證電平穩(wěn)定DQ = 0;//--主機(jī)拉總線Delay_x_us(500);//--延時(shí)480us-960usDQ = 1; //--釋放總線,進(jìn)入接收模式Delay_x_us(60);//--延時(shí)15-60us 此處延時(shí)最大的,保證接收正確ack_flg = DQ; //--讀取總線應(yīng)答電平 0:應(yīng)答成功 1:應(yīng)答失敗return ack_flg;}

單總線寫入

寫間隙有兩種,包括寫0的時(shí)間隙和寫1的時(shí)間隙。

當(dāng)數(shù)據(jù)線拉低后,在15 ~ 60 us的時(shí)間窗口內(nèi)對(duì)數(shù)據(jù)線進(jìn)行采樣。如果數(shù)據(jù)線為低電平,就是寫0,如果數(shù)據(jù)線為高電平,就是寫1。主機(jī)要產(chǎn)生一個(gè)寫1時(shí)間隙,就必須把數(shù)據(jù)線拉低,在寫時(shí)間隙開始后的15 us內(nèi)允許數(shù)據(jù)線拉高。主機(jī)要產(chǎn)生一個(gè)寫0時(shí)間隙,就必須把數(shù)據(jù)線拉低并保持60 us。

寫時(shí)間隙時(shí)序圖如下所示:

void Write_To_Ds18b20(uchar data) {uchar i;for(i=0;i<8;i++){DQ = 0;//--數(shù)據(jù)線拉DQ = data&0x01; //--從字節(jié)低位開始寫入 //--寫入間隙大概15usDelay_x_us(30);//--進(jìn)入采樣階段,過(guò)了15us寫入間隙以后,如果是低電平,就是寫入0,如果是高電平就是寫入1DQ = 1; //--寫入結(jié)束,將總線回復(fù)為高電平data>>=1;開始寫入下一位}Delay_x_us(30); }

單總線讀取

當(dāng)主機(jī)把總線拉低是,并保持至少1 us后釋放總線,必須在15 us內(nèi)讀取數(shù)據(jù)。

uchar Read_form_Ds18b20(void) {uchar i;uchar data;for(i=0;i<8;i++){DQ = 0;//--把總線拉,,必須在15us內(nèi)讀完數(shù)據(jù)data >>= 1;DQ = 1;//保持1us后釋放 if(DQ) //--采樣data |= 0x80; Delay_x_us(30);}return data; }

DS18B20用法

ds18b20內(nèi)部的64位的rom存儲(chǔ)其獨(dú)一無(wú)二的序列號(hào)。暫存存儲(chǔ)器包含了存儲(chǔ)有數(shù)字溫度結(jié)果的2個(gè)字節(jié)寬度的溫度寄存器。
器件上電后默認(rèn)為85攝氏度

另外,暫存存儲(chǔ)器還提供了一個(gè)字節(jié)的過(guò)溫和低溫溫度報(bào)警寄存器和一個(gè)字節(jié)的配置寄存器
字節(jié)3和字節(jié)4分別為設(shè)置過(guò)溫和低溫警告


當(dāng)只有一個(gè)設(shè)備的時(shí)候,直接跳過(guò)ROM尋址,ROM尋址用于多個(gè)設(shè)備公用,用于判斷具體是哪一個(gè)芯片

讀取溫度(僅僅包含整數(shù)部分)

unsigned char temperature() {char temp;uchar HI_temp, LOW_temp;Ds18b20_Init(); //DS18B20重置Write_To_Ds18b20(0xcc); //跳過(guò)ROM尋址Write_To_Ds18b20(0x44); //設(shè)置為溫度讀取模式 (跳過(guò)了對(duì)暫存寄存器的寫取)Delay_x_us(600); //等待溫度讀取模式的轉(zhuǎn)換Ds18b20_Init(); //DS18B20重置Write_To_Ds18b20(0xcc); //跳過(guò)ROM尋址Write_To_Ds18b20(0xbe); //讀取暫存寄存器的內(nèi)容(先低位,再高位)LOW_temp = Read_form_Ds18b20(); HI_temp = Read_form_Ds18b20();temp=high<<4;temp|=(low>>4);return temp; }

讀取溫度(含小數(shù)部分)

float rd_temperature(void) {unsigned char MSH,MSL;unsigned int temp;float temperature;Ds18b20_Init();Write_To_Ds18b20(0xCC);Write_To_Ds18b20(0x44);Delay_x_us(600); while(!DQ);Ds18b20_Init();Write_To_Ds18b20(0xCC);Write_To_Ds18b20(0xBE);MSL=Read_form_Ds18b20();MSH=Read_form_Ds18b20();temp=(MSH&0x0f);temp<<=8;temp|= MSL;temperature=0.0625*temp;return temperature*10; //返回值為真實(shí)溫度*10; }

總結(jié)

以上是生活随笔為你收集整理的通信协议--单总线协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。