📄 text1.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 + -