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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通信协议--单总线协议

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

文章目錄

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

一、單總線簡介

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

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

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

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

二、單總線協(xié)議

單總線初始化

初始化過程 = 復位脈沖 + 從機應答脈沖。

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

初始化時序圖如下所示:

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

單總線寫入

寫間隙有兩種,包括寫0的時間隙和寫1的時間隙。

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

寫時間隙時序圖如下所示:

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);//--進入采樣階段,過了15us寫入間隙以后,如果是低電平,就是寫入0,如果是高電平就是寫入1DQ = 1; //--寫入結束,將總線回復為高電平data>>=1;開始寫入下一位}Delay_x_us(30); }

單總線讀取

當主機把總線拉低是,并保持至少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存儲其獨一無二的序列號。暫存存儲器包含了存儲有數(shù)字溫度結果的2個字節(jié)寬度的溫度寄存器。
器件上電后默認為85攝氏度

另外,暫存存儲器還提供了一個字節(jié)的過溫和低溫溫度報警寄存器和一個字節(jié)的配置寄存器
字節(jié)3和字節(jié)4分別為設置過溫和低溫警告


當只有一個設備的時候,直接跳過ROM尋址,ROM尋址用于多個設備公用,用于判斷具體是哪一個芯片

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

unsigned char temperature() {char temp;uchar HI_temp, LOW_temp;Ds18b20_Init(); //DS18B20重置Write_To_Ds18b20(0xcc); //跳過ROM尋址Write_To_Ds18b20(0x44); //設置為溫度讀取模式 (跳過了對暫存寄存器的寫取)Delay_x_us(600); //等待溫度讀取模式的轉換Ds18b20_Init(); //DS18B20重置Write_To_Ds18b20(0xcc); //跳過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; //返回值為真實溫度*10; }

總結

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

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