这是一个单片机I2C的程序,麻烦高手帮忙指点下;为什么有时显示不行呢,虽然概率很低,要隔很长

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:56:00
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0; //定义数据总线;
sbit scl=P2^1; //定义时钟总线;
void delay()
{ ;; } //延迟5毫秒左右;
void start() //启动
{
sda=1;
delay();
scl=1; //在时钟信号为高时,数据总线一个低电位,启动;
delay();
sda=0;
delay();
}
void stop()
{ //停止信号在时钟信号为高时,数据总线一个高跳变;
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

void write_byte(uchar date) //写数据;
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //一位一位的写,每写一个字都是在一个时钟信号里,
scl=0;
delay(); //只有时钟为低时,才能进行数据的写;
sda=CY; //变量的高位溢出时,自动存入CY中;
delay();
scl=1;
delay();
}
scl=0; //要想改变SDA的电平,就必须先把SCL拉低;
delay();
sda=1;
delay();
}
void respons() //应答;
{
uchar i=0;
scl=1;

1、可能延时时间不够,器件读写速度慢,跟不上。

void delay()
{ ;; } //延迟5毫秒左右;

你用多少的晶振?12M的晶振标准51核,只能延时2个微秒。

2、write_byte(0xaa);
respons();
像这种写入数据的操作需要时间比较长,你的等待时间可能不够。查看你器件的datasheet,看它的写入时间需要多久。

3、拿示波器看一下你IIC总线的波形的上升时间和下降时间能不能满足IIC规范的要求。

4、嵌入式系统从稳定性考虑,最好对每个函数的操作成功与否进行判断,系统要对错误的情况进行处理。比如楼主的respons();函数,比较好的一种处理方式是:如果等待超时,那么返回错误码,由上层函数决定如何处理错误。重发or放弃,等等。 楼主刚刚开始学习不必要深究,可以思考下这方面的问题。

搜索关键字:“IIC源码 开发包” 就能找到标准的IIC驱动程序

因为它是已经成熟且经过几次升级改版的代码,再自己去写就有点多余了...

void delay()
{ ;; } //延迟5毫秒左右;

这个延时太短了

void write_byte(uchar date) //写数据;
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{

scl=0;
delay(); //
sda=CY; //这里不对,应该改下
delay();
scl=1;
delay();
temp=temp<<1;
}

sda=(bit)(temp&0x80);