1. 程式人生 > >關於微控制器IIC匯流排的理解(附程式)

關於微控制器IIC匯流排的理解(附程式)

#include<iic.h>

void delay10us(void){//誤差 0us
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}

void iicStart(){
	SDA = 1;
	delay10us();
	SCL = 1;
	delay10us();
	SDA = 0;
	delay10us();
	SCL = 0;//SCL=0時,SDA狀態允許變化
	delay10us();

}

unsigned char iicSendDate(unsigned char dat){
	unsigned char i,a;
	for(i=0;i<8;i++){
		SDA = dat>>7;
		dat>>=1;
		SCL = 1;
		delay10us();
		SCL = 0;
		delay10us();
	}
	//等待應答. SCL、SDA釋放   等待應答時,SCL=1,SDA=1,應答後,SDA=0
	SDA = 1;
	delay10us();
	SCL = 1;
	//delay10us();  不需要延時,後面通過a++延時,來判斷是否傳送成功
	//應答與否—————_是否傳送成功
	while(SDA){//若應答,則SDA=0,從而結束迴圈,返回1.		
	   a++;
	   delay10us();
	   if(a>200){
             SCL = 0;
             delay10us();
            return 0;
	   }
	   
	}
	SCL = 0;//SCL=0時,允許SDA狀態發生變化,為了下一次傳送
	delay10us();
	return 1;
		
}
//讀取過程,主機先發送從機器件地址,要讀取的地址,後要重複一次起始訊號併發出器件地址和讀取方向1 (傳送函式包含等待從機應答過程即等待 SDA=0的過程)
//傳送完後,scl = 0; 才開始讀取資料過程——iicReadDate()函開始數執行
unsigned char iicReadDate(){
	unsigned char i,dat = 0;	
	//scl =0;之前已經等於0了,不用寫
	SDA = 1;//讀取位元組前,先釋放SDA,SDA=1不是將埠固定位高電平,而是關閉微控制器
	        //內部下MOG管,讓SDA線的電平由訊號決定。
	delay10us();//等待SDA為狀態的更新
	for(i=0;i<8;i++){//接受8個位元組
		SCL = 1;//SDA為高電平時,資料是穩定的
		delay10us();
		dat<<=1;//iic是序列傳輸的,只能一位一位傳輸,並且最高位在前
		dat |=SDA;//將dat左移一位,然後將SDA位的狀態放到dat的最後一位,賦值給dat,迴圈8次,依次寫到dat的8個位中。dat的最初的首位被移出,
		delay10us();
		SCL = 0;//SCL=0時,SDA狀態才允許發生變化。為後續的終止訊號做準備。
		delay10us();
				
	}
	return dat;				

}
void iccStop(){
	SDA = 0;
	delay10us();
	SCL = 1;  //釋放
	delay10us();
	SDA = 1;  //釋放
	delay10us();

}
//iic匯流排  相當於資料線,由微控制器模擬。

//往24c02的一個地址寫入資料
void at24co2WriteDate(unsigned char addr,unsigned char dat){
	
	iicStart();//開始

	iicSendDate(0xa0);//傳送寫器件地址	1010 000 0
	iicSendDate(addr);//傳送該器件的儲存區的首地址
	iicSendDate(dat);//傳送資料

	iicStop();//停止
						
}

//從24c02內讀取資料
unsigned char at24c02ReadDate(unsigned char addr ){	//addr:器件的儲存區的首地址。器件的地址已知
	unsigned char num;
	iicStart();//開始

	iicSendDate(0xa0);//傳送器件地址+0		
	iicSendDate(addr);//傳送該器件的儲存區的首地址
	iicStart();
	iicSendDate(0xa1);

	num = iicReadDate();

	iicStop();//結束		
	
	return num;
}

相關推薦

關於微控制器IIC匯流排理解程式

#include<iic.h> void delay10us(void){//誤差 0us unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } void

對request.getSession(false)的理解程式設計師常疏忽的一個漏洞

【前面的話】 在網上經常看到有人對request.getSession(false)提出疑問,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官網是怎麼解釋的。  【官方解釋】   getSession  public

十大經典排序演算法程式

轉自https://www.cnblogs.com/onepixel/articles/7674659.html 0、演算法概述 0.1 演算法分類 十種常見排序演算法可以分為兩大類: 非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破O(nlog

轉:生成對抗網路GANs理解程式碼

from:http://blog.csdn.net/sxf1061926959/article/details/54630462 author:DivinerShi 生成模型和判別模型 理解對抗網路,首先要了解生成模型和判別模型。判別模型比較好理解,就像分類一樣,

Siamese Network理解程式碼

author:DivinerShi 提起siamese network一般都會引用這兩篇文章: 《Learning a similarity metric discriminatively, with application to face verifi

使用高德地圖微信小程式SDK開發案例-輸入提示原始碼

閒來無事寫一篇使用高德地圖的微信小程式SDK開發應用的例項。 接下來先看需求: 我們要做的是,根據使用者輸入的關鍵詞,給出相應的提示資訊,列表中顯示地方的名稱,地方的詳細地址以及對應的經緯度座標。 當然在UI上我們儘量做到理想的視覺與較好的使用者體驗。 最終的效果我們希望是像這樣的,

Java程式設計師從笨鳥到菜鳥之八十二細談Spring十一深入理解spring+struts2整合原始碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python實現Excel檔案讀取的程式原始碼

python實現Excel檔案讀取的程式   前一段時間幫一個朋友用python寫了一個讀Excel程式操作的程式,具體要求為:讀取兩個Excel檔案,根據其中某個特徵的特徵值對這兩個檔案進行取交集操作,生成三個Excel檔案,第一個Excel檔案為這兩個檔案的公

課設 - 基於微控制器的溫控報警系統設計 電路+程式

  本設計所介紹的數字溫度計與傳統的溫度計相比,具有讀數方便,測溫範圍廣,測溫準確,其輸出溫度採用數字顯示,主要用於對測溫比較準確的場所,或科研實驗室使用,該設計控制器使用微控制器AT89S51,測溫感測器使用DS18B20,用3位共陽極LED數碼管以串列埠傳送資料,實現溫度顯示,

微信小程式入門教程原始碼

五分鐘上手-微信小程式 1:用沒有註冊過微信公眾平臺的郵箱註冊一個微信公眾號, 申請帳號 ,點選 https://mp.weixin.qq.com/wxopen/waregister?action=step1 根據指引填寫資訊和提交相應的資料,就可以擁有自己的小程式帳號。註冊完成之後開始登入。

基於微控制器的數字鐘系統設計電路+程式

上圖是Proteus模擬圖,其中反相器用74lHC14,排阻用10K的,晶振用12MHZ的,電阻R1-R8用200歐的即可。但在實際製作時數碼管可以用兩個四位一體共陽極的,這樣連線電路會更加方便。可以用三極體代替反相器,這樣可以節約成本,但代替後無法用Proteus模擬出來,下圖為代替後的圖

人工神經網路ANN程式理解python3.0——單隱層MINST

1資料說明:MNIST包 資料為:28*28*1 單通道28*28的0~9的數字圖片; 訓練資料60000張;測試資料10000張;並且每張圖片對應的label是圖片中顯示的數字 train-images-idx3-ubyte 訓練資料影象 (60,000)

從馬爾科夫過程到吉布斯取樣程式示例

目標:如何採取滿足某個概率分佈的一組資料,比如如何給出滿足標準正太分佈的1000個點,當然該分佈比較簡單,生成滿足此分佈的1000個點並不難,對matlab,python 等都是一行語句的事,但是如果是一個不常見的分佈,怎樣採集呢? 本文試圖通過示例讓讀者理解從馬爾科夫鏈到

《OpenCV3程式設計入門》——5.5.8 離散傅立葉變換綜合示例程式程式碼

綜合《OpenCV3程式設計入門》——5.5 離散傅立葉變換原理和 《OpenCV3程式設計入門》——5.5.2 離散傅立葉變換相關函式詳解兩篇文章對離傅立葉變換的詳細介紹,本篇將展示實現離散傅立葉變化的示例程式(本篇所涉及的所有知識均在上述兩篇博文裡有詳細解釋,請參考): //--------

程式理解碎片知識

1、const app =getApp() 獲取app.js裡面的全域性變數。 2、前端頁面的xx.wxml資料是從xx.js裡面的Page({ data:  })裡面取的。 3、xx.js裡面 var userLikeVideo = me.data.userLikeVi

碉堡了!程式設計師用深度學習寫了個老闆探測器原始碼

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《實戰核心技術詳解》電子工業出版社等。當今,人工智慧和深度學習得到了快速發展,由於大資料的存在,它的發展也變的

他用了六年從普通JAVA程式設計師到阿里架構師程式設計師漲薪必備

工作年限:8 年服務公司:4 家(含四大門戶中的兩家)最近職業:Java 架構師職場關鍵詞:社交平臺、高併發系統架構設計、技術團隊管理、多款從零到一的產品城市!六年間,這位職人呆過四大門戶中的兩家,完成了工程師到架構師的蛻變。經手多款從零到一產品的開發和增長,也經歷國內最大社

01揹包的理解,二維陣列化一維陣列的理解hdu2602 Bone Collector

01揹包問題: 有n個物品和一個容量為v的揹包,用val[i]表示第i個物品的價值,用vol[i]表示第i個物品的體積,那麼,如何使揹包裡裝的物品的總價值最大呢? 貪心是不行的,舉個反例: n=3, v=100 val[i] vol[i]

一個簡單的用ASP.NET/C#開發的元件化Web應用程式原始碼

==============================================================================1)建立一個類來處理使用者登入,將該類編譯成一個裝配件(assembly),併發布到站點的bin目錄下。========

程式開發快速入門教程原始碼

五分鐘上手-微信小程式image我們可以在選單 “設定”-“開發設定” 看到小程式的 AppID 了 。小程式的 AppID 相當於小程式平臺的一個身份證,後續你會在很多地方要用到 AppID (注意這裡要區別於服務號或訂閱號的 AppID)。有了小程式帳號之後,我們需要一個工具來開發