天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

PIC單片機軟件模擬i2c讀2402cC語言

更新時間: 2019-03-22
閱讀量:2727

十年單片機開發方案公司深圳英銳恩分享PIC單片機軟件模擬i2c讀2402cC語言。

/*******************************************************************
一、程序說明:
1, 24LC02器件地址是1010000R/W.
2, 數組寫入24LC02采取頁寫方式.
3, 數組code從24LC02讀出時采取自由讀方式.
4, 采用4.00M晶體。
5,采用軟件I2C。

二、硬件連接:
1, SDA------->23 pin.(當然你可以任意選擇腳位)
2,  SCL------->18 Pin.(當然你可以任意選擇腳位)
3, PORTD----->外接8個LED,顯示讀出的數據,在這里,讀出的剛好是一個閃動的流水燈狀態。

*******************************************************************/
#include "pic.h"

#define uchar   unsigned char
#define nop()  asm("nop"
#define SCL  TRISC3
#define SDA  TRISC4

void start_i2c();
void stop_i2c();
void send_byte(uchar c);
uchar receive_byte();
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
void delay_250ms();
void i2c_error ();

uchar code[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
uchar no,ack,c,data; 

void main(void)
{
 uchar i;
 TRISC=0Xff;     //C口設為輸入 RC3為SCL線,RC4為SDA線。
 PORTC=0X00;    
 TRISD=0X00;     //D口為輸出,顯示IC24LC02中讀出的內容
 PORTD=0X00;     //初始顯示全亮

 I_send_str(0xa0,0x00,code,9); //頁寫入code數組到24LC02,器件地址為0Xa0,子地址為0X00,共9個數。
 
 delay_250ms();
 

 ///////////開始讀出到D口進行顯示,根據Random read時序圖。
 while (1) 

 {
    for (i=0x00;i<0x09;i++)
     {
      start_i2c();
      send_byte(0xa0);      //發送器件地址,即DEVICE ADDRESS。
        if (ack==0) i2c_error(); //如果24LC02無應答。則進入I2C ERROR錯誤指示。
      send_byte(i);         //發送字地址,即WORD ADDRESS。D口顯示數組。
        if (ack==0) i2c_error();
      start_i2c();          //重新啟動總線。
      send_byte(0xa1);      //發送讀命令和器件地址DEVICE ADDRESS。
        if (ack==0) i2c_error();
      data=receive_byte();
      stop_i2c();
      PORTD=data;
      delay_250ms();
     }
  }
}


/*******************************************************************
起動總線函數
函數原型: void start_i2c();
Function: start on the I2C bus
*******************************************************************/
void start_i2c()
{
 SDA=1;       //發送啟始條件的數據信號
 nop();
 SCL=1; 

 nop();nop();nop();nop();nop(); //24LC02要求建立時間大于4,7S
 SDA=0;                      //發送起始信號
 nop();nop();nop();nop();nop();
 SCL=0;                      //鉗住I2C總線,準備發送數據或接收數據
 nop();nop();
}


/*******************************************************************
停止總線函數
函數原型: void stop_i2c();
Function: stop the I2C bus
*******************************************************************/
void stop_i2c()

SDA=0; //發送結束條件的數據信號
 nop();
 SCL=1;
 nop();nop();nop();nop();nop();
 SDA=1;
 nop();nop();nop();nop();
}

/*=================================================================
字節數據傳送函數
函數原型: void send_byte(uchar c);
Function: 將數據C發送出去,可以是地址,也可以是數據,發完后等待回應,并對此狀態
         位進行操作(不應答或非應答都使ack=0 ),發送數據正常,ack=1;ack=0
         表示被控器無應答或損壞。
==================================================================*/
void send_byte(uchar c)
{
 uchar bit_count;
 for (bit_count=0;bit_count<8;bit_count++)
  {
   if ((c<<bit_count)&0x80) {sda="1;}">   else {SDA=0;}
   nop();
   SCL=1;
   nop();nop();nop();nop();nop();
   SCL=0;
  }
  nop();nop();
  SDA=1; 

 nop();nop();
  SCL=1;
  nop();nop();nop();
  if (RC4==1) ack=0;
  else ack=1; //用ASK=1為有應答信號
  SCL=0;
  nop();nop();
}

/*==================================================================
字節數據接收函數
函數原型:uchar receive_byte();
FUNCTION: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
         發完后請用應答函數。
===================================================================*/
uchar receive_byte()
{
  uchar retc,bit_count; 

retc=0;
  SDA=1;
  for (bit_count=0;bit_count<8;bit_count++)
  {
     nop();
     SCL=0;
     nop();nop();nop();nop();nop();
     SCL=1;
     nop();nop();
     retc=retc<<1;
     if (RC4==1)  retc=retc+1;
     nop();nop();
   }
   SCL=0;
   nop();nop();
   return (retc);
}


/*================================================================
向有子地址器件發送多字節數據函數
函數原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
Function: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla。如果
         返回1表示操作成功,否則操作有誤。 

=================================================================*/
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)
{
  uchar i;
  start_i2c();
  send_byte(sla);
  if (ack==0)  i2c_error();
  send_byte(suba);
  if (ack==0)  i2c_error();
  for (i=0;i<no;i++)>   {
     send_byte(*s);
     if (ack==0)  i2c_error();
     s++;
   }
  stop_i2c();
 // return(1);

/*****************************************************************
延時函數
函數原型: void delay_250ms();
FUNCTION: 延明250ms
*****************************************************************/
void delay_250ms()
{
 unsigned int d=24999;
 while (--d);
}

/*****************************************************************
總線錯誤函數
函數原型: void i2c_error();
Function: 通過RD7閃動8次表示總線操作失敗一次報警。
*****************************************************************/
void i2c_error ()
{
 uchar i;
 for (i=0;i<8;i++)
 {
   RD7=0;
   delay_250ms();
   RD7=1;
   delay_250ms();
 }
 
}
/**********END**************/

联系我们: 上蔡县| 建阳市| 丹巴县| 资源县| 儋州市| 琼中| 苍南县| 文成县| 合肥市| 文昌市| 龙州县| 象山县| 南雄市| 行唐县| 安乡县| 桃源县| 乌鲁木齐市| 连州市| 海淀区| 贡觉县| 哈密市| 丹棱县| 文山县| 大荔县| 理塘县| 洮南市| 霍山县| 清河县| 合阳县| 祁连县| 长子县| 盘锦市| 麟游县| 无锡市| 公主岭市| 德庆县| 桂东县| 民乐县| 凌源市| 余江县| 靖安县|