永发信息网

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

答案:1  悬赏:70  手机版
解决时间 2021-02-19 15:46
程序如下,串口总断输入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等,应该没问题字数原因就不写了
最佳答案
没有KEIL51的安装 运行不了 粗略看了一下 发现 你的你的中断寄存器IE -》ET 没有设置 你把他设置一下在看看 要是不行下午在问吧 吃饭了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
女生修剪阴毛应该到哪里去
法曼朵蛋糕(聚鑫综合店)怎么去啊,有知道地址
为什么现在的官员大都信佛
古长城有多少个大关口?(主要、知名的)
河坝加油站地址在什么地方,想过去办事,
喝 劲酒有哪些好处和坏处
下列各项中,属于财政部门为加强会计职业道德
佩琪地址有知道的么?有点事想过去
65Mn与SUS302材料哪个单价高
悦尔来兮是什么意思
一九九二年九月初三出生的生辰八字
已知点P(sinα-cosα,tanα)在第一象限,
12.5*0.32*0.5 3.2*2.4+32*0.76 简便运算
梦见我在路上捡到许多次一元钱
中兴苑北门地址在什么地方,想过去办事
推荐资讯
玉和钰哪个字取名好
想入手一个铁三角ATH-ad2000x,需要配声卡吗
建筑工地上的《三宝》指的是哪三宝?
跪求一个CF游戏名字 战队名字是_征服☆No.1
杭州中维歌德大酒店地址在什么地方,想过去办
小孩子和妈妈说爸爸说妈妈不喜欢她不爱她是什
烟波健康休闲中心地址在哪,我要去那里办事
有没有只要主角名字就知道书名的小说阅读器
如何办理东方航空的会员
加拿大采矿工程好就业还是石油工程?采矿专业
一个excle中一列为阿拉伯数字12345等.,一列
有哪几期的快乐大本营有播过spexial的歌?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?