关于MC44BS373CA的I2C与单片机的通信问题
05-08
大家好,有问题想请教大家,在使用80C51单片机IO口模拟I2C总线与调制芯片MC44BS373CA的I2C总线口通信时,出现了问题,单片机接受不到MC44BS373CA的应答信号,下面是调试使用的程序,不知道哪里出现了问题,请大家帮帮忙啊,看看是不是程序出现了错误,不甚感激哦!
#include<reg51.h>
#include"intrins.h"
#define false 0
#define ture 1
sbit sda=P1^2; //数据
sbit scl=P1^3; //时钟
bit ack; //应答信号
//************************************************************************//
// 延时子程序 //
//**********************************************************************//
void delay(int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<y;j++);
}
}
//************************************************************************//
// i2c开始信号 //
//**********************************************************************//
void i2c_start()
{
sda=1;
scl=1;
delay(2,2);
sda=0;
delay(2,2); //i2c初始化
scl=0;
_nop_(); //准备发送数据
}
//********************************************************************//
// i2c结束信号 //
//******************************************************************//
void i2c_stop()
{
scl=0;
sda=0;
delay(2,2);
scl=1
delay(2,2);
sda=1;
delay(2,2);
}
//********************************************************************//
// i2c接收应答信号 //
//******************************************************************//
bit i2c_ack()
{
unsigned char error=255;
sda=1;
delay(2,2);
scl=1;
delay(2,2);
while(sda)
{
error=error-1;
if(error<=0)
{
i2c_stop();
return(false);
}
}
scl=0;
_nop_();
return (ture);
}
//********************************************************************//
// i2c发送8字节 //
//******************************************************************//
void i2c_sendbyte(unsigned char x)
{
unsigned char i;
for(i=0;i<8;i++)
{
scl=0;
if((x<<i)&0x80) sda=1; //发送
else sda=0;
_nop_();
_nop_();
scl=1;
delay(2,2);
}
scl=0;
}
//*********************************************************************//
// i2c发送单个字节 //
//*******************************************************************//
unsigned char i2c_send(unsigned char add,c1,c0,fm,fl)
{
i2c_start();
i2c_sendbyte(add); //发送x
ack=i2c_ack();
if(ack)
{i2c_sendbyte(c1);
ack=i2c_ack();
if(ack){i2c_sendbyte(c0);
ack=i2c_ack();
if(ack){i2c_sendbyte(fm);
ack=i2c_ack();
if(ack){i2c_sendbyte(fl);
ack=i2c_ack();
if(ack){i2c_stop();return (1); }
else return(0);
}
else return(0);
}
else return(0);
}
else return(0);
}
else return(0);
}
//********************************************************************//
// 主函数 //
//******************************************************************//
void main()
{
unsigned char result=1;
result=i2c_send(0xCA,0x80,0x18,fm,fl);
if(result==0)
{ result=i2c_send(0xCA,0x80,0x18,fm,fl);
}
}
#include<reg51.h>
#include"intrins.h"
#define false 0
#define ture 1
sbit sda=P1^2; //数据
sbit scl=P1^3; //时钟
bit ack; //应答信号
//************************************************************************//
// 延时子程序 //
//**********************************************************************//
void delay(int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<y;j++);
}
}
//************************************************************************//
// i2c开始信号 //
//**********************************************************************//
void i2c_start()
{
sda=1;
scl=1;
delay(2,2);
sda=0;
delay(2,2); //i2c初始化
scl=0;
_nop_(); //准备发送数据
}
//********************************************************************//
// i2c结束信号 //
//******************************************************************//
void i2c_stop()
{
scl=0;
sda=0;
delay(2,2);
scl=1
delay(2,2);
sda=1;
delay(2,2);
}
//********************************************************************//
// i2c接收应答信号 //
//******************************************************************//
bit i2c_ack()
{
unsigned char error=255;
sda=1;
delay(2,2);
scl=1;
delay(2,2);
while(sda)
{
error=error-1;
if(error<=0)
{
i2c_stop();
return(false);
}
}
scl=0;
_nop_();
return (ture);
}
//********************************************************************//
// i2c发送8字节 //
//******************************************************************//
void i2c_sendbyte(unsigned char x)
{
unsigned char i;
for(i=0;i<8;i++)
{
scl=0;
if((x<<i)&0x80) sda=1; //发送
else sda=0;
_nop_();
_nop_();
scl=1;
delay(2,2);
}
scl=0;
}
//*********************************************************************//
// i2c发送单个字节 //
//*******************************************************************//
unsigned char i2c_send(unsigned char add,c1,c0,fm,fl)
{
i2c_start();
i2c_sendbyte(add); //发送x
ack=i2c_ack();
if(ack)
{i2c_sendbyte(c1);
ack=i2c_ack();
if(ack){i2c_sendbyte(c0);
ack=i2c_ack();
if(ack){i2c_sendbyte(fm);
ack=i2c_ack();
if(ack){i2c_sendbyte(fl);
ack=i2c_ack();
if(ack){i2c_stop();return (1); }
else return(0);
}
else return(0);
}
else return(0);
}
else return(0);
}
else return(0);
}
//********************************************************************//
// 主函数 //
//******************************************************************//
void main()
{
unsigned char result=1;
result=i2c_send(0xCA,0x80,0x18,fm,fl);
if(result==0)
{ result=i2c_send(0xCA,0x80,0x18,fm,fl);
}
}
相关程序 http://catv888.taobao.com
QQ: 306099455
相关文章:
- 不错哟:单片机开发经验看这里(05-08)
- 不可缺的功能 单片机复位电路大集合(05-08)
- 国内外常用单片机芯片简介(05-08)
- 单片机编程知识的10个问题(05-08)
- 在模数混合电路中的布地应注意什么,我的是普通单片机和音频电路(05-08)
- 8位单片机的无线时代和无线时代的8051单片机(05-08)
射频专业培训教程推荐