国产精品久久成人网站 ,99热都是精品久久久久久,一边添奶一边添p好爽视频,久久国产精品成人片免费,国产免费无码av片在线观看不卡,国产成人亚洲综合网色欲网久下载,日本牲交大片无遮挡,精品国产亚洲福利一区二区
              TDA2030功放電路圖 電動(dòng)車充電器電路圖 電子電路 功放電路 電子制作 集成塊資料 電子報(bào) pcb 變壓器 元器件知識(shí) 逆變器電路圖 電路圖 開關(guān)電源電路圖 傳感器技術(shù) led 電磁兼容
              電子電路圖
              當(dāng)前位置: 首頁 > 電子電路 > 設(shè)計(jì)編程

              單片機(jī)的I2C通信設(shè)計(jì)

              時(shí)間:2019-12-05 09:15:30來源:電子發(fā)燒友 作者:admin 點(diǎn)擊:
              I2C每一位信號(hào)的時(shí)序流程,而I2C通信在字節(jié)級(jí)的傳輸中,也有固定的時(shí)序要求。I2C通信的起始信號(hào)(Start)后,首先要發(fā)送一個(gè)從機(jī)的地址,這個(gè)地址一共有 7位,緊跟著的第 8

              bit I2CAddressing(unsigned char addr);

              extern void InitLcd1602();

              extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

              void main(){

              bit ack;

              unsigned char str[10];

              InitLcd1602(); //初始化液晶

              ack = I2CAddressing(0x50); //查詢地址為 0x50 的器件

              str[0] = ‘5’; //將地址和應(yīng)答值轉(zhuǎn)換為字符串

              str[1] = ‘0’;

              str[2] = ‘:’;

              str[3] = (unsigned char)ack + ‘0’;

              str[4] = ‘’;

              LcdShowStr(0, 0, str); //顯示到液晶上

              ack = I2CAddressing(0x62); //查詢地址為 0x62 的器件

              str[0] = ‘6’; //將地址和應(yīng)答值轉(zhuǎn)換為字符串

              str[1] = ‘2’;

              str[2] = ‘:’;

              str[3] = (unsigned char)ack + ‘0’;

              str[4] = ‘’;

              LcdShowStr(8, 0, str); //顯示到液晶上

              while (1);

              }

              /* 產(chǎn)生總線起始信號(hào) */

              void I2CStart(){

              I2C_SDA = 1; //首先確保 SDA、SCL 都是高電平

              I2C_SCL = 1;

              I2CDelay();

              I2C_SDA = 0; //先拉低 SDA

              I2CDelay();

              I2C_SCL = 0; //再拉低 SCL

              }

              /* 產(chǎn)生總線停止信號(hào) */

              void I2CStop(){

              I2C_SCL = 0; //首先確保 SDA、SCL 都是低電平

              I2C_SDA = 0;

              I2CDelay();

              I2C_SCL = 1; //先拉高 SCL

              I2CDelay();

              I2C_SDA = 1; //再拉高 SDA

              I2CDelay();

              }

              /* I2C 總線寫操作,dat-待寫入字節(jié),返回值-從機(jī)應(yīng)答位的值 */

              bit I2CWrite(unsigned char dat){

              bit ack; //用于暫存應(yīng)答位的值

              unsigned char mask; //用于探測(cè)字節(jié)內(nèi)某一位值的掩碼變量

              for (mask=0x80; mask!=0; mask》》=1){ //從高位到低位依次進(jìn)行

              if ((mask&dat) == 0){ //該位的值輸出到 SDA 上

              I2C_SDA = 0;

              }else{

              I2C_SDA = 1;

              }

              I2CDelay();

              }

              I2C_SCL = 1; //拉高 SCL

              I2CDelay();

              I2C_SCL = 0; //再拉低 SCL,完成一個(gè)位周期

              I2C_SDA = 1; //8 位數(shù)據(jù)發(fā)送完后,主機(jī)釋放 SDA,以檢測(cè)從機(jī)應(yīng)答

              I2CDelay();

              I2C_SCL = 1; //拉高 SCL

              ack = I2C_SDA; //讀取此時(shí)的 SDA 值,即為從機(jī)的應(yīng)答值

              I2CDelay();

              I2C_SCL = 0; //再拉低 SCL 完成應(yīng)答位,并保持住總線

              return ack; //返回從機(jī)應(yīng)答值

              }

              /* I2C 尋址函數(shù),即檢查地址為 addr 的器件是否存在,返回值-從器件應(yīng)答值 */

              bit I2CAddressing(unsigned char addr){

              bit ack;

              I2CStart(); //產(chǎn)生起始位,即啟動(dòng)一次總線操作

              //器件地址需左移一位,因?qū)ぶ访畹淖畹臀?/p>

              //為讀寫位,用于表示之后的操作是讀或?qū)?/p>

              ack = I2CWrite(addr《《1);

              I2CStop(); //不需進(jìn)行后續(xù)讀寫,而直接停止本次總線操作

              return ack;

              }

              我們把這個(gè)程序在 KST-51開發(fā)板上運(yùn)行完畢,會(huì)在液晶上邊顯示出來我們預(yù)想的結(jié)果,主機(jī)發(fā)送一個(gè)存在的從機(jī)地址,從機(jī)會(huì)回復(fù)一個(gè)應(yīng)答位,即應(yīng)答位為 0;主機(jī)如果發(fā)送一個(gè)不存在的從機(jī)地址,就沒有從機(jī)應(yīng)答,即應(yīng)答位為 1。

              前面的章節(jié)中已經(jīng)提到利用庫函數(shù)_nop_()可以進(jìn)行精確延時(shí),一個(gè)_nop_()的時(shí)間就是一個(gè)機(jī)器周期,這個(gè)庫函數(shù)包含在 intrins.h 這個(gè)文件中,如果要使用這個(gè)庫函數(shù),只需要在程序最開始,和包含 reg52.h 一樣,include之后,程序中就可以使用這個(gè)庫函數(shù)了。

              還有一點(diǎn)要提一下,I2C通信分為低速模式 100kbit/s、快速模式 400kbit/s 和高速模式3.4Mbit/s。因?yàn)樗械?I2C 器件都支持低速,但卻未必支持另外兩種速度,所以作為通用的I2C 程序我們選擇 100k 這個(gè)速率來實(shí)現(xiàn),也就是說實(shí)際程序產(chǎn)生的時(shí)序必須小于等于 100k的時(shí)序參數(shù),很明顯也就是要求 SCL 的高低電平持續(xù)時(shí)間都不短于 5us,因此我們?cè)跁r(shí)序函數(shù)中通過插入 I2CDelay()這個(gè)總線延時(shí)函數(shù)(它實(shí)際上就是 4 個(gè) NOP 指令,用 define 在文件開頭做了定義),加上改變 SCL 值語句本身占用的至少一個(gè)周期,來達(dá)到這個(gè)速度限制。如果以后需要提高速度,那么只需要減小這里的總線延時(shí)時(shí)間即可。

              此外我們要學(xué)習(xí)一個(gè)發(fā)送數(shù)據(jù)的技巧,就是I2C通信時(shí)如何將一個(gè)字節(jié)的數(shù)據(jù)發(fā)送出去。大家注意函數(shù) I2CWrite 中,用的那個(gè) for 循環(huán)的技巧。for (mask=0x80; mask!=0; mask》》=1),由于 I2C 通信是從高位開始發(fā)送數(shù)據(jù),所以我們先從最高位開始,0x80 和 dat 進(jìn)行按位與運(yùn)算,從而得知 dat 第 7 位是 0 還是 1,然后右移一位,也就是變成了用 0x40 和 dat 按位與運(yùn)算,得到第 6 位是 0 還是 1,一直到第 0 位結(jié)束,最終通過 if 語句,把 dat 的 8 位數(shù)據(jù)依次發(fā)送了出去。其它的邏輯大家對(duì)照前邊講到的理論知識(shí),認(rèn)真研究明白就可以了。容-源-電-子-網(wǎng)-為你提供技術(shù)支持

              本文地址:http://m.zskn.com.cn/dz/22/15755085833520.shtml


              本文標(biāo)簽:


              .
              首頁 上一頁123下一頁尾頁
              頂一下
              0%
              返回首頁
              0
              0%

              ------分隔線----------------------------
              發(fā)表評(píng)論
              請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
              表情:
              名稱: E-mail: 驗(yàn)證碼: 匿名發(fā)表
              發(fā)布文章,推廣自己產(chǎn)品。
              熱門標(biāo)簽
               
              主站蜘蛛池模板: 精品服丝袜无码视频一区| 娇妻玩4p被三个男人伺候电影| 久久精品免视看国产成人| 国产亚洲av手机在线观看| 国产成人精品视频一区二区不卡| 人人妻人人澡人人爽国产| 极品无码国模国产在线观看| 亚洲人成网亚洲欧洲无码| 久久精品久久电影免费理论片| 亚洲色成人网站www永久下载| 日本精品巨爆乳无码大乳巨| 免费无码av一区二区波多野结衣| 国产成人亚洲老熟女精品| 成 人影片 免费观看| 日本一区二区三区日本免费| 国内精品自产拍在线播放| 国产av一区二区三区| 免费的av网站在线观看国产精品 | 午夜视频久久久久一区| 亚洲欧美成人久久综合中文网 | 久久精品国产只有精品96| 国产国语对白露脸正在播放| 日韩av片无码一区二区不卡| 国产精品青青青高清在线 | 久久午夜无码鲁丝片| 久久草莓香蕉频线观| 人妻少妇精品视频专区| 国产94在线 | 亚洲| 免费无码无遮挡裸体视频在线观看 | 亚洲国产欧美日韩欧美特级| 日韩精品一区二区三区人| 免费视频爱爱太爽了| 无码日韩人妻av一区免费| 疯狂做受XXXX高潮国产| 亚洲国产超清无码专区| 日韩做a爰片久久毛片a片 | 一本久久精品一区二区| 韩国精品无码久久一区二区三区| 啊轻点灬大JI巴太粗太长了在线| 青草视频在线观看视频| 人妻精品丝袜一区二区无码av|