新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 51单片机—再论IIC—软件通用包(汇编、c语言)—03

51单片机—再论IIC—软件通用包(汇编、c语言)—03

作者: 时间:2016-11-25 来源:网络 收藏

3)主控器向被控器发送应答位信号子程序MACK(由于这个信号和发送非应答信号在c语言里写在了一起,所以最后写c语言的程序)

;--------------------------------------------------------------
;发送应答信号子程序
MACK:
CLRSDA
NOP
NOP
SETBSCL
NOP;保持数据时间,既SCL为高,时间大于4.7us
NOP
NOP
NOP
NOP
CLRSCL
NOP
NOP
RET

4)主控器向被控器发送非应答新号子程序MNACK

;------------------------------------------------------------
;发送非应答信号子程序
MNACK:
SETBSDA
NOP
NOP
SETBSCL
NOP;保持数据时间,既SCL为高,时间大于4.7us
NOP
NOP
NOP
NOP
CLRSCL
NOP
NOP
RET

然后就是上两个的c的程序:

//---------------------------------------------------------------------
//主控器件向被控器件发送应答函数
void IIC_ack_send(bit a)
{
if(a==0) //发应答信号
sda=0;
else
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}

5)主控器件检查被控器件发送来的应答位

;---------------------------------------------------------------
;检测应答位子程序
;返回值ACK=1时表示应达
CACK:
SETBSDA
NOP
NOP
SETBSCL
CLRACK
NOP
NOP
MOVC,SDA
JCCEND
SETBACK ;应答位置1,既返回应答位为1
CEND:
NOP
CLRSCL
NOP

//-----------------------------------------------------------------
//主控器件接收应答函数
void IIC_ack_acc()
{
_nop_();
_nop_();
sda=1;//8位数据发送完后,准备接收数据
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)
ack=0;
else ack=1;//接收到应答位,ack为1,否则置0
scl=0;
_nop_();
_nop_();
}

在使用上述的子程序时,如果单片机不是12MHz,自己调整啊~~哈哈

2、IIC总线数据传送的模拟子程序

从IIC总线的数据操作中可以看出,出了起始位、停止位、发送应答函数、发送非应答函数、应答检测函数(这里书上把它看作了数据传送的那部分,管他呢~~~呵呵),还有发送一字节数据,接受以字节数据,发送n字节数据,接收n字节数据这几个子程序。



评论


技术专区

关闭