永发信息网

一个关于I2C总线传输的单片机程序

答案:1  悬赏:70  手机版
解决时间 2021-02-19 15:46
  • 提问者网友:听门外雪花风
  • 2021-02-19 00:37
程序如下,串口总断输入5个字节,然后存b[2]在 24c04中,然后再读出来返回给串口输出。 串口传输完全没有问题,I2C的基本程序是从别的地方拷过来的,但是发现,不论怎么改输入,I2C返回的永远是
00。求改程序
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,b[]={0,0,0,0,0},l,s[]={0,0},x[]={0},m,n;
sbit led1=P3^4;
sbit led2=P1^5;
sbit led3=P3^7;
sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;

void I2C_Delay10us()
{
uchar a, b;
for(b=1; b>0; b--)
{
for(a=2; a>0; a--);
}
}
void I2C_Start()
{
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
I2C_SDA = 0;
I2C_Delay10us();//保持时间是>4us
I2C_SCL = 0;
I2C_Delay10us();
}
/
void I2C_Stop()
{
I2C_SDA = 0;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间大于4.7us
I2C_SDA = 1;
I2C_Delay10us();
}

uchar I2C_SendByte(uchar dat, uchar ack)
{
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。

for(a=0; a<8; a++)//要发送8位,从最高位开始
{
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
dat = dat << 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间>4.7us
I2C_SCL = 0;
I2C_Delay10us();//时间大于4us
}
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
{
b++;
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
{
I2C_SCL = 0;
I2C_Delay10us();
return 0;
}
}
I2C_SCL = 0;
I2C_Delay10us();
return 1;
}
uchar I2C_ReadByte()
{
uchar a = 0,dat = 0;
I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0
I2C_Delay10us();
for(a=0; a<8; a++)//接收8个字节
{
I2C_SCL = 1;
I2C_Delay10us();
dat <<= 1;
dat |= I2C_SDA;
I2C_Delay10us();
I2C_SCL = 0;
I2C_Delay10us();
}
return dat;
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2C_Start();
I2C_SendByte(0xa0, 1);//发送写器件地址
I2C_SendByte(addr, 1);//发送要写入内存地址
I2C_SendByte(dat, 0); //发送数据
I2C_Stop();
}
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2C_Start();
I2C_SendByte(0xa0, 1);
I2C_SendByte(addr, 1);
I2C_Start();
I2C_SendByte(0xa1, 1);
num=I2C_ReadByte();
I2C_Stop();
return num;
}

void init()
{
SCON=0x50;
PCON=0x80;
TMOD=0x20;
TH1=0xff;
TL1=0xff;
TR1=1;
EA=1;
ES=1;
}
void main ()
{
init();
while(1)
{
if(flag==1)
{
EA=0;
n=b[2];
At24c02Write(2,n);
I2C_Delay10us();
m=At24c02Read(2);
SBUF=m;
while(!TI) ;
后面是串口中断部分和,重置flag和开EA等,应该没问题字数原因就不写了
最佳答案
  • 五星知识达人网友:纵马山川剑自提
  • 2021-02-19 02:02
没有KEIL51的安装 运行不了 粗略看了一下 发现 你的你的中断寄存器IE -》ET 没有设置 你把他设置一下在看看 要是不行下午在问吧 吃饭了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯