51单片机I2C标准函数程序 

#include<REG52.h> 
#include<intrins.h> 
#include<stdio.h> 
 typedef unsigned char uchar;
 typedef unsigned int uint;
 sbit SDA=P1^1;
 sbit SCL=P1^0;
 //===================================================== ========================= 
void Start()//开始信号 
{
 SDA=1;
 SCL=1;
 _nop_();
 _nop_();
 SDA=0;
 _nop_();
 _nop_();
 SCL=0;
 } 
/************************************************************ ******************/ 
void Stop() //停止信号 
{
 SDA=0;
 SCL=1;
 _nop_();
 _nop_();
 SDA=1;
 _nop_();
 _nop_();
 SDA=0;
 SCL=0;
 } 
/************************************************************ ******************/ 
void Ack()//应答信号
{
 SDA=0;
 SCL=1;
 _nop_();
 _nop_();
 SCL=0;
 SDA=1;
 } 
/************************************************************ ******************/ 
void NoAck() //非应答信号 
{
 SDA=1;
 SCL=1;
 _nop_();
 _nop_();
 SCL=0;
 SDA=0;
 } 
/************************************************************ ******************/ 
bit TestACk()//检查应答信号 
{
 bit Cack=0;
 SDA=1;
 SCL=1;
 Cack=SDA;
 SCL=0;
 return(Cack);
 } 
/************************************************************ ******************/ 
void WriteByte(uchar input)//向 I2C 从设备中写入 1 字节 
{
 uchar i;
 for(i=8;i!=0;i--) 
 {
 SDA=(bit)(inupt&0x80);
 SCL=1;
 _nop_();
 _nop_();
 SCL=0;
 input=input<<1;
 }
} 
/************************************************************ ******************/ 
/*向有内部地址的器件写入多字节,
ads 为器件地址,
sads 为器件内部 地址,
指针 wp 指向要 发送的字节,
no 为字节数。
发送成功返回 1,
失败返回 0。*/ 
bit Write_nB_sads(uchar ads,uchar sads,uchar *wp,uchar no) 
{
 uchar i;
 BEGIN: Start();
 WriteByte(ads);
 if(TestAck()) goto BEGIN;
 WriteByte(sads);
 if(TestAck()) goto BEGIN;
 for(i=0;i<no;i++) 
 {
 WriteByte(*wp);
 if(TestAck()) goto BEGIN;
 wp++;
 }
 Stop();
 return(1);
} 
/************************************************************ ******************/ 
uchar ReadByte()//从 I2C 从设备中读出 1 字节 
{
 uchar i;
 rbyte=0;
 SDA=1;
 for(i=8;i!=0;i--) 
 {
 //释放总线 
 //发送数据 
 //发送器件分地址 
 //启动总线 
 //发送器件地址
 SCL=1;
 rbyte=rbyte<<1;
 rbyte=rbyte|((uchar)(SDA));
 SCL=0;
 }
 return(rbyte);
} 
/************************************************************ ******************/ 
/*向有内部地址的器件写入多字节,ads 为器件地址,sads 为器件内部 地址,读出的数据存在 指针 rp 指向的内存空间,no 为字节数。读出成功返回 1,失败返回 0。 */
bit Read_nB_sads(uchar ads,uchar sads,uchar *rp,uchar no) 
{
 uchar i;
 BEGIN: Start();
 WriteByte(ads);
 if(TestAck()) goto BEGIN;
 WriteByte(sads);
 if(TestAck()) goto BEGIN;
 Start();
 WriteByte(ads+1);
 if(TestAck()) goto BEGIN;
 for(i=0;i<no;i++) 
 {
 *rp=ReadByte();
 Ack();
 rp++;
 }
 *rp=ReadByte();
 NoAck();
 Stop();
 //发送非应答位
 //释放总线
 //发送应答位
 //启动
 //发送器件分地址
 //启动总线
 //发送器件地址 
 return(1);
} 
void main() 
{
}
声明:本文采用 BY-NC-SA 协议进行授权,本文链接:51单片机I2C标准函数程序 

发表评论