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

📄 text1.c

📁 用Keil写的LPC938I2C通讯程序
💻 C
字号:
#include <reg922.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define _Nop()  _nop_()
#define GENERATE_STOP        0x54     /* 置位 STO, 复位 STA 、 SI          */
#define RELEASE_BUS_ACK      0x44     /* 复位 STO,STA,SI 并置位  AA (ack)  */
#define RELEASE_BUS_NOACK    0x40     /* 复位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA      0x64     /* 起动总线/重新起动总线, 置位 STA   */

void dally_timer1(uint data ms);
void SendByte(uchar c);
bit ISendByte(uchar sla, uchar *c);
void GetBus();


/********************************************************************
使用定时器1延时n毫秒
********************************************************************/
void dally_timer1(uint data ms)
{
	uint i;
 	TR1=1;//启动定时器T1
  for(i=ms*25;i>0;i--)
  {
		while(TF1==0)
    {
      _Nop();
    };
    TF1=0;//清除T1溢出标志TF1
  }
  TR1=0;//关闭定时器T1
}

/*******************************************************************
*                  申请总线
* 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
*       I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
*******************************************************************/

void GetBus()
{ 
	I2SCLH = 15;				/* 设置SCL高电平的PCLK周期数 				    */
  I2SCLL = 15;              /* 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S */
  I2CON = RELEASE_BUS_STA; /* 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位.*/	
  while( SI==0 );        	/* 等待起始位的发送                             */
}


void SendByte(uchar c)
{ 
	I2DAT = c;
  I2CON = RELEASE_BUS_ACK;    	/* 清除SI位等等   		*/
  while( SI==0 );        		/* 等待数据的发送 		*/
}



/*******************************************************************
*                    向无子地址器件发送字节数据函数               
* 功能:从启动总线到发送地址,数据,结束总线的全过程。
* 入口参数:sla		从器件地址
*           c		待发送的数据
* 出口参数:返回1表示操作成功,否则操作有误。
********************************************************************/
bit ISendByte(uchar sla, uchar *c)
{ 
	GetBus();                 	/* 启动总线                    */
  SendByte(sla);            	/* 发送器件地址,并接收应答位  */
  if( I2STAT!=0x18 )			/* 无从机应答则退出操作        */
  { 
		I2CON = GENERATE_STOP;
    return(0);
  }

  SendByte(*c);              	/* 发送数据                    */
  if( I2STAT!=0x28 )
  { 
		I2CON = GENERATE_STOP;
    return(0);
  }
  I2CON = GENERATE_STOP;        /* 结束总线                    */ 
  return(1);
}


void main()
{
  bit TMP;
  uchar byte[4]="7";
  P0M1=0x00;
  P0M2=0x00;
  P1M1=0x0C;//P1.2,P1.3配置为开漏,其他为双向I/O口
  P1M2=0x0C;
  P3M1=0x00;
  P3M2=0x00;

  P0=0xff;
  P1=0xff;
  P3=0xff;

  SP=0x7F;

	TMOD=0x20;//T1工作方式2
  TAMOD=0x00;
  TL1=0x6C;//装入T1初值
  TH1=0x6C;

  I2CON=0x44;//主发送器模式初始化
  I2STAT=0;
//I2ADR=0x70;//从机地址为70h
  I2SCLH=0x0E;//数据波特率为123Kbit/s
  I2SCLL=0x0E;
  dally_timer1(1000);
		do
	  {
	    TMP=ISendByte(0x70,byte);//等待发送成功
    }while(!TMP);
	
	while(1)
  {
	  
  }
}

⌨️ 快捷键说明

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