Username: Password:

在51上用P1口模拟I2C
来源:

下面是用普通C51实现的I2C基本电平模拟函数和通用函数。 

/* 电平模拟函数和基本读写函数 
void IIC_Start(void); 
void IIC_Stop(void); 
void SEND_0(void); 
void SEND_1(void); 
bit Check_Acknowledge(void); 
void Write_Byte(uchar b)reentrant; 
bit Write_N_Bytes(uchar *buffer uchar n)reentrant; 
bit Read_N_Bytes(uchar SlaveAdr uchar n uchar *buffer); 
uchar Read_Byte(void)reentrant; 
*/ 

#include 
#include 
#include 
#include"aiic_51.h" 

sbit SCL=P1^6; 
sbit SDA=P1^7; 

void DELAY(uint t) 

while(t!=0) 
t--; 


void IIC_Start(void) 

//启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变 
SDA=1; 
SCL=1; 
DELAY(DELAY_TIME); 
SDA=0; 
DELAY(DELAY_TIME); 
SCL=0; 
DELAY(DELAY_TIME); 


void IIC_Stop(void) 

//终止I2C总线,当SCL为高电平时使SDA产生一个正跳变 
SDA=0; 
SCL=1; 
DELAY(DELAY_TIME); 
SDA=1; 
DELAY(DELAY_TIME); 
SCL=0; 
DELAY(DELAY_TIME); 


void SEND_0(void) 

//发送0,在SCL为高电平时使SDA信号为低 
SDA=0; 
SCL=1; 
DELAY(DELAY_TIME); 
SCL=0; 
DELAY(DELAY_TIME); 


void SEND_1(void) 

//发送1,在SCL为高电平时使SDA信号为高 
SDA=1; 
SCL=1; 
DELAY(DELAY_TIME); 
SCL=0; 
DELAY(DELAY_TIME); 


bit Check_Acknowledge(void) 

//发送完一个字节后检验设备的应答信号 
SDA=1; 
SCL=1; 
DELAY(DELAY_TIME/2); 
F0=SDA; 
DELAY(DELAY_TIME/2); 
SCL=0; 
DELAY(DELAY_TIME); 
if(F0==1) 
return FALSE; 
return TRUE; 


void Write_Byte(uchar b)reentrant 

//向IIC总线写一个字节 
uchar i; 
for(i=0;i<8;i++) 
if((b<SEND_1(); 
else 
SEND_0(); 


bit Write_N_Bytes(uchar *buffer uchar n)reentrant 

//向I2C总线写n个字节 
uchar i; 
IIC_Start(); 

for(i=0;i
Write_Byte(buffer[i]); 
if(!Check_Acknowledge()) 

IIC_Stop(); 
return(i==n); 



IIC_Stop(); 
return TRUE; 


uchar Read_Byte(void)reentrant 

//从I2C总线读一个字节 
uchar b=0 i; 
for(i=0;i<8;i++) 

SDA=1; //释放总线 
SCL=1; //接受数据 
DELAY(10); 
F0=SDA; 
DELAY(10); 
SCL=0; 
if(F0==1) 

b=b<<1; 
b=b|0x01; 

else 
b=b<<1; 

return b; 


bit Read_N_Bytes(uchar SlaveAdr uchar n uchar *buffer) 

//从I2C总线读n个字节 
uchar i; 
IIC_Start(); 
Write_Byte(SlaveAdr); //向总线发送接收器地址 
if(!Check_Acknowledge()) //等待接收器应答信号 
return FALSE; 
for(i=0;i
buffer[i]=Read_Byte(); 
if(i!=n) 
SEND_0(); //发送应答 
else 
SEND_1(); //发送非应答 

IIC_Stop(); 
return TRUE; 




使用上述代码,您能够在51上用P1口模拟I2C。

 

来源:中国电子技术信息网

(出处:赛尔电子技术中央)



喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅