⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24cxx.c

📁 模拟编写的软件用PIC单片机控制ATC240C
💻 C
字号:

//温度控制器  显示温度0-99  有3个功能:温度预设定,电机工作时间设定,防冻温度设定
//具有数据记忆功能

 #include<pic.h>
#include"AT24CXX.h"

//*********变量类型***************
#define     uchar     unsigned  char  
#define	    uint      unsigned  int   
#define	    ulong      unsigned long   
//*[[[[[[[[[[[[[[[[[24C02的函数与定义[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#define nop()  asm("nop")
#define SCL  RC6 //时钟
#define SDA  RC7 //数据

void start_i2c();  //
void stop_i2c(); 
void send_byte(uchar c); 
uchar receive_byte(); 
void I_send_str(uchar *s,uchar suba,uchar no) ; 
void delay_250ms(); 
void i2c_error (); 
void  RdFromROM(uchar *s,uchar Ader, uchar Num);

static  const  uchar    slaw  =   0x0A0;       //这一部分需要自己修改        
static  const  uchar    slar  =   0x0A1;       //这一部分需要自己修改
//********自定义II2发送与接收数组变量**************
//*********I2C*******

uchar no,ack,c,retc;//data1是接受数组;
//*]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]以上此内容为我所加第
//*[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[以下此内容为我所加第二部分[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*/



//《〈〈〈〈〈〈〈〈〈〈I2C函数〉〉〉〉〉〉〉〉〉〉》》》》
/******************************************************************* 
起动总线函数 
函数原型: void start_i2c(); 
Function: start on the I2C bus 
*******************************************************************/ 
void start_i2c() 
{
 TRISC6=0;
 TRISC7=0; 
 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() 
{ 
 TRISC6=0;
 TRISC7=0; 
 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;
 TRISC6=0;
 TRISC7=0; 
 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(); 
 
 TRISC7=1;
  if (RC7==1) ack=0; 
  else ack=1; //用ASK=1为有应答信号 
  SCL=0; 
  nop();nop(); 
} 

/*================================================================== 
字节数据接收函数 
函数原型:uchar receive_byte(); 
FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 
         发完后请用应答函数。 
===================================================================*/ 
uchar receive_byte() 
{ 
 
  uchar retc,bit_count;
   TRISC6=0;
 TRISC7=0;
  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; 

     TRISC7=1;
     if (RC7==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 *s,uchar suba,uchar no) 
{ 
 
  uchar i; 
  start_i2c(); 
  send_byte(slaw); 
  TRISC6=0;
  TRISC7=0;
  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); 
} 
//**********从24C04读多字节到data1****

void  RdFromROM(uchar *s,uchar Ader ,uchar Num)
{
     uchar i=0;
     TRISC6=0;
     TRISC7=0;
    for (i=0x00;i<Num;i++) 
     { 
      start_i2c(); 
      send_byte(slaw);      //发送器件地址,即DEVICE ADDRESS。 
        if (ack==0) i2c_error(); //如果24LC02无应答。则进入I2C ERROR错误指示。 
      send_byte(Ader+i);         //发送字地址,即WORD ADDRESS。D口显示数组。 
        if (ack==0) i2c_error(); 
      start_i2c();          //重新启动总线。 
      send_byte(slar);      //发送读命令和器件地址DEVICE ADDRESS。 
        if (ack==0) i2c_error(); 
      *(s+i)=receive_byte(); 
      stop_i2c(); 
   }

}


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

/***************************************************************** 
总线错误函数 
函数原型: void i2c_error(); 
//Function: 通过RB0闪动8次表示总线操作失败一次报警。 
*****************************************************************/ 
void i2c_error () 
{ 
 uchar i; 
 for (i=0;i<8;i++) 
 { 
   RB5=0; 
   delay_250ms(); 
   RB5=1; 
   delay_250ms(); 
 } 
  
} 
/*********I2C结束*************/
//]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -