当前位置:文档之家› 51单片机常用子程序汇总

51单片机常用子程序汇总

1、
/***************************************************************
模块功能:通过串口连续发送n个字节的数据
参数说明:
s:待发送数据的首地址
n:要发送数据的字节数
***************************************************************/
}
2、I
(1)启动总线函数
/***************************************************************
模块功能:发送I2C总线起始条件
***************************************************************/
voidSendD(unsigned char *s,unsignedchar n)
{
unsigned charunX;
if(n>0)
{
ES=0; //关闭串口中断
for(unX=0;unX<n;unX++)
{
SBUF=*s;
while(TI==0);
TI=0;
s++;
}
ES=1; //开串口中断
}
retc=retc<<1;
if(SDA==1)retc=retc+1;
Nop();
Nop();
}
SCL=0;
Nop();
Nop();
return(retc);
}
***************************************************************/
void Stop_I2c()
{
SDA=0;
Nop();
SCL=1;
Nop();
Nop();
Nop();
Nop();
Nop();
SDA=1;
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=0;
}
Nop();
Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位Nop();来自Nop();SCL=1;
Nop();
Nop();
Nop();
if(SDA==1) ACK=0;
else ACK=1;
SCL=0;
Nop();
Nop();
Nop();
SDA=0;
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=0;//钳住I2C总线,准备发送或接受数据
Nop();
Nop();
}

/***************************************************************
模块功能:发送I2C总线结束条件
unsigned charRcvB()
{
unsigned charunX,retc;
retc=0;
SDA=1;//置数据线为输入模式
for(unX=0;unX<8;unX++)//传送数据
{
Nop();
SCL=0;
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=1;
Nop();
Nop();
}
(4)
/***************************************************************
模块功能:用来接收从器件传来的数据(1个字节)
***************************************************************/
Nop();
}
(3)字节数据传送函数
/***************************************************************
模块功能:将字节c发送出去,可以是地址或数据,发送完后等待应答,并对此状态位进行操作,发送数据正常ACK=1;否则ACK=0;
***************************************************************/
#include<reg51.h>
#include<intrins.h>
#defineNop() _nop_()//空指令
sbitSDA=P1^3;
sbitSCL=P1^2;
bit ACK;
void Start_I2c()
{
SDA=1;
Nop();
SCL=1;
Nop();
Nop();
Nop();
Nop();
voidSendB(unsigned char c)
{
unsigned charunY;
for(unY=0;unY<8;unY++)//传送数据
{
if((c<<unY)&0x80) SDA=1; //发送位
else SDA=0;
Nop();
SCL=1;//置时钟位为1,通知被控器件开始接受数据位
Nop();
相关主题