1. 程式人生 > >【藍橋杯|微控制器組】| I2C通訊(官方程式碼) + EEPROM

【藍橋杯|微控制器組】| I2C通訊(官方程式碼) + EEPROM

     之前我寫的I2C通訊協議是基於“金沙灘”的教程,程式碼比較繁瑣,為了能在之後的比賽中提高效率,本次就以官方提供的I2C通訊協議來實現單位元組的存取,同時也當作對I2C協議的複習。

該協議有關主機(微控制器)與從機(板子上焊的晶片AT24C02)之間的資料傳輸。首先我們先來認識一下AT24C02


       AT24C02提供2024位的連續的可擦除的可程式設計的只讀的儲存器(就是我們所說的EEPROM了,實質是一個斷電資料不丟失的儲存器),有共256位元組的內部儲存空間,就也是說有256個內部儲存空間的地址,地址長度有8位。再換句話說AT24C02是一幢房子,該房子裡有256個房間,房間的地址就是房間的門牌號。

由藍字也可以推出AT24C02這幢房子也有其地址,如下圖:


如圖,1K/2K處所對應的是AT24C02的地址(高7位是地址位,最後一位是讀寫位

廢話不多說,程式碼走起:

標頭檔案部分(官方I2C通訊協議)

/*

  程式說明: IIC匯流排驅動程式  軟體環境: Keil uVision 4.10   硬體環境: CT107微控制器綜合實訓平臺 8051,12MHz  日    期: 2011-8-9*/#include "reg52.h"#include "intrins.h"#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();};sbit SDA = P2^1;  /* 資料線 */
sbit SCL = P2^0;  /* 時鐘線 *///匯流排啟動條件void IIC_Start(void){SDA = 1;SCL = 1;somenop;SDA = 0;somenop;SCL = 0;}//匯流排停止條件void IIC_Stop(void){SDA = 0;SCL = 1;somenop;SDA = 1;}//應答位控制void IIC_Ack(bit ackbit){if(ackbit) {SDA = 0;}else {SDA = 1;}somenop;SCL = 1;somenop;SCL = 0;SDA = 1; //釋放匯流排somenop;}//等待應答bit IIC_WaitAck(void)
{SDA = 1;//釋放匯流排!釋放匯流排!釋放匯流排!重要的事情說三遍,不是傳資料1,第九位是是應答位,不再傳資料了somenop;SCL = 1;somenop;if(SDA)    {   SCL = 0;IIC_Stop();return 0;}else   //讀取或寫入資料成功,SDA返回0SCL = 0;return 1;}}//通過I2C匯流排傳送資料void IIC_SendByte(unsigned char byt)   //相當於最基本的寫位元組{unsigned char i;for(i=0;i<8;i++){   if(byt&0x80) {SDA = 1;}else {SDA = 0;}somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}}//從I2C總線上接收資料unsigned char IIC_RecByte(void){unsigned char da;unsigned char i;for(i=0;i<8;i++){   SCL = 1;somenop;da <<= 1;if(SDA) da |= 0x01;SCL = 0;somenop;}return da;}

主程式

#include<reg52.h>
#include<I2C.h>
/*對WaitAck的解釋 實際為時序圖中的bit9,SendByte函式沒處理*/ 


unsigned char code LedChar[]={             //數碼管真值表
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E
};


unsigned char LedBuff[8]={ //數碼管緩衝區
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF
};


unsigned char read_eeprom(unsigned char add) ;
void write_eeprom(unsigned char add,unsigned char d);
void LedScan();


/*****數碼管模組*****/
void ConfigTimer0();  
void ShowNumber(unsigned char dat);


void main()
{
  unsigned char dat=0;


  ConfigTimer0();


  dat=read_eeprom(0x02);
  dat++;
  write_eeprom(0x02,dat);
  
  ShowNumber(dat);


  while(1);


}


void ShowNumber(unsigned char dat)
{
  unsigned char num[8];
  unsigned char i=0;
  unsigned char d;


  d=dat;


  for(i=0;i<8;i++)
  {
num[i]=d%10;
d/=10;
  }
  for(i=0;i<8;i++)
  {
 LedBuff[i]=LedChar[num[i]];
  }
   for(i=7;i>=1;i--)  //顯示0的數碼管全滅
   {
          if(LedBuff[i]==0xc0)
 {
  LedBuff[i]=0XFF;
 }
 else break;
   }


}


unsigned char read_eeprom(unsigned char add)  
{  
  unsigned char d;  
  IIC_Start();  
  IIC_SendByte(0xa0);     //第一步,I2C定址,高7位(地址位),低一位(讀寫位)
  IIC_WaitAck();          //等待應答
  IIC_SendByte(add);      //第二步,傳送要進行讀操作的地址  
  IIC_WaitAck();       //等待應答
  IIC_Start();          //第三步,進行讀操作
  IIC_SendByte(0xa1);    //傳送讀操作  
  IIC_WaitAck();         //等待應答
  d=IIC_RecByte();         //讀一位元組,同樣沒有對bit9進行操作  
  IIC_Ack(0);         //第四步,該函式使 SDA=1;應答位返回1,表示不讀了
  IIC_Stop();  
  return d;  

 
void write_eeprom(unsigned char add,unsigned char d)  
{  
  IIC_Start();  
  IIC_SendByte(0xa0);   //第一步,I2C定址 
  IIC_WaitAck();        //等待應答
  IIC_SendByte(add);    //傳送要進行寫操作地址  
  IIC_WaitAck();       //等待應答
  IIC_SendByte(d);       //寫一位元組  
  IIC_WaitAck();       //等待應答
  IIC_Stop();  


}  


void ConfigTimer0() 
{
   EA=1;
   TMOD=0X01;
   TH0=(65536-1000)/256;
   TL0=(65536-1000)%256;
   ET0=1;
   TR0=1;
}


void LedScan()                        //實際為數碼管掃描
{
    static unsigned char i=0;
P2&=0X1F;
P0=0X80>>i;
P2|=0XC0;
P2&=0X1F;
P0=LedBuff[i];
P2|=0XE0;          
P2&=0X1F;
    if(++i==8) i=0;
}


void IntterruptTimer0() interrupt 1
{
   TH0=(65536-1000)/256;
TL0=(65536-1000)%256;

LedScan();//LED 掃描

}

最後我再想囉嗦一下,有關官方驅動 IIC_WaitAck 函式的作用是等待應答(如下時序圖中的第9位)


  

相關推薦

藍橋|微控制器| I2C通訊官方程式碼 + EEPROM

     之前我寫的I2C通訊協議是基於“金沙灘”的教程,程式碼比較繁瑣,為了能在之後的比賽中提高效率,本次就以官方提供的I2C通訊協議來實現單位元組的存取,同時也當作對I2C協議的複習。該協議有關主機(微控制器)與從機(板子上焊的晶片AT24C02)之間的資料傳輸。首先我們

藍橋微控制器實時時鐘RTCDS1302

1、暫存器表 注意: (1)ds1302.h中提供的暫存器地址是寫地址,讀暫存器時需要將地址加一 (2) #define ds1302_control_addr 0x8Ee //防寫命令字單元地址對應上圖倒數第二行:BIT7 = 0(取消防寫)、BIT7 = 1(上

藍橋微控制器6uart

(1)波特率的概念:1bps = 1 bit/s (2)板載資源有兩個串列埠,僅UART1可以通過USB連線電腦 (3)四種方式波特率計算公式:(fosc:晶振頻率 ) 方式1:baud = fosc / 12; 方式2:baud = (2^smod / 32) * (T1

Java TCP/IP SocketUDP Socket程式碼

UDP的Java支援     UDP協議提供的服務不同於TCP協議的端到端服務,它是面向非連線的,屬不可靠協議,UDP套接字在使用前不需要進行連線。實際上,UDP協議只實現了兩個功能:     1)在IP協議的基礎上添加了埠;     2)對傳輸過程中可能產生的資料錯誤

藍橋學習記錄6不定方程的解法

一次不定方程 4 * x - 5 * y = 7;ax + by = c;         a = 4 , b = -5 , c = 7; ax = c - by; 1 .先求一個特殊解    x0  

藍橋C語言 基礎練習 數列排序

問題描述  給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200輸入格式  第一行為一個整數n。  第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式  輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入58 3 6

第六屆藍橋決賽 第二題 完美正方形 線段樹

完美正方形 如果一些邊長互不相同的正方形,可以恰好拼出一個更大的正方形,則稱其為完美正方形。 歷史上,人們花了很久才找到了若干完美正方形。比如:如下邊長的22個正方形 2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 2

藍橋C語言Fibonacci數列問題

問題描述Fibonacci數列的遞推公式為:Fn=Fn-1+Fn-2,其中F1=F2=1。當n比較大時,Fn也非常大,現在我們想知道,Fn除以10007的餘數是多少。輸入格式輸入包含一個整數n。輸出格式輸出一行,包含一個整數,表示Fn除以10007的餘數。說明:在本題中,答案

2015年藍橋A 牌型種數 dfs

小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子裡突然冒出一個問題: 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢? 請填寫該整數,不要填寫

Java TCP/IP Socket基於NIO的TCP通訊程式碼

   NIO主要原理及使用 NIO採取通道(Channel)和緩衝區(Buffer)來傳輸和儲存資料,它是非阻塞式的I/O,即在等待連線、讀寫資料(這些都是在一執行緒以客戶端的程式中會阻塞執行緒的操作)的時候,程式也可以做其他事情,以實現執行緒的非同步操作。    考

2015藍橋B第三題三羊獻瑞

三羊獻瑞 觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。 個人用的DFS搜尋,在0~9是個數字中搜索8個數字來滿足題目中要求的算式條件,最有去

PIC微控制器I2C通訊從模式

網上有許多講解微控制器 實現I2C主模式,但是從模式的很少。我現在就來講講PIC微控制器使用MSSP模組實現I2C從模式。     有關I2C協議的具體介紹可以看 《PIC微控制器之I2C(主模式)》,我們這裡直接講解例項     例項講解:我們模仿 AT24C02

java項目實戰代理模式Proxy Pattern,靜態代理 VS 動態代理

自己 text 好的 trace use 代理 分類 plproxy this 這篇博文,我們主要以類圖和代碼的形式來對照學習一下靜態代理和動態代理。重點解析各自的優缺點。 定義 代理模式(Proxy Pattern)是對象的結構型模式,代理模

第十七章 springboot + devtools熱部署

logs 只需要 gin 排除 pre pub ron 這樣的 plugin 技術介紹 devtools:是boot的一個熱部署工具,當我們修改了classpath下的文件(包括類文件、屬性文件、頁面等)時,會重新啟動應用(由於其采用的雙類加載器機制,這個啟動會非常快

大話存儲II學習筆記2章, SSD

ssd 中一 logs 什麽是 直接 範圍 平衡 機械 ive 我們知道機械硬盤最大的缺點在於,尋道時間比較長,也就是不適合隨機小塊IO。所以這幾年固態存儲大行其道,因為它對任何地址訪問的開銷都相等,節省了機械尋道時間,所以隨機IO性能很好。 當前的SSD硬盤,單塊SSD的

大話存儲II學習筆記15章,文件級集群系統

做的 引入 規模 載器 meta 之前 sys not 集群 【大話存儲II】學習筆記(15章),塊級集群存儲系統裏面分析的主要是塊集群系統,同樣文件級存儲也可以集群化。 因為NAS系統的前端網絡是以太網,速度比較低,導致NAS主要用於一些非關鍵業務中,比如文件共享。但是一

大話存儲II學習筆記15章,集群概論

但是 利用 參與 工作量 mar 容易 mage markdown 節點 隨著應用程序對服務器、存儲系統的系統要求越來越高,單臺設備有時已經無法滿足需求了,此時我們有兩種方法可以解決: 使用性能更高的機器,但是成本以及維護成本非常高,而且不見得適合所有的應用。 多臺設備聯

大話存儲II學習筆記15章,NoSQL

cnblogs 高並發 屏蔽 圖片 一定的 mon 是把 類型 擴容 互聯網運營商(NSP)的數據中心是數據最集中的地方,也正是因為海量的數據存儲與訪問,傳統的存儲架構已經無法滿足了現有的需求。 比如每秒幾十萬次的隨機IOPS、每秒10GB的流量,一般都需要使用高端存儲,當

大話存儲II學習筆記18章,數據前處理和後處理

分享圖片 精簡 upload 還需 客戶 相同 簡單 觸發 不同 存儲其實就是一臺主機,上面也運行著各種各樣的應用程序,可以在原本的裸數據之上實現更高級的功能,實現更多的附加值。現在的高端存儲越來越開發,比如EMC 的 V-MAX,高端存儲也用普通的x86了。 存儲系統有兩

24、華為HCIE-Storage--Hyper Snapshot塊業務

HCIE Storage hostman ------------------------------------重要說明------------------------------------以下部分內容來網絡,部分自華為存儲官方教材具體教材內容請移步華為存儲官網進行教材下載 網絡引用內容